Repository: phoenix Updated Branches: refs/heads/master ce8980553 -> 69f22b515
PHOENIX-2138 Non equality comparisons don't work for ARRAY type columns that are DESC in row key (Dumindu Buddhika) Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/69f22b51 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/69f22b51 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/69f22b51 Branch: refs/heads/master Commit: 69f22b5151e40645b4968a787e55d0155b128855 Parents: ce89805 Author: ramkrishna <ramkrishna.s.vasude...@gmail.com> Authored: Sun Jul 26 12:06:11 2015 +0530 Committer: ramkrishna <ramkrishna.s.vasude...@gmail.com> Committed: Sun Jul 26 12:08:59 2015 +0530 ---------------------------------------------------------------------- .../org/apache/phoenix/end2end/ArrayIT.java | 201 ++++++++++++++++++- .../apache/phoenix/iterate/ExplainTable.java | 4 +- .../phoenix/schema/types/PArrayDataType.java | 9 +- .../phoenix/schema/types/PhoenixArray.java | 4 - 4 files changed, 209 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/69f22b51/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java index 89997f4..800a7b4 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java @@ -2038,5 +2038,204 @@ public class ArrayIT extends BaseClientManagedTimeIT { assertFalse(rs.next()); conn.close(); } - + + @Test + public void testComparisonOperatorsForDesc1()throws Exception{ + long ts = nextTimestamp(); + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); + Connection conn = DriverManager.getConnection(getUrl(), props); + String ddl = "create table a (k varchar array primary key desc)"; + conn.createStatement().execute(ddl); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); + conn = DriverManager.getConnection(getUrl(), props); + PreparedStatement stmt = conn.prepareStatement("upsert into a values (array['a', 'c'])"); + stmt.execute(); + conn.commit(); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40)); + conn = DriverManager.getConnection(getUrl(), props); + ResultSet rs; + stmt = conn.prepareStatement("select * from a where k >= array['a', 'b']"); + rs = stmt.executeQuery(); + assertTrue(rs.next()); + } + + @Test + public void testComparisonOperatorsForDesc2()throws Exception{ + long ts = nextTimestamp(); + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); + Connection conn = DriverManager.getConnection(getUrl(), props); + String ddl = "create table a (k varchar array primary key desc)"; + conn.createStatement().execute(ddl); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); + conn = DriverManager.getConnection(getUrl(), props); + PreparedStatement stmt = conn.prepareStatement("upsert into a values (array['a', 'c'])"); + stmt.execute(); + conn.commit(); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40)); + conn = DriverManager.getConnection(getUrl(), props); + ResultSet rs; + stmt = conn.prepareStatement("select * from a where k >= array['a', 'c']"); + rs = stmt.executeQuery(); + assertTrue(rs.next()); + } + + @Test + public void testComparisonOperatorsForDesc3()throws Exception{ + long ts = nextTimestamp(); + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); + Connection conn = DriverManager.getConnection(getUrl(), props); + String ddl = "create table a (k varchar array primary key desc)"; + conn.createStatement().execute(ddl); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); + conn = DriverManager.getConnection(getUrl(), props); + PreparedStatement stmt = conn.prepareStatement("upsert into a values (array['a', 'c'])"); + stmt.execute(); + conn.commit(); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40)); + conn = DriverManager.getConnection(getUrl(), props); + ResultSet rs; + stmt = conn.prepareStatement("select * from a where k > array['a', 'b']"); + rs = stmt.executeQuery(); + assertTrue(rs.next()); + } + + @Test + public void testComparisonOperatorsForDesc4()throws Exception{ + long ts = nextTimestamp(); + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); + Connection conn = DriverManager.getConnection(getUrl(), props); + String ddl = "create table a (k varchar array primary key desc)"; + conn.createStatement().execute(ddl); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); + conn = DriverManager.getConnection(getUrl(), props); + PreparedStatement stmt = conn.prepareStatement("upsert into a values (array['a', 'b'])"); + stmt.execute(); + conn.commit(); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40)); + conn = DriverManager.getConnection(getUrl(), props); + ResultSet rs; + stmt = conn.prepareStatement("select * from a where k <= array['a', 'c']"); + rs = stmt.executeQuery(); + assertTrue(rs.next()); + } + + @Test + public void testComparisonOperatorsForDesc5()throws Exception{ + long ts = nextTimestamp(); + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); + Connection conn = DriverManager.getConnection(getUrl(), props); + String ddl = "create table a (k varchar array primary key desc)"; + conn.createStatement().execute(ddl); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); + conn = DriverManager.getConnection(getUrl(), props); + PreparedStatement stmt = conn.prepareStatement("upsert into a values (array['a', 'b'])"); + stmt.execute(); + conn.commit(); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40)); + conn = DriverManager.getConnection(getUrl(), props); + ResultSet rs; + stmt = conn.prepareStatement("select * from a where k <= array['a', 'b']"); + rs = stmt.executeQuery(); + assertTrue(rs.next()); + } + + @Test + public void testComparisonOperatorsForDesc6()throws Exception{ + long ts = nextTimestamp(); + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); + Connection conn = DriverManager.getConnection(getUrl(), props); + String ddl = "create table a (k varchar array primary key desc)"; + conn.createStatement().execute(ddl); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); + conn = DriverManager.getConnection(getUrl(), props); + PreparedStatement stmt = conn.prepareStatement("upsert into a values (array['a', 'b'])"); + stmt.execute(); + conn.commit(); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40)); + conn = DriverManager.getConnection(getUrl(), props); + ResultSet rs; + stmt = conn.prepareStatement("select * from a where k < array['a', 'c']"); + rs = stmt.executeQuery(); + assertTrue(rs.next()); + } + + @Test + public void testComparisonOperatorsForDesc7()throws Exception{ + long ts = nextTimestamp(); + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); + Connection conn = DriverManager.getConnection(getUrl(), props); + String ddl = "create table a (k integer array primary key desc)"; + conn.createStatement().execute(ddl); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); + conn = DriverManager.getConnection(getUrl(), props); + PreparedStatement stmt = conn.prepareStatement("upsert into a values (array[1, 2])"); + stmt.execute(); + conn.commit(); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40)); + conn = DriverManager.getConnection(getUrl(), props); + ResultSet rs; + stmt = conn.prepareStatement("select * from a where k < array[1, 4]"); + rs = stmt.executeQuery(); + assertTrue(rs.next()); + } + + @Test + public void testComparisonOperatorsForDesc8()throws Exception{ + long ts = nextTimestamp(); + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10)); + Connection conn = DriverManager.getConnection(getUrl(), props); + String ddl = "create table a (k integer array primary key desc)"; + conn.createStatement().execute(ddl); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); + conn = DriverManager.getConnection(getUrl(), props); + PreparedStatement stmt = conn.prepareStatement("upsert into a values (array[1, 2])"); + stmt.execute(); + conn.commit(); + conn.close(); + + props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 40)); + conn = DriverManager.getConnection(getUrl(), props); + ResultSet rs; + stmt = conn.prepareStatement("select * from a where k <= array[1, 2]"); + rs = stmt.executeQuery(); + assertTrue(rs.next()); + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/69f22b51/phoenix-core/src/main/java/org/apache/phoenix/iterate/ExplainTable.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/ExplainTable.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/ExplainTable.java index 3fe42fa..e3eb51b 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/ExplainTable.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/ExplainTable.java @@ -176,7 +176,9 @@ public abstract class ExplainTable { SortOrder sortOrder = tableRef.getTable().getPKColumns().get(slotIndex).getSortOrder(); if (sortOrder == SortOrder.DESC) { buf.append('~'); - range = SortOrder.invert(range, 0, new byte[range.length], 0, range.length); + ImmutableBytesWritable ptr = new ImmutableBytesWritable(range); + type.coerceBytes(ptr, type, sortOrder, SortOrder.getDefault()); + range = ptr.get(); } Format formatter = context.getConnection().getFormatter(type); buf.append(type.toStringLiteral(range, formatter)); http://git-wip-us.apache.org/repos/asf/phoenix/blob/69f22b51/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PArrayDataType.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PArrayDataType.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PArrayDataType.java index 6236184..28144fd 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PArrayDataType.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PArrayDataType.java @@ -108,7 +108,8 @@ public abstract class PArrayDataType<T> extends PDataType<T> { byteStream = new TrustedByteArrayOutputStream(size + capacity + Bytes.SIZEOF_INT + Bytes.SIZEOF_BYTE + Bytes.SIZEOF_INT); } else { - int size = arr.getMaxLength() * noOfElements; + int elemLength = (arr.getMaxLength() == null ? baseType.getByteSize() : arr.getMaxLength()); + int size = elemLength * noOfElements; // Here the int for noofelements, byte for the version byteStream = new TrustedByteArrayOutputStream(size); } @@ -301,8 +302,10 @@ public abstract class PArrayDataType<T> extends PDataType<T> { } baseType = desiredBaseType; } else { - pArr = (PhoenixArray)value; - pArr = new PhoenixArray(pArr, desiredMaxLength); + pArr = (PhoenixArray) value; + if (!Objects.equal(maxLength, desiredMaxLength)) { + pArr = new PhoenixArray(pArr, desiredMaxLength); + } } ptr.set(toBytes(pArr, baseType, desiredSortOrder, expectedRowKeyOrderOptimizable)); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/69f22b51/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PhoenixArray.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PhoenixArray.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PhoenixArray.java index 843c831..3dc1050 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PhoenixArray.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PhoenixArray.java @@ -111,8 +111,6 @@ public class PhoenixArray implements Array,SQLCloseable { } } } - } else { - maxLength = baseType.getByteSize(); } } this.array = convertObjectArrayToPrimitiveArray(elements); @@ -126,8 +124,6 @@ public class PhoenixArray implements Array,SQLCloseable { if (baseType.getByteSize() == null) { elements = coerceToNewLength(baseType, (Object[])pArr.array, desiredMaxLength); maxLength = desiredMaxLength; - } else { - maxLength = baseType.getByteSize(); } } this.array = convertObjectArrayToPrimitiveArray(elements);