Repository: phoenix
Updated Branches:
  refs/heads/4.x-HBase-1.0 be0ccb4c0 -> b06a20c55


PHOENIX-2434 Improve booleans in CSV import

Do not automatically treat any unrecognized input as being false,
but instead fail on it.

Also, recognize 1/0 and t/f as true/false.


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/b06a20c5
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/b06a20c5
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/b06a20c5

Branch: refs/heads/4.x-HBase-1.0
Commit: b06a20c55a61a14ea886f20106bb6a55640742e2
Parents: be0ccb4
Author: Bruno Dumon <br...@ngdata.com>
Authored: Sun Dec 13 16:04:07 2015 +0100
Committer: Gabriel Reid <gabri...@ngdata.com>
Committed: Mon Dec 14 08:42:56 2015 +0100

----------------------------------------------------------------------
 .../phoenix/util/csv/CsvUpsertExecutor.java       | 15 +++++++++++++++
 .../phoenix/util/AbstractUpsertExecutorTest.java  | 18 +++++++++++++-----
 .../phoenix/util/csv/CsvUpsertExecutorTest.java   | 17 +++++++++++++++--
 3 files changed, 43 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/b06a20c5/phoenix-core/src/main/java/org/apache/phoenix/util/csv/CsvUpsertExecutor.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/util/csv/CsvUpsertExecutor.java 
b/phoenix-core/src/main/java/org/apache/phoenix/util/csv/CsvUpsertExecutor.java
index 4a3af21..cddafc6 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/util/csv/CsvUpsertExecutor.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/util/csv/CsvUpsertExecutor.java
@@ -28,6 +28,7 @@ import javax.annotation.Nullable;
 import org.apache.commons.csv.CSVRecord;
 import org.apache.phoenix.query.QueryServices;
 import org.apache.phoenix.query.QueryServicesOptions;
+import org.apache.phoenix.schema.types.PBoolean;
 import org.apache.phoenix.schema.types.PDataType;
 import org.apache.phoenix.schema.types.PTimestamp;
 import org.apache.phoenix.util.ColumnInfo;
@@ -154,6 +155,20 @@ public class CsvUpsertExecutor extends 
UpsertExecutor<CSVRecord, String> {
                 byte[] byteValue = new byte[dataType.getByteSize()];
                 dataType.getCodec().encodeLong(epochTime, byteValue, 0);
                 return dataType.toObject(byteValue);
+            } else if (dataType == PBoolean.INSTANCE) {
+                switch (input.toLowerCase()) {
+                    case "true":
+                    case "t":
+                    case "1":
+                        return Boolean.TRUE;
+                    case "false":
+                    case "f":
+                    case "0":
+                        return Boolean.FALSE;
+                    default:
+                        throw new RuntimeException("Invalid boolean value: '" 
+ input
+                                + "', must be one of 
['true','t','1','false','f','0']");
+                }
             }
             return dataType.toObject(input);
         }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/b06a20c5/phoenix-core/src/test/java/org/apache/phoenix/util/AbstractUpsertExecutorTest.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/test/java/org/apache/phoenix/util/AbstractUpsertExecutorTest.java
 
b/phoenix-core/src/test/java/org/apache/phoenix/util/AbstractUpsertExecutorTest.java
index b614312..61b03fb 100644
--- 
a/phoenix-core/src/test/java/org/apache/phoenix/util/AbstractUpsertExecutorTest.java
+++ 
b/phoenix-core/src/test/java/org/apache/phoenix/util/AbstractUpsertExecutorTest.java
@@ -58,7 +58,8 @@ public abstract class AbstractUpsertExecutorTest<R, F> 
extends BaseConnectionles
                 new ColumnInfo("ID", Types.BIGINT),
                 new ColumnInfo("NAME", Types.VARCHAR),
                 new ColumnInfo("AGE", Types.INTEGER),
-                new ColumnInfo("VALUES", PIntegerArray.INSTANCE.getSqlType()));
+                new ColumnInfo("VALUES", PIntegerArray.INSTANCE.getSqlType()),
+                new ColumnInfo("BEARD", Types.BOOLEAN));
 
         preparedStatement = mock(PreparedStatement.class);
         upsertListener = mock(UpsertExecutor.UpsertListener.class);
@@ -72,7 +73,8 @@ public abstract class AbstractUpsertExecutorTest<R, F> 
extends BaseConnectionles
 
     @Test
     public void testExecute() throws Exception {
-        getUpsertExecutor().execute(createRecord(123L, "NameValue", 42, 
Arrays.asList(1, 2, 3)));
+        getUpsertExecutor().execute(createRecord(123L, "NameValue", 42,
+                Arrays.asList(1, 2, 3), true));
 
         verify(upsertListener).upsertDone(1L);
         verifyNoMoreInteractions(upsertListener);
@@ -81,6 +83,7 @@ public abstract class AbstractUpsertExecutorTest<R, F> 
extends BaseConnectionles
         verify(preparedStatement).setObject(2, "NameValue");
         verify(preparedStatement).setObject(3, Integer.valueOf(42));
         verify(preparedStatement).setObject(4, 
PArrayDataType.instantiatePhoenixArray(PInteger.INSTANCE, new Object[]{1,2,3}));
+        verify(preparedStatement).setObject(5, Boolean.TRUE);
         verify(preparedStatement).execute();
         verifyNoMoreInteractions(preparedStatement);
     }
