Skip to content

Commit d47c202

Browse files
committed
Move CSV NULL value to constant
1 parent 66f3506 commit d47c202

File tree

5 files changed

+22
-7
lines changed

5 files changed

+22
-7
lines changed

data-loader/core/src/main/java/com/scalar/db/dataloader/core/Constants.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,12 @@ public class Constants {
1616
*/
1717
public static final String ABORT_TRANSACTION_STATUS =
1818
"Transaction aborted as part of batch transaction aborted";
19+
/**
20+
* Special null value representation used for TEXT data type columns in CSV files.
21+
*
22+
* <p>This value is used to distinguish between an empty string and a null value in CSV exports
23+
* and imports. When exporting, null TEXT values are converted to this string. When importing,
24+
* this string is converted back to null for TEXT columns.
25+
*/
26+
public static final String CSV_TEXT_NULL_VALUE = "\\N";
1927
}

data-loader/core/src/main/java/com/scalar/db/dataloader/core/dataexport/producer/CsvProducerTask.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.scalar.db.api.Result;
44
import com.scalar.db.api.TableMetadata;
5+
import com.scalar.db.dataloader.core.Constants;
56
import com.scalar.db.dataloader.core.DataLoaderError;
67
import com.scalar.db.dataloader.core.util.CsvUtil;
78
import com.scalar.db.dataloader.core.util.DecimalUtil;
@@ -118,10 +119,10 @@ private String convertResultToCsv(Result result) {
118119
*/
119120
private String convertToString(Result result, String columnName, DataType dataType) {
120121
if (result.isNull(columnName)) {
121-
// "\N" is added when a column of text data type has null value. This is only converted for
122-
// CSV files
122+
// Special null value is added when a column of text data type has null value. This is only
123+
// converted for CSV files
123124
if (dataType.equals(DataType.TEXT)) {
124-
return "\\N";
125+
return Constants.CSV_TEXT_NULL_VALUE;
125126
}
126127
return null;
127128
}

data-loader/core/src/main/java/com/scalar/db/dataloader/core/util/ColumnUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.scalar.db.api.Result;
55
import com.scalar.db.api.TableMetadata;
66
import com.scalar.db.dataloader.core.ColumnInfo;
7+
import com.scalar.db.dataloader.core.Constants;
78
import com.scalar.db.dataloader.core.DataLoaderError;
89
import com.scalar.db.dataloader.core.exception.Base64Exception;
910
import com.scalar.db.dataloader.core.exception.ColumnParsingException;
@@ -85,7 +86,7 @@ public static Column<?> createColumnFromValue(
8586
String columnName = columnInfo.getColumnName();
8687
if (value != null) {
8788
if (dataType.equals(DataType.TEXT)) {
88-
if ("\\N".equals(value)) {
89+
if (Constants.CSV_TEXT_NULL_VALUE.equals(value)) {
8990
value = null;
9091
}
9192
} else if (value.equalsIgnoreCase("null")) {

data-loader/core/src/test/java/com/scalar/db/dataloader/core/dataexport/producer/CsvProducerTaskTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.scalar.db.api.Result;
44
import com.scalar.db.api.TableMetadata;
55
import com.scalar.db.common.ResultImpl;
6+
import com.scalar.db.dataloader.core.Constants;
67
import com.scalar.db.dataloader.core.UnitTestUtils;
78
import com.scalar.db.io.Column;
89
import com.scalar.db.io.DataType;
@@ -122,7 +123,9 @@ void process_withValidResultList_withPartialProjectionsAndMetadata_shouldReturnV
122123
void
123124
process_withValidResultListWithTextFieldWithNullValue_shouldReturnValidCsvStringWithCustomNullValueForTextField() {
124125
String expectedOutput =
125-
"9007199254740992,2147483647,true,0.000000000000000000000000000000000000000000001401298464324817,0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049,\\N,YmxvYiB0ZXN0IHZhbHVl,2000-01-01,01:01:01,2000-01-01T01:01,1970-01-21T03:20:41.740Z,0.000000000000000000000000000000000000000000001401298464324817,0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049,test value,YmxvYiB0ZXN0IHZhbHVl,txt value 464654654,2147483647,2147483647,9007199254740992,9007199254740992,test value,2147483647,2147483647,9007199254740992,9007199254740992";
126+
"9007199254740992,2147483647,true,0.000000000000000000000000000000000000000000001401298464324817,0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049,"
127+
+ Constants.CSV_TEXT_NULL_VALUE
128+
+ ",YmxvYiB0ZXN0IHZhbHVl,2000-01-01,01:01:01,2000-01-01T01:01,1970-01-21T03:20:41.740Z,0.000000000000000000000000000000000000000000001401298464324817,0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049,test value,YmxvYiB0ZXN0IHZhbHVl,txt value 464654654,2147483647,2147483647,9007199254740992,9007199254740992,test value,2147483647,2147483647,9007199254740992,9007199254740992";
126129
Map<String, Column<?>> values = UnitTestUtils.createTestValues();
127130
String textColName = "col6";
128131
Column<?> col = values.get(textColName);

data-loader/core/src/test/java/com/scalar/db/dataloader/core/util/ColumnUtilsTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.scalar.db.api.TableMetadata;
99
import com.scalar.db.common.ResultImpl;
1010
import com.scalar.db.dataloader.core.ColumnInfo;
11+
import com.scalar.db.dataloader.core.Constants;
1112
import com.scalar.db.dataloader.core.DataLoaderError;
1213
import com.scalar.db.dataloader.core.UnitTestUtils;
1314
import com.scalar.db.dataloader.core.exception.Base64Exception;
@@ -311,7 +312,7 @@ void createColumnFromValue_valueIsNullString_shouldRemainLiteralForTextType()
311312
}
312313

313314
/**
314-
* Tests that when the string value has custom null value "/N" is provided for TEXT columns, it is
315+
* Tests that when the string value has custom null value is provided for TEXT columns, it is
315316
* treated as an actual null value
316317
*/
317318
@Test
@@ -320,7 +321,8 @@ void createColumnFromValue_customNullValueForText_shouldBeConvertedToNull()
320321
String columnName = "textColumn";
321322
ColumnInfo columnInfo = ColumnInfo.builder().columnName(columnName).build();
322323

323-
Column<?> textCol = ColumnUtils.createColumnFromValue(DataType.TEXT, columnInfo, "\\N");
324+
Column<?> textCol =
325+
ColumnUtils.createColumnFromValue(DataType.TEXT, columnInfo, Constants.CSV_TEXT_NULL_VALUE);
324326
assertEquals(TextColumn.ofNull(columnName), textCol);
325327
}
326328
}

0 commit comments

Comments
 (0)