Skip to content

Commit a611cf8

Browse files
committed
Added conversion for null text columns for import and export
1 parent 2cf54ec commit a611cf8

File tree

4 files changed

+38
-1
lines changed

4 files changed

+38
-1
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ private String convertResultToCsv(Result result) {
118118
*/
119119
private String convertToString(Result result, String columnName, DataType dataType) {
120120
if (result.isNull(columnName)) {
121+
if (dataType.equals(DataType.TEXT)) {
122+
return "/N";
123+
}
121124
return null;
122125
}
123126
String value = "";

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
@@ -83,7 +83,8 @@ public static Column<?> createColumnFromValue(
8383
DataType dataType, ColumnInfo columnInfo, @Nullable String value)
8484
throws ColumnParsingException {
8585
String columnName = columnInfo.getColumnName();
86-
if (value != null && !dataType.equals(DataType.TEXT) && value.equalsIgnoreCase("null")) {
86+
if (value != null && (!dataType.equals(DataType.TEXT) && value.equalsIgnoreCase("null"))
87+
|| (dataType.equals(DataType.TEXT) && "/N".equals(value))) {
8788
value = null;
8889
}
8990
try {

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.scalar.db.dataloader.core.UnitTestUtils;
77
import com.scalar.db.io.Column;
88
import com.scalar.db.io.DataType;
9+
import com.scalar.db.io.TextColumn;
910
import java.util.ArrayList;
1011
import java.util.Collections;
1112
import java.util.List;
@@ -116,4 +117,22 @@ void process_withValidResultList_withPartialProjectionsAndMetadata_shouldReturnV
116117
String output = csvProducerTask.process(resultList);
117118
Assertions.assertEquals(expectedOutput, output.trim());
118119
}
120+
121+
@Test
122+
void
123+
process_withValidResultListWithTextFieldWithNullValue_shouldReturnValidCsvStringWithCustomNullValueForTextField() {
124+
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+
Map<String, Column<?>> values = UnitTestUtils.createTestValues();
127+
String textColName = "col6";
128+
Column<?> col = values.get(textColName);
129+
if (col instanceof TextColumn) {
130+
values.put(textColName, TextColumn.of(textColName, null));
131+
}
132+
Result result = new ResultImpl(values, mockMetadata);
133+
List<Result> resultList = new ArrayList<>();
134+
resultList.add(result);
135+
String output = csvProducerTask.process(resultList);
136+
Assertions.assertEquals(expectedOutput, output.trim());
137+
}
119138
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,4 +309,18 @@ void createColumnFromValue_valueIsNullString_shouldRemainLiteralForTextType()
309309
textCol = ColumnUtils.createColumnFromValue(DataType.TEXT, columnInfo, "nuLL");
310310
assertEquals(TextColumn.of(columnName, "nuLL"), textCol);
311311
}
312+
313+
/**
314+
* Tests that when the string value custom null value "/n" is provided for TEXT columns, it is
315+
* treated as an actual null value
316+
*/
317+
@Test
318+
void createColumnFromValue_valueIsCustomNullValue_shouldRemainLiteralForTextType()
319+
throws ColumnParsingException {
320+
String columnName = "textColumn";
321+
ColumnInfo columnInfo = ColumnInfo.builder().columnName(columnName).build();
322+
323+
Column<?> textCol = ColumnUtils.createColumnFromValue(DataType.TEXT, columnInfo, "/N");
324+
assertEquals(TextColumn.ofNull(columnName), textCol);
325+
}
312326
}

0 commit comments

Comments
 (0)