IGNITE-6270: SQL: added "AFFINITY_KEY" and "CACHE_GROUP" parameters to "CREATE TABLE" command as more convenient synonyms to existing "AFFINITYKEY" and "CACHEGROUP". This closes #2831.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/4f77ef29 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/4f77ef29 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/4f77ef29 Branch: refs/heads/ignite-zk Commit: 4f77ef29ecb8a47e512f921115f37844cc27d4d4 Parents: 8ee6cb5 Author: Alexander Paschenko <alexander.a.pasche...@gmail.com> Authored: Fri Nov 17 17:09:01 2017 +0300 Committer: devozerov <voze...@gridgain.com> Committed: Fri Nov 17 17:09:01 2017 +0300 ---------------------------------------------------------------------- .../examples/datagrid/CacheQueryDdlExample.java | 2 +- .../ignite/examples/datagrid/JdbcExample.java | 2 +- .../thin/JdbcThinComplexDmlDdlSelfTest.java | 5 +- .../query/h2/sql/GridSqlQueryParser.java | 12 ++++- .../index/H2DynamicIndexingComplexTest.java | 4 +- .../cache/index/H2DynamicTableSelfTest.java | 49 +++++++++++++++----- 6 files changed, 53 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/4f77ef29/examples/src/main/java/org/apache/ignite/examples/datagrid/CacheQueryDdlExample.java ---------------------------------------------------------------------- diff --git a/examples/src/main/java/org/apache/ignite/examples/datagrid/CacheQueryDdlExample.java b/examples/src/main/java/org/apache/ignite/examples/datagrid/CacheQueryDdlExample.java index e27907d..7ac2751 100644 --- a/examples/src/main/java/org/apache/ignite/examples/datagrid/CacheQueryDdlExample.java +++ b/examples/src/main/java/org/apache/ignite/examples/datagrid/CacheQueryDdlExample.java @@ -62,7 +62,7 @@ public class CacheQueryDdlExample { // Create table based on PARTITIONED template with one backup. cache.query(new SqlFieldsQuery( "CREATE TABLE person (id LONG, name VARCHAR, city_id LONG, PRIMARY KEY (id, city_id)) " + - "WITH \"backups=1, affinityKey=city_id\"")).getAll(); + "WITH \"backups=1, affinity_key=city_id\"")).getAll(); // Create an index. cache.query(new SqlFieldsQuery("CREATE INDEX on Person (city_id)")).getAll(); http://git-wip-us.apache.org/repos/asf/ignite/blob/4f77ef29/examples/src/main/java/org/apache/ignite/examples/datagrid/JdbcExample.java ---------------------------------------------------------------------- diff --git a/examples/src/main/java/org/apache/ignite/examples/datagrid/JdbcExample.java b/examples/src/main/java/org/apache/ignite/examples/datagrid/JdbcExample.java index bc96e42..7a02a7e 100644 --- a/examples/src/main/java/org/apache/ignite/examples/datagrid/JdbcExample.java +++ b/examples/src/main/java/org/apache/ignite/examples/datagrid/JdbcExample.java @@ -51,7 +51,7 @@ public class JdbcExample { // Create table based on PARTITIONED template with one backup. stmt.executeUpdate("CREATE TABLE person (id LONG, name VARCHAR, city_id LONG, " + - "PRIMARY KEY (id, city_id)) WITH \"backups=1, affinityKey=city_id\""); + "PRIMARY KEY (id, city_id)) WITH \"backups=1, affinity_key=city_id\""); // Create an index. stmt.executeUpdate("CREATE INDEX on Person (city_id)"); http://git-wip-us.apache.org/repos/asf/ignite/blob/4f77ef29/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlSelfTest.java index d4e03bc..cdc9130 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlSelfTest.java @@ -32,7 +32,6 @@ import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; -import org.apache.ignite.internal.binary.BinaryMarshaller; import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor; import org.apache.ignite.lang.IgniteCallable; import org.apache.ignite.lang.IgnitePredicate; @@ -151,12 +150,12 @@ public class JdbcThinComplexDmlDdlSelfTest extends GridCommonAbstractTest { sql(new UpdateChecker(0), "CREATE TABLE person (id int, name varchar, age int, company varchar, city varchar, " + "primary key (id, name, city)) WITH \"template=" + cacheMode.name() + ",atomicity=" + atomicityMode.name() - + ",affinitykey=city\""); + + ",affinity_key=city\""); sql(new UpdateChecker(0), "CREATE INDEX idx on person (city asc, name asc)"); sql(new UpdateChecker(0), "CREATE TABLE city (name varchar, population int, primary key (name)) WITH " + - "\"template=" + cacheMode.name() + ",atomicity=" + atomicityMode.name() + ",affinitykey=name\""); + "\"template=" + cacheMode.name() + ",atomicity=" + atomicityMode.name() + ",affinity_key=name\""); sql(new UpdateChecker(3), "INSERT INTO city (name, population) values(?, ?), (?, ?), (?, ?)", http://git-wip-us.apache.org/repos/asf/ignite/blob/4f77ef29/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java index 46b2aee..8ffc5fa 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java @@ -457,10 +457,16 @@ public class GridSqlQueryParser { private static final String PARAM_ATOMICITY = "ATOMICITY"; /** */ - private static final String PARAM_CACHE_GROUP = "CACHEGROUP"; + private static final String PARAM_CACHE_GROUP_OLD = "CACHEGROUP"; /** */ - private static final String PARAM_AFFINITY_KEY = "AFFINITYKEY"; + private static final String PARAM_AFFINITY_KEY_OLD = "AFFINITYKEY"; + + /** */ + private static final String PARAM_CACHE_GROUP = "CACHE_GROUP"; + + /** */ + private static final String PARAM_AFFINITY_KEY = "AFFINITY_KEY"; /** */ private static final String PARAM_WRITE_SYNC = "WRITE_SYNCHRONIZATION_MODE"; @@ -1317,6 +1323,7 @@ public class GridSqlQueryParser { break; + case PARAM_CACHE_GROUP_OLD: case PARAM_CACHE_GROUP: ensureNotEmpty(name, val); @@ -1324,6 +1331,7 @@ public class GridSqlQueryParser { break; + case PARAM_AFFINITY_KEY_OLD: case PARAM_AFFINITY_KEY: ensureNotEmpty(name, val); http://git-wip-us.apache.org/repos/asf/ignite/blob/4f77ef29/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexingComplexTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexingComplexTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexingComplexTest.java index 0be691e..f9d3408 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexingComplexTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexingComplexTest.java @@ -94,12 +94,12 @@ public abstract class H2DynamicIndexingComplexTest extends DynamicIndexAbstractS public void testOperations() { executeSql("CREATE TABLE person (id int, name varchar, age int, company varchar, city varchar, " + "primary key (id, name, city)) WITH \"template=" + cacheMode.name() + ",atomicity=" + atomicityMode.name() + - ",affinitykey=city\""); + ",affinity_key=city\""); executeSql("CREATE INDEX idx on person (city asc, name asc)"); executeSql("CREATE TABLE city (name varchar, population int, primary key (name)) WITH " + - "\"template=" + cacheMode.name() + ",atomicity=" + atomicityMode.name() + ",affinitykey=name\""); + "\"template=" + cacheMode.name() + ",atomicity=" + atomicityMode.name() + ",affinity_key=name\""); executeSql("INSERT INTO city (name, population) values(?, ?), (?, ?), (?, ?)", "St. Petersburg", 6000000, http://git-wip-us.apache.org/repos/asf/ignite/blob/4f77ef29/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java index ef59a62..71b0b5f 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java @@ -141,6 +141,14 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest { } /** + * Test that {@code CREATE TABLE} actually creates new cache, H2 table and type descriptor on all nodes. + * @throws Exception if failed. + */ + public void testCreateTableWithCacheGroupAndLegacyParamName() throws Exception { + doTestCreateTable(CACHE_NAME, "MyGroup", null, null, true); + } + + /** * Test that {@code CREATE TABLE} actually creates new cache from template, * H2 table and type descriptor on all nodes. * @throws Exception if failed. @@ -484,10 +492,27 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest { */ private void doTestCreateTable(String tplCacheName, String cacheGrp, CacheMode cacheMode, CacheWriteSynchronizationMode writeSyncMode, String... additionalParams) { + doTestCreateTable(tplCacheName, cacheGrp, cacheMode, writeSyncMode, false, additionalParams); + } + + /** + * Test that {@code CREATE TABLE} with given template cache name actually creates new cache, + * H2 table and type descriptor on all nodes, optionally with cache type check. + * @param tplCacheName Template cache name. + * @param cacheGrp Cache group name, or {@code null} if no group is set. + * @param cacheMode Expected cache mode, or {@code null} if no check is needed. + * @param writeSyncMode Expected write sync mode, or {@code null} if no check is needed. + * @param useLegacyCacheGrpParamName Whether legacy (harder-to-read) cache group param name should be used. + * @param additionalParams Supplemental parameters to append to {@code CREATE TABLE} SQL. + */ + private void doTestCreateTable(String tplCacheName, String cacheGrp, CacheMode cacheMode, + CacheWriteSynchronizationMode writeSyncMode, boolean useLegacyCacheGrpParamName, String... additionalParams) { + String cacheGrpParamName = useLegacyCacheGrpParamName ? "cacheGroup" : "cache_group"; + String sql = "CREATE TABLE \"Person\" (\"id\" int, \"city\" varchar," + " \"name\" varchar, \"surname\" varchar, \"age\" int, PRIMARY KEY (\"id\", \"city\")) WITH " + (F.isEmpty(tplCacheName) ? "" : "\"template=" + tplCacheName + "\",") + "\"backups=10,atomicity=atomic\"" + - (F.isEmpty(cacheGrp) ? "" : ",\"cacheGroup=" + cacheGrp + '"'); + (F.isEmpty(cacheGrp) ? "" : ",\"" + cacheGrpParamName + '=' + cacheGrp + '"'); for (String p : additionalParams) sql += ",\"" + p + "\""; @@ -582,7 +607,7 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest { * Test that attempting to omit mandatory value of CACHEGROUP parameter yields an error. */ public void testEmptyCacheGroup() { - assertCreateTableWithParamsThrows("cachegroup=", "Parameter value cannot be empty: CACHEGROUP"); + assertCreateTableWithParamsThrows("cache_group=", "Parameter value cannot be empty: CACHE_GROUP"); } /** @@ -817,7 +842,7 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest { */ public void testAffinityKey() throws Exception { execute("CREATE TABLE \"City\" (\"name\" varchar primary key, \"code\" int) WITH wrap_key,wrap_value," + - "\"affinityKey='name'\""); + "\"affinity_key='name'\""); assertAffinityCacheConfiguration("City", "name"); @@ -830,7 +855,7 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest { // We need unique name for this table to avoid conflicts with existing binary metadata. execute("CREATE TABLE \"Person2\" (\"id\" int, \"city\" varchar," + " \"name\" varchar, \"surname\" varchar, \"age\" int, PRIMARY KEY (\"id\", \"city\")) WITH " + - "wrap_key,wrap_value,\"template=cache,affinityKey='city'\""); + "wrap_key,wrap_value,\"template=cache,affinity_key='city'\""); assertAffinityCacheConfiguration("Person2", "city"); @@ -903,22 +928,22 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest { @SuppressWarnings("ThrowableResultOfMethodCallIgnored") public void testAffinityKeyCaseSensitivity() { execute("CREATE TABLE \"A\" (\"name\" varchar primary key, \"code\" int) WITH wrap_key,wrap_value," + - "\"affinityKey='name'\""); + "\"affinity_key='name'\""); assertAffinityCacheConfiguration("A", "name"); execute("CREATE TABLE \"B\" (name varchar primary key, \"code\" int) WITH wrap_key,wrap_value," + - "\"affinityKey=name\""); + "\"affinity_key=name\""); assertAffinityCacheConfiguration("B", "NAME"); execute("CREATE TABLE \"C\" (name varchar primary key, \"code\" int) WITH wrap_key,wrap_value," + - "\"affinityKey=NamE\""); + "\"affinity_key=NamE\""); assertAffinityCacheConfiguration("C", "NAME"); execute("CREATE TABLE \"D\" (\"name\" varchar primary key, \"code\" int) WITH wrap_key,wrap_value," + - "\"affinityKey=NAME\""); + "\"affinity_key=NAME\""); assertAffinityCacheConfiguration("D", "name"); @@ -926,7 +951,7 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest { GridTestUtils.assertThrows(null, new Callable<Object>() { @Override public Object call() throws Exception { execute("CREATE TABLE \"E\" (name varchar primary key, \"code\" int) WITH wrap_key,wrap_value," + - "\"affinityKey='Name'\""); + "\"affinity_key='Name'\""); return null; } @@ -937,7 +962,7 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest { GridTestUtils.assertThrows(null, new Callable<Object>() { @Override public Object call() throws Exception { execute("CREATE TABLE \"E\" (\"name\" varchar, \"Name\" int, val int, primary key(\"name\", " + - "\"Name\")) WITH \"affinityKey=name\""); + "\"Name\")) WITH \"affinity_key=name\""); return null; } @@ -967,7 +992,7 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest { // Error arises because user has specified case sensitive affinity column name GridTestUtils.assertThrows(null, new Callable<Object>() { @Override public Object call() throws Exception { - execute("CREATE TABLE \"E\" (name varchar primary key, \"code\" int) WITH \"affinityKey=code\""); + execute("CREATE TABLE \"E\" (name varchar primary key, \"code\" int) WITH \"affinity_key=code\""); return null; } @@ -982,7 +1007,7 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest { // Error arises because user has specified case sensitive affinity column name GridTestUtils.assertThrows(null, new Callable<Object>() { @Override public Object call() throws Exception { - execute("CREATE TABLE \"E\" (name varchar primary key, \"code\" int) WITH \"affinityKey=missing\""); + execute("CREATE TABLE \"E\" (name varchar primary key, \"code\" int) WITH \"affinity_key=missing\""); return null; }