@@ -96,7 +99,8 @@ public abstract class AbstractUpsertExecutorTest<R, F> 
extends BaseConnectionles
 
     @Test
     public void testExecute_TooManyFields() throws Exception {
-        R recordWithTooManyFields = createRecord(123L, "NameValue", 42, 
Arrays.asList(1, 2, 3), "Garbage");
+        R recordWithTooManyFields = createRecord(123L, "NameValue", 42, 
Arrays.asList(1, 2, 3),
+                true, "Garbage");
         getUpsertExecutor().execute(recordWithTooManyFields);
 
         verify(upsertListener).upsertDone(1L);
@@ -106,13 +110,15 @@ public abstract class AbstractUpsertExecutorTest<R, F> 
extends BaseConnectionles
         verify(preparedStatement).setObject(2, "NameValue");
         verify(preparedStatement).setObject(3, Integer.valueOf(42));
         verify(preparedStatement).setObject(4, 
PArrayDataType.instantiatePhoenixArray(PInteger.INSTANCE, new Object[]{1,2,3}));
+        verify(preparedStatement).setObject(5, Boolean.TRUE);
         verify(preparedStatement).execute();
         verifyNoMoreInteractions(preparedStatement);
     }
 
     @Test
     public void testExecute_NullField() throws Exception {
-        getUpsertExecutor().execute(createRecord(123L, "NameValue", null, 
Arrays.asList(1, 2, 3)));
+        getUpsertExecutor().execute(createRecord(123L, "NameValue", null,
+                Arrays.asList(1, 2, 3), false));
 
         verify(upsertListener).upsertDone(1L);
         verifyNoMoreInteractions(upsertListener);
@@ -121,13 +127,15 @@ public abstract class AbstractUpsertExecutorTest<R, F> 
extends BaseConnectionles
         verify(preparedStatement).setObject(2, "NameValue");
         verify(preparedStatement).setNull(3, 
columnInfoList.get(2).getSqlType());
         verify(preparedStatement).setObject(4, 
PArrayDataType.instantiatePhoenixArray(PInteger.INSTANCE, new Object[]{1,2,3}));
+        verify(preparedStatement).setObject(5, Boolean.FALSE);
         verify(preparedStatement).execute();
         verifyNoMoreInteractions(preparedStatement);
     }
 
     @Test
     public void testExecute_InvalidType() throws Exception {
-        R recordWithInvalidType = createRecord(123L, "NameValue", 
"ThisIsNotANumber", Arrays.asList(1, 2, 3));
+        R recordWithInvalidType = createRecord(123L, "NameValue", 
"ThisIsNotANumber",
+                Arrays.asList(1, 2, 3), true);
         getUpsertExecutor().execute(recordWithInvalidType);
 
         verify(upsertListener).errorOnRecord(eq(recordWithInvalidType), 
any(Throwable.class));

http://git-wip-us.apache.org/repos/asf/phoenix/blob/b06a20c5/phoenix-core/src/test/java/org/apache/phoenix/util/csv/CsvUpsertExecutorTest.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/test/java/org/apache/phoenix/util/csv/CsvUpsertExecutorTest.java
 
b/phoenix-core/src/test/java/org/apache/phoenix/util/csv/CsvUpsertExecutorTest.java
index 7a09bee..c887ff7 100644
--- 
a/phoenix-core/src/test/java/org/apache/phoenix/util/csv/CsvUpsertExecutorTest.java
+++ 
b/phoenix-core/src/test/java/org/apache/phoenix/util/csv/CsvUpsertExecutorTest.java
@@ -21,15 +21,20 @@ import java.io.IOException;
 import java.sql.SQLException;
 import java.util.List;
 
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
 import org.apache.commons.csv.CSVFormat;
 import org.apache.commons.csv.CSVParser;
 import org.apache.commons.csv.CSVRecord;
 import org.apache.phoenix.util.AbstractUpsertExecutorTest;
 import org.apache.phoenix.util.UpsertExecutor;
 import org.junit.Before;
+import org.junit.Test;
 
-import com.google.common.base.Joiner;
-import com.google.common.collect.Iterables;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.verify;
 
 public class CsvUpsertExecutorTest extends 
AbstractUpsertExecutorTest<CSVRecord, String> {
 
@@ -63,4 +68,12 @@ public class CsvUpsertExecutorTest extends 
AbstractUpsertExecutorTest<CSVRecord,
         upsertExecutor = new CsvUpsertExecutor(conn, columnInfoList, 
preparedStatement,
                 upsertListener, ARRAY_SEP);
     }
+
+    @Test
+    public void testExecute_InvalidBoolean() throws Exception {
+        CSVRecord csvRecordWithInvalidType = 
createRecord("123,NameValue,42,1:2:3,NotABoolean");
+        upsertExecutor.execute(ImmutableList.of(csvRecordWithInvalidType));
+
+        verify(upsertListener).errorOnRecord(eq(csvRecordWithInvalidType), 
any(Throwable.class));
+    }
 }

Reply via email to