killbill-memoizeit

Details

diff --git a/util/src/main/java/org/killbill/billing/util/export/dao/CSVExportOutputStream.java b/util/src/main/java/org/killbill/billing/util/export/dao/CSVExportOutputStream.java
index 2b0d14c..1c9d69e 100644
--- a/util/src/main/java/org/killbill/billing/util/export/dao/CSVExportOutputStream.java
+++ b/util/src/main/java/org/killbill/billing/util/export/dao/CSVExportOutputStream.java
@@ -30,7 +30,8 @@ import com.fasterxml.jackson.dataformat.csv.CsvMapper;
 import com.fasterxml.jackson.dataformat.csv.CsvSchema;
 import com.fasterxml.jackson.dataformat.csv.CsvSchema.ColumnType;
 
-public class CSVExportOutputStream extends OutputStream implements DatabaseExportOutputStream {
+public class
+CSVExportOutputStream extends OutputStream implements DatabaseExportOutputStream {
 
     private static final CsvMapper mapper = new CsvMapper();
 
@@ -63,6 +64,8 @@ public class CSVExportOutputStream extends OutputStream implements DatabaseExpor
         currentTableName = tableName;
 
         final CsvSchema.Builder builder = CsvSchema.builder();
+        builder.disableQuoteChar();
+
         for (final ColumnInfo columnInfo : columnsForTable) {
             builder.addColumn(columnInfo.getColumnName(), getColumnTypeFromSqlType(columnInfo.getDataType()));
         }
diff --git a/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java b/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java
index 7343dbf..1f37627 100644
--- a/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java
+++ b/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java
@@ -23,17 +23,16 @@ import java.util.Map;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.skife.jdbi.v2.Handle;
-import org.skife.jdbi.v2.IDBI;
-import org.skife.jdbi.v2.ResultIterator;
-import org.skife.jdbi.v2.tweak.HandleCallback;
-
+import org.killbill.billing.callcontext.InternalTenantContext;
 import org.killbill.billing.util.api.ColumnInfo;
 import org.killbill.billing.util.api.DatabaseExportOutputStream;
-import org.killbill.billing.callcontext.InternalTenantContext;
 import org.killbill.billing.util.dao.TableName;
 import org.killbill.billing.util.validation.DefaultColumnInfo;
 import org.killbill.billing.util.validation.dao.DatabaseSchemaDao;
+import org.skife.jdbi.v2.Handle;
+import org.skife.jdbi.v2.IDBI;
+import org.skife.jdbi.v2.ResultIterator;
+import org.skife.jdbi.v2.tweak.HandleCallback;
 
 @Singleton
 public class DatabaseExportDao {
@@ -48,6 +47,35 @@ public class DatabaseExportDao {
         this.dbi = dbi;
     }
 
+    private enum TableType {
+        /* TableName.ACCOUNT */
+        KB_ACCOUNT("record_id", "tenant_record_id"),
+        /* TableName.ACCOUNT_HISTORY */
+        KB_ACCOUNT_HISTORY("target_record_id", "tenant_record_id"),
+        /* Any per-account data table */
+        KB_PER_ACCOUNT("account_record_id", "tenant_record_id"),
+        /* bus_events, notifications table */
+        NOTIFICATION("search_key1", "search_key2"),
+        /* To be discarded */
+        OTHER(null, null);
+
+        private final String accountRecordIdColumnName;
+        private final String tenantRecordIdColumnName;
+
+        TableType(final String accountRecordIdColumnName, final String tenantRecordIdColumnName) {
+            this.accountRecordIdColumnName = accountRecordIdColumnName;
+            this.tenantRecordIdColumnName = tenantRecordIdColumnName;
+        }
+
+        public String getAccountRecordIdColumnName() {
+            return accountRecordIdColumnName;
+        }
+
+        public String getTenantRecordIdColumnName() {
+            return tenantRecordIdColumnName;
+        }
+    }
+
     public void exportDataForAccount(final DatabaseExportOutputStream out, final InternalTenantContext context) {
         if (context.getAccountRecordId() == null || context.getTenantRecordId() == null) {
             return;
@@ -72,8 +100,19 @@ public class DatabaseExportDao {
         exportDataForAccountAndTable(out, columnsForTable, context);
     }
 
+
     private void exportDataForAccountAndTable(final DatabaseExportOutputStream out, final List<ColumnInfo> columnsForTable, final InternalTenantContext context) {
-        boolean hasAccountRecordIdColumn = false;
+
+
+        TableType tableType = TableType.OTHER;
+        final String tableName = columnsForTable.get(0).getTableName();
+
+        if (TableName.ACCOUNT.getTableName().equals(tableName)) {
+            tableType = TableType.KB_ACCOUNT;
+        } else if (TableName.ACCOUNT_HISTORY.getTableName().equals(tableName)) {
+            tableType = TableType.KB_ACCOUNT_HISTORY;
+        }
+
         boolean firstColumn = true;
         final StringBuilder queryBuilder = new StringBuilder("select ");
         for (final ColumnInfo column : columnsForTable) {
@@ -84,27 +123,29 @@ public class DatabaseExportDao {
             }
 
             queryBuilder.append(column.getColumnName());
-            if (column.getColumnName().equals("account_record_id")) {
-                hasAccountRecordIdColumn = true;
+
+            if (tableType == TableType.OTHER) {
+                if (column.getColumnName().equals(TableType.KB_PER_ACCOUNT.getAccountRecordIdColumnName())) {
+                    tableType = TableType.KB_PER_ACCOUNT;
+                } else if (column.getColumnName().equals(TableType.NOTIFICATION.getAccountRecordIdColumnName())) {
+                    tableType = TableType.NOTIFICATION;
+                }
             }
         }
 
-        final String tableName = columnsForTable.get(0).getTableName();
-        final boolean isAccountTable = TableName.ACCOUNT.getTableName().equals(tableName);
-
         // Don't export non-account specific tables
-        if (!isAccountTable && !hasAccountRecordIdColumn) {
+        if (tableType == TableType.OTHER) {
             return;
         }
 
         // Build the query - make sure to filter by account and tenant!
         queryBuilder.append(" from ")
-                    .append(tableName);
-        if (isAccountTable) {
-            queryBuilder.append(" where record_id = :accountRecordId and tenant_record_id = :tenantRecordId");
-        } else {
-            queryBuilder.append(" where account_record_id = :accountRecordId and tenant_record_id = :tenantRecordId");
-        }
+                    .append(tableName)
+                    .append(" where ")
+                    .append(tableType.getAccountRecordIdColumnName())
+                    .append(" = :accountRecordId and ")
+                    .append(tableType.getTenantRecordIdColumnName())
+                    .append("  = :tenantRecordId");
 
         // Notify the stream that we're about to write data for a different table
         out.newTable(tableName, columnsForTable);
@@ -124,7 +165,6 @@ public class DatabaseExportDao {
                 } finally {
                     iterator.close();
                 }
-
                 return null;
             }
         });
diff --git a/util/src/test/java/org/killbill/billing/util/export/dao/TestDatabaseExportDao.java b/util/src/test/java/org/killbill/billing/util/export/dao/TestDatabaseExportDao.java
index 855320f..a4ffe97 100644
--- a/util/src/test/java/org/killbill/billing/util/export/dao/TestDatabaseExportDao.java
+++ b/util/src/test/java/org/killbill/billing/util/export/dao/TestDatabaseExportDao.java
@@ -81,12 +81,13 @@ public class TestDatabaseExportDao extends UtilTestSuiteWithEmbeddedDB {
         // Verify new dump
         final String newDump = getDump();
         Assert.assertEquals(newDump, "-- accounts record_id,id,external_key,email,name,first_name_length,currency,billing_cycle_day_local,payment_method_id,time_zone,locale,address1,address2,company_name,city,state_or_province,country,postal_code,phone,migrated,is_notified_for_invoices,created_date,created_by,updated_date,updated_by,tenant_record_id\n" +
-                                     String.format("%s,\"%s\",,%s,%s,%s,,,,,,,,,,,,,,false,%s,\"%s\",%s,\"%s\",%s,%s", internalCallContext.getAccountRecordId(), accountId, accountEmail, accountName, firstNameLength,
+                                     String.format("%s,%s,,%s,%s,%s,,,,,,,,,,,,,,false,%s,%s,%s,%s,%s,%s", internalCallContext.getAccountRecordId(), accountId, accountEmail, accountName, firstNameLength,
                                                    isNotifiedForInvoices, "1970-05-24T18:33:02.000+0000", createdBy, "1982-02-18T20:03:42.000+0000", updatedBy, internalCallContext.getTenantRecordId()) + "\n" +
                                      "-- " + tableNameA + " record_id,a_column,account_record_id,tenant_record_id\n" +
                                      "1,a," + internalCallContext.getAccountRecordId() + "," + internalCallContext.getTenantRecordId() + "\n" +
                                      "-- " + tableNameB + " record_id,b_column,account_record_id,tenant_record_id\n" +
                                      "1,b," + internalCallContext.getAccountRecordId() + "," + internalCallContext.getTenantRecordId() + "\n");
+
     }
 
     private String getDump() {