You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ja...@apache.org on 2017/11/15 18:34:36 UTC
[08/40] phoenix git commit: PHOENIX-4292 Filters on Tables and Views
with composite PK of VARCHAR fields with sort direction DESC do not work
(addendum)
PHOENIX-4292 Filters on Tables and Views with composite PK of VARCHAR fields with sort direction DESC do not work (addendum)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/a8a1abc3
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/a8a1abc3
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/a8a1abc3
Branch: refs/heads/4.x-HBase-1.2
Commit: a8a1abc34c8a3040419cbc6720808408d9e7ad9f
Parents: a4b0d25
Author: Thomas D'Silva <td...@apache.org>
Authored: Mon Oct 23 20:19:15 2017 -0700
Committer: James Taylor <jt...@salesforce.com>
Committed: Wed Nov 15 10:02:13 2017 -0800
----------------------------------------------------------------------
.../java/org/apache/phoenix/end2end/ViewIT.java | 202 ++++++++++++-------
1 file changed, 129 insertions(+), 73 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/a8a1abc3/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java
index 66e2430..5c0d100 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java
@@ -791,77 +791,133 @@ public class ViewIT extends BaseViewIT {
assertArrayEquals(expectedPKs, actualPKs);
}
- @Test
- public void testCompositeDescPK() throws SQLException {
- Properties props = new Properties();
- try (Connection globalConn = DriverManager.getConnection(getUrl(), props)) {
- String tableName = generateUniqueName();
- String viewName = generateUniqueName();
-
- // create global base table
- globalConn.createStatement().execute("CREATE TABLE " + tableName
- + " (TENANT_ID CHAR(15) NOT NULL, KEY_PREFIX CHAR(3) NOT NULL, CREATED_DATE DATE, CREATED_BY CHAR(15), SYSTEM_MODSTAMP DATE CONSTRAINT PK PRIMARY KEY (TENANT_ID, KEY_PREFIX)) VERSIONS=1, MULTI_TENANT=true, IMMUTABLE_ROWS=TRUE, REPLICATION_SCOPE=1");
-
- // create various tenant specific views
- globalConn.createStatement()
- .execute("CREATE VIEW " + viewName
- + " (pk1 VARCHAR(10) NOT NULL, pk2 VARCHAR(10) NOT NULL, col1 DATE, col3 DECIMAL CONSTRAINT PK PRIMARY KEY (pk1 DESC, pk2 DESC)) AS SELECT * FROM "
- + tableName + " WHERE KEY_PREFIX = 'abc' ");
-
- String tenantId = "tenantId";
- Properties tenantProps = new Properties();
- tenantProps.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId);
- // create a tenant specific view
- try (Connection tenantConn = DriverManager.getConnection(getUrl(), tenantProps)) {
- // upsert rows
- tenantConn.createStatement().execute("UPSERT INTO " + viewName
- + " (pk1, pk2, col1, col3) VALUES ('testa', 'testb', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)");
- tenantConn.createStatement().execute("UPSERT INTO " + viewName
- + " (pk1, pk2, col1, col3) VALUES ('testa', 'testc', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)");
- tenantConn.createStatement().execute("UPSERT INTO " + viewName
- + " (pk1, pk2, col1, col3) VALUES ('testa', 'testd', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)");
- tenantConn.createStatement().execute("UPSERT INTO " + viewName
- + " (pk1, pk2, col1, col3) VALUES ('testa', 'teste', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)");
- tenantConn.createStatement().execute("UPSERT INTO " + viewName
- + " (pk1, pk2, col1, col3) VALUES ('testb', 'testa', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)");
- tenantConn.commit();
-
- // run queries
- ResultSet rs = tenantConn.createStatement()
- .executeQuery("SELECT count(*) FROM " + viewName + " WHERE pk1 = 'testa'");
- assertTrue(rs.next());
- assertEquals(4, rs.getLong(1));
- assertFalse(rs.next());
-
- rs = tenantConn.createStatement().executeQuery("SELECT count(*) FROM " + viewName);
- assertTrue(rs.next());
- assertEquals(5, rs.getLong(1));
- assertFalse(rs.next());
-
- rs = tenantConn.createStatement()
- .executeQuery("SELECT count(*) FROM " + viewName + " WHERE pk1 >= 'testa'");
- assertTrue(rs.next());
- assertEquals(5, rs.getLong(1));
- assertFalse(rs.next());
-
- rs = tenantConn.createStatement()
- .executeQuery("SELECT count(*) FROM " + viewName + " WHERE pk1 <= 'testa'");
- assertTrue(rs.next());
- assertEquals(4, rs.getLong(1));
- assertFalse(rs.next());
-
- rs = tenantConn.createStatement()
- .executeQuery("SELECT count(*) FROM " + viewName + " WHERE pk1 > 'testa'");
- assertTrue(rs.next());
- assertEquals(1, rs.getLong(1));
- assertFalse(rs.next());
-
- rs = tenantConn.createStatement()
- .executeQuery("SELECT count(*) FROM " + viewName + " WHERE pk1 < 'testa'");
- assertTrue(rs.next());
- assertEquals(0, rs.getLong(1));
- assertFalse(rs.next());
- }
- }
- }
+ @Test
+ public void testCompositeDescPK() throws SQLException {
+ Properties props = new Properties();
+ try (Connection globalConn = DriverManager.getConnection(getUrl(), props)) {
+ String tableName = generateUniqueName();
+ String viewName1 = generateUniqueName();
+ String viewName2 = generateUniqueName();
+ String viewName3 = generateUniqueName();
+ String viewName4 = generateUniqueName();
+
+ // create global base table
+ globalConn.createStatement().execute("CREATE TABLE " + tableName
+ + " (TENANT_ID CHAR(15) NOT NULL, KEY_PREFIX CHAR(3) NOT NULL, CREATED_DATE DATE, CREATED_BY CHAR(15), SYSTEM_MODSTAMP DATE CONSTRAINT PK PRIMARY KEY (TENANT_ID, KEY_PREFIX)) VERSIONS=1, MULTI_TENANT=true, IMMUTABLE_ROWS=TRUE, REPLICATION_SCOPE=1");
+
+ String tenantId = "tenantId";
+ Properties tenantProps = new Properties();
+ tenantProps.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId);
+ // create a tenant specific view
+ try (Connection tenantConn = DriverManager.getConnection(getUrl(), tenantProps)) {
+ // create various tenant specific views
+ // view with composite PK with multiple PK values of VARCHAR values DESC
+ tenantConn.createStatement()
+ .execute("CREATE VIEW " + viewName1
+ + " (pk1 VARCHAR(10) NOT NULL, pk2 VARCHAR(10) NOT NULL, col1 DATE, col3 DECIMAL CONSTRAINT PK PRIMARY KEY (pk1 DESC, pk2 DESC)) AS SELECT * FROM "
+ + tableName + " WHERE KEY_PREFIX = 'abc' ");
+ // view with composite PK with single pk value DESC
+ tenantConn.createStatement()
+ .execute("CREATE VIEW " + viewName2
+ + " (pk1 VARCHAR(10) NOT NULL, pk2 VARCHAR(10) NOT NULL, col1 DATE, col3 DECIMAL CONSTRAINT PK PRIMARY KEY (pk1 DESC, pk2 DESC)) AS SELECT * FROM "
+ + tableName + " WHERE KEY_PREFIX = 'abc' ");
+
+ // upsert rows
+ upsertRows(viewName1, tenantConn);
+ upsertRows(viewName2, tenantConn);
+
+ // run queries
+ String[] whereClauses =
+ new String[] { "pk1 = 'testa'", "", "pk1 >= 'testa'", "pk1 <= 'testa'",
+ "pk1 > 'testa'", "pk1 < 'testa'" };
+ long[] expectedArray = new long[] { 4, 5, 5, 4, 1, 0 };
+ validate(viewName1, tenantConn, whereClauses, expectedArray);
+ validate(viewName2, tenantConn, whereClauses, expectedArray);
+
+ // view with composite PK with multiple Date PK values DESC
+ tenantConn.createStatement()
+ .execute("CREATE VIEW " + viewName3
+ + " (pk1 DATE(10) NOT NULL, pk2 DATE(10) NOT NULL, col1 VARCHAR(10), col3 DECIMAL CONSTRAINT PK PRIMARY KEY (pk1 DESC, pk2 DESC)) AS SELECT * FROM "
+ + tableName + " WHERE KEY_PREFIX = 'ab3' ");
+
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName3
+ + " (pk1, pk2, col1, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), TO_DATE('2017-10-16 21:00:00', 'yyyy-MM-dd HH:mm:ss'), 'txt1', 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName3
+ + " (pk1, pk2, col1, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), TO_DATE('2017-10-16 21:01:00', 'yyyy-MM-dd HH:mm:ss'), 'txt1', 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName3
+ + " (pk1, pk2, col1, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), TO_DATE('2017-10-16 21:02:00', 'yyyy-MM-dd HH:mm:ss'), 'txt1', 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName3
+ + " (pk1, pk2, col1, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), TO_DATE('2017-10-16 21:03:00', 'yyyy-MM-dd HH:mm:ss'), 'txt1', 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName3
+ + " (pk1, pk2, col1, col3) VALUES (TO_DATE('2017-10-16 23:00:00', 'yyyy-MM-dd HH:mm:ss'), TO_DATE('2017-10-16 21:04:00', 'yyyy-MM-dd HH:mm:ss'), 'txt1', 10)");
+ tenantConn.commit();
+
+ String[] view3WhereClauses =
+ new String[] {
+ "pk1 = TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')", "",
+ "pk1 >= TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')",
+ "pk1 <= TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')",
+ "pk1 > TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')",
+ "pk1 < TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')" };
+ validate(viewName3, tenantConn, view3WhereClauses, expectedArray);
+
+ tenantConn.createStatement()
+ .execute("CREATE VIEW " + viewName4
+ + " (pk1 DATE(10) NOT NULL, pk2 DECIMAL NOT NULL, pk3 VARCHAR(10) NOT NULL, col3 DECIMAL CONSTRAINT PK PRIMARY KEY (pk1 DESC, pk2 DESC, pk3 DESC)) AS SELECT * FROM "
+ + tableName + " WHERE KEY_PREFIX = 'ab4' ");
+
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName4
+ + " (pk1, pk2, pk3, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 1, 'txt1', 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName4
+ + " (pk1, pk2, pk3, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 2, 'txt2', 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName4
+ + " (pk1, pk2, pk3, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 3, 'txt3', 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName4
+ + " (pk1, pk2, pk3, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 4, 'txt4', 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName4
+ + " (pk1, pk2, pk3, col3) VALUES (TO_DATE('2017-10-16 23:00:00', 'yyyy-MM-dd HH:mm:ss'), 1, 'txt1', 10)");
+ tenantConn.commit();
+
+ String[] view4WhereClauses =
+ new String[] {
+ "pk1 = TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')",
+ "pk1 = TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss') AND pk2 = 2",
+ "pk1 = TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss') AND pk2 > 2",
+ "", "pk1 >= TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')",
+ "pk1 <= TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')",
+ "pk1 > TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')",
+ "pk1 < TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')" };
+ long[] view4ExpectedArray = new long[] { 4, 1, 2, 5, 5, 4, 1, 0 };
+ validate(viewName4, tenantConn, view4WhereClauses, view4ExpectedArray);
+
+ }
+ }
+ }
+
+ private void validate(String viewName, Connection tenantConn, String[] whereClauseArray,
+ long[] expectedArray) throws SQLException {
+ for (int i = 0; i < whereClauseArray.length; ++i) {
+ String where = !whereClauseArray[i].isEmpty() ? (" WHERE " + whereClauseArray[i]) : "";
+ ResultSet rs =
+ tenantConn.createStatement()
+ .executeQuery("SELECT count(*) FROM " + viewName + where);
+ assertTrue(rs.next());
+ assertEquals(expectedArray[i], rs.getLong(1));
+ assertFalse(rs.next());
+ }
+ }
+
+ private void upsertRows(String viewName1, Connection tenantConn) throws SQLException {
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName1
+ + " (pk1, pk2, col1, col3) VALUES ('testa', 'testb', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName1
+ + " (pk1, pk2, col1, col3) VALUES ('testa', 'testc', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName1
+ + " (pk1, pk2, col1, col3) VALUES ('testa', 'testd', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName1
+ + " (pk1, pk2, col1, col3) VALUES ('testa', 'teste', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)");
+ tenantConn.createStatement().execute("UPSERT INTO " + viewName1
+ + " (pk1, pk2, col1, col3) VALUES ('testb', 'testa', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)");
+ tenantConn.commit();
+ }
}