You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by tl...@apache.org on 2022/02/16 08:40:34 UTC
[ignite] branch master updated: IGNITE-11402 SQL: Add ability to specify inline size of PK and affini… (#9604)
This is an automated email from the ASF dual-hosted git repository.
tledkov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new b8a690c IGNITE-11402 SQL: Add ability to specify inline size of PK and affini… (#9604)
b8a690c is described below
commit b8a690c66c79e42ce2441e2ab8f38fad7e3007f8
Author: Taras Ledkov <tl...@gridgain.com>
AuthorDate: Wed Feb 16 11:40:07 2022 +0300
IGNITE-11402 SQL: Add ability to specify inline size of PK and affini… (#9604)
---
.../processors/query/GridQueryTypeDescriptor.java | 24 ++++++-
.../internal/processors/query/QueryEntityEx.java | 80 +++++++++++++++++++---
.../processors/query/QueryTypeDescriptorImpl.java | 32 ++++++++-
.../internal/processors/query/QueryUtils.java | 12 ++++
.../processors/query/h2/CommandProcessor.java | 10 ++-
.../processors/query/h2/H2TableDescriptor.java | 5 +-
.../query/h2/sql/GridSqlCreateTable.java | 26 +++++++
.../query/h2/sql/GridSqlQueryParser.java | 24 +++++++
.../processors/cache/index/BasicIndexTest.java | 42 +++++++++---
9 files changed, 229 insertions(+), 26 deletions(-)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java
index 4deeeae..4478609 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java
@@ -211,16 +211,36 @@ public interface GridQueryTypeDescriptor {
* @param keys Primary keys.
*/
public void primaryKeyFields(Set<String> keys);
-
+
/**
* @return {@code true} if absent PK parts should be filled with defaults, {@code false} otherwise.
*/
public boolean fillAbsentPKsWithDefaults();
-
+
/**
* Sets up fillAbsentPKsWithDefaults flag.
*
* @param fillAbsentPKsWithDefaults Flag.
*/
public void setFillAbsentPKsWithDefaults(boolean fillAbsentPKsWithDefaults);
+
+ /**
+ * Gets primary key index INLINE_SIZE.
+ */
+ public int primaryKeyInlineSize();
+
+ /**
+ * Sets primary key index INLINE_SIZE.
+ */
+ public void primaryKeyInlineSize(int pkInlineSize);
+
+ /**
+ * Gets affinity fields index INLINE_SIZE.
+ */
+ public int affinityFieldInlineSize();
+
+ /**
+ * Sets affinity fields index INLINE_SIZE.
+ */
+ public void affinityFieldInlineSize(int affFieldInlineSize);
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryEntityEx.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryEntityEx.java
index 11c46dc..5a6476d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryEntityEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryEntityEx.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.processors.query;
import java.util.HashSet;
import java.util.Set;
+import javax.cache.CacheException;
import org.apache.ignite.cache.QueryEntity;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.S;
@@ -36,10 +37,16 @@ public class QueryEntityEx extends QueryEntity {
/** Whether to preserve order specified by {@link #getKeyFields()} or not. */
private boolean preserveKeysOrder;
-
+
/** Whether absent PK parts should be filled with defaults or not. */
private boolean fillAbsentPKsWithDefaults;
-
+
+ /** INLINE_SIZE for PK index. */
+ private Integer pkInlineSize;
+
+ /** INLINE_SIZE for affinity field index. */
+ private Integer affKeyInlineSize;
+
/**
* Default constructor.
*/
@@ -61,8 +68,10 @@ public class QueryEntityEx extends QueryEntity {
notNullFields = other0.notNullFields != null ? new HashSet<>(other0.notNullFields) : null;
preserveKeysOrder = other0.preserveKeysOrder;
-
+
fillAbsentPKsWithDefaults = other0.fillAbsentPKsWithDefaults;
+ pkInlineSize = other0.pkInlineSize != null ? other0.pkInlineSize : -1;
+ affKeyInlineSize = other0.affKeyInlineSize != null ? other0.affKeyInlineSize : -1;
}
}
@@ -94,21 +103,73 @@ public class QueryEntityEx extends QueryEntity {
return this;
}
-
+
/**
* @return {@code true} if absent PK parts should be filled with defaults, {@code false} otherwise.
*/
public boolean fillAbsentPKsWithDefaults() {
return fillAbsentPKsWithDefaults;
}
-
+
/**
* @param fillAbsentPKsWithDefaults Whether absent PK parts should be filled with defaults or not.
* @return {@code this} for chaining.
*/
public QueryEntity fillAbsentPKsWithDefaults(boolean fillAbsentPKsWithDefaults) {
this.fillAbsentPKsWithDefaults = fillAbsentPKsWithDefaults;
-
+
+ return this;
+ }
+
+ /**
+ * Returns INLINE_SIZE for PK index.
+ *
+ * @return INLINE_SIZE for PK index.
+ */
+ public Integer getPrimaryKeyInlineSize() {
+ return pkInlineSize;
+ }
+
+ /**
+ * Sets INLINE_SIZE for PK index.
+ *
+ * @param pkInlineSize INLINE_SIZE for PK index, when {@code null} - inline size is calculated automativally.
+ * @return {@code this} for chaining.
+ */
+ public QueryEntity setPrimaryKeyInlineSize(Integer pkInlineSize) {
+ if (pkInlineSize != null && pkInlineSize < 0) {
+ throw new CacheException("Inline size for sorted primary key cannot be negative. "
+ + "[inlineSize=" + pkInlineSize + ']');
+ }
+
+ this.pkInlineSize = pkInlineSize;
+
+ return this;
+ }
+
+ /**
+ * Returns INLINE_SIZE for affinity field index.
+ *
+ * @return INLINE_SIZE for affinity field index.
+ */
+ public Integer getAffinityKeyInlineSize() {
+ return affKeyInlineSize;
+ }
+
+ /**
+ * Sets INLINE_SIZE for AFFINITY_KEY index.
+ *
+ * @param affKeyInlineSize INLINE_SIZE for AFFINITY_KEY index, when {@code null} - inline size is calculated automativally.
+ * @return {@code this} for chaining.
+ */
+ public QueryEntity setAffinityKeyInlineSize(Integer affKeyInlineSize) {
+ if (affKeyInlineSize != null && affKeyInlineSize < 0) {
+ throw new CacheException("Inline size for affinity fieled index cannot be negative. "
+ + "[inlineSize=" + affKeyInlineSize + ']');
+ }
+
+ this.affKeyInlineSize = affKeyInlineSize;
+
return this;
}
@@ -123,7 +184,9 @@ public class QueryEntityEx extends QueryEntity {
QueryEntityEx entity = (QueryEntityEx)o;
return super.equals(entity) && F.eq(notNullFields, entity.notNullFields)
- && preserveKeysOrder == entity.preserveKeysOrder;
+ && preserveKeysOrder == entity.preserveKeysOrder
+ && F.eq(pkInlineSize, entity.pkInlineSize)
+ && F.eq(affKeyInlineSize, entity.affKeyInlineSize);
}
/** {@inheritDoc} */
@@ -132,7 +195,8 @@ public class QueryEntityEx extends QueryEntity {
res = 31 * res + (notNullFields != null ? notNullFields.hashCode() : 0);
res = 31 * res + (preserveKeysOrder ? 1 : 0);
-
+ res = 31 * res + (pkInlineSize != null ? pkInlineSize.hashCode() : 0);
+ res = 31 * res + (affKeyInlineSize != null ? affKeyInlineSize.hashCode() : 0);
return res;
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
index 0af5481..639edba 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
@@ -137,10 +137,16 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
/** Primary key fields. */
private Set<String> pkFields;
-
+
/** Whether absent PK parts should be filled with defaults or not. */
private boolean fillAbsentPKsWithDefaults;
+ /** */
+ private int pkInlineSize;
+
+ /** */
+ private int affFieldInlineSize;
+
/** Logger. */
private final IgniteLogger log;
@@ -767,14 +773,34 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
@Override public void primaryKeyFields(Set<String> keys) {
pkFields = keys;
}
-
+
/** {@inheritDoc} */
@Override public boolean fillAbsentPKsWithDefaults() {
return fillAbsentPKsWithDefaults;
}
-
+
/** {@inheritDoc} */
@Override public void setFillAbsentPKsWithDefaults(boolean fillAbsentPKsWithDefaults) {
this.fillAbsentPKsWithDefaults = fillAbsentPKsWithDefaults;
}
+
+ /** {@inheritDoc} */
+ @Override public int primaryKeyInlineSize() {
+ return pkInlineSize;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void primaryKeyInlineSize(int pkInlineSize) {
+ this.pkInlineSize = pkInlineSize;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int affinityFieldInlineSize() {
+ return affFieldInlineSize;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void affinityFieldInlineSize(int affFieldInlineSize) {
+ this.affFieldInlineSize = affFieldInlineSize;
+ }
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
index 174ffae..fea6a3d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
@@ -329,6 +329,11 @@ public class QueryUtils {
normalEntity.setFieldsPrecision(entity.getFieldsPrecision());
normalEntity.setFieldsScale(entity.getFieldsScale());
+ if (entity instanceof QueryEntityEx) {
+ normalEntity.setPrimaryKeyInlineSize(((QueryEntityEx)entity).getPrimaryKeyInlineSize());
+ normalEntity.setAffinityKeyInlineSize(((QueryEntityEx)entity).getAffinityKeyInlineSize());
+ }
+
// Normalize table name.
String normalTblName = entity.getTableName();
@@ -606,6 +611,13 @@ public class QueryUtils {
desc.typeId(valTypeId);
+ if (qryEntity instanceof QueryEntityEx) {
+ QueryEntityEx qe = (QueryEntityEx)qryEntity;
+
+ desc.primaryKeyInlineSize(qe.getPrimaryKeyInlineSize() != null ? qe.getPrimaryKeyInlineSize() : -1);
+ desc.affinityFieldInlineSize(qe.getAffinityKeyInlineSize() != null ? qe.getAffinityKeyInlineSize() : -1);
+ }
+
return new QueryTypeCandidate(typeId, altTypeId, desc);
}
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/CommandProcessor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/CommandProcessor.java
index 9b80439..e99966e 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/CommandProcessor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/CommandProcessor.java
@@ -25,6 +25,7 @@ import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
@@ -32,7 +33,6 @@ import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
-
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteCluster;
import org.apache.ignite.IgniteDataStreamer;
@@ -1240,7 +1240,13 @@ public class CommandProcessor {
// Fill key object with all fields for new tables.
res.fillAbsentPKsWithDefaults(true);
-
+
+ if (Objects.nonNull(createTbl.primaryKeyInlineSize()))
+ res.setPrimaryKeyInlineSize(createTbl.primaryKeyInlineSize());
+
+ if (Objects.nonNull(createTbl.affinityKeyInlineSize()))
+ res.setAffinityKeyInlineSize(createTbl.affinityKeyInlineSize());
+
return res;
}
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java
index 0fc8713..b55401b 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java
@@ -239,7 +239,7 @@ public class H2TableDescriptor {
false,
unwrappedKeyAndAffinityCols,
wrappedKeyCols,
- -1,
+ tbl.rowDescriptor().tableDescriptor().type().primaryKeyInlineSize(),
null
);
@@ -304,7 +304,7 @@ public class H2TableDescriptor {
true,
colsWithUnwrappedKey,
cols,
- -1,
+ tbl.rowDescriptor().tableDescriptor().type().affinityFieldInlineSize(),
null)
);
}
@@ -402,7 +402,6 @@ public class H2TableDescriptor {
* @param cacheVisitor Cache visitor.
* @return Index.
*/
- @SuppressWarnings("ZeroLengthArrayAllocation")
public GridH2IndexBase createUserIndex(GridQueryIndexDescriptor idxDesc, @Nullable SchemaIndexCacheVisitor cacheVisitor) {
IndexColumn keyCol = tbl.indexColumn(QueryUtils.KEY_COL, SortOrder.ASCENDING);
IndexColumn affCol = tbl.getAffinityKeyColumn();
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlCreateTable.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlCreateTable.java
index 3a216fd..ee8036f 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlCreateTable.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlCreateTable.java
@@ -91,6 +91,12 @@ public class GridSqlCreateTable extends GridSqlStatement {
/** See {@link CacheConfiguration#getQueryParallelism()}. */
private Integer parallelism;
+ /** INLINE_SIZE for PK index. */
+ private Integer pkInlineSize;
+
+ /** INLINE_SIZE for affinity key index. */
+ private Integer affInlineSize;
+
/**
* @return Cache name upon which new cache configuration for this table must be based.
*/
@@ -371,6 +377,26 @@ public class GridSqlCreateTable extends GridSqlStatement {
this.parallelism = parallelism;
}
+ /** */
+ public Integer primaryKeyInlineSize() {
+ return pkInlineSize;
+ }
+
+ /** */
+ public void primaryKeyInlineSize(Integer pkInlineSize) {
+ this.pkInlineSize = pkInlineSize;
+ }
+
+ /** */
+ public Integer affinityKeyInlineSize() {
+ return affInlineSize;
+ }
+
+ /** */
+ public void affinityKeyInlineSize(Integer affInlineSize) {
+ this.affInlineSize = affInlineSize;
+ }
+
/** {@inheritDoc} */
@Override public String getSQL() {
return null;
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 62cde59..2e46251 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
@@ -524,6 +524,12 @@ public class GridSqlQueryParser {
private static final String PARAM_PARALLELISM = "PARALLELISM";
/** */
+ private static final String PARAM_PK_INLINE_SIZE = "PK_INLINE_SIZE";
+
+ /** */
+ private static final String PARAM_AFFINITY_INDEX_INLINE_SIZE = "AFFINITY_INDEX_INLINE_SIZE";
+
+ /** */
private final IdentityHashMap<Object, Object> h2ObjToGridObj = new IdentityHashMap<>();
/** */
@@ -1691,6 +1697,24 @@ public class GridSqlQueryParser {
break;
+ case PARAM_PK_INLINE_SIZE:
+ ensureNotEmpty(name, val);
+
+ int pkInlineSize = parseIntParam(PARAM_PK_INLINE_SIZE, val);
+
+ res.primaryKeyInlineSize(pkInlineSize);
+
+ break;
+
+ case PARAM_AFFINITY_INDEX_INLINE_SIZE:
+ ensureNotEmpty(name, val);
+
+ int affInlineSize = parseIntParam(PARAM_AFFINITY_INDEX_INLINE_SIZE, val);
+
+ res.affinityKeyInlineSize(affInlineSize);
+
+ break;
+
default:
throw new IgniteSQLException("Unsupported parameter: " + name, IgniteQueryErrorCode.PARSING);
}
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/BasicIndexTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/BasicIndexTest.java
index 81586bd..eb6c815 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/BasicIndexTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/BasicIndexTest.java
@@ -28,7 +28,6 @@ import java.util.Objects;
import java.util.UUID;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
-
import javax.cache.CacheException;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.IgniteCheckedException;
@@ -51,6 +50,8 @@ import org.apache.ignite.internal.processors.query.IgniteSQLException;
import org.apache.ignite.internal.processors.query.QueryUtils;
import org.apache.ignite.internal.processors.query.h2.H2TableDescriptor;
import org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing;
+import org.apache.ignite.internal.processors.query.h2.database.H2TreeIndex;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2Table;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.testframework.GridTestUtils;
@@ -1521,7 +1522,7 @@ public class BasicIndexTest extends AbstractIndexingCommonTest {
assertNull(GridTestUtils.getFieldValue(tblDesc1, "luceneIdx"));
}
-
+
/**
* Checks that part of the composite key assembled in BinaryObjectBuilder can pass the validation correctly
* if you specify Object type when creating the index.
@@ -1531,9 +1532,9 @@ public class BasicIndexTest extends AbstractIndexingCommonTest {
@Test
public void testCacheSecondaryCompositeIndex() throws Exception {
inlineSize = 70;
-
+
startGrid();
-
+
String cacheName = "TEST";
List<QueryIndex> indexes = Collections.singletonList(
@@ -1554,15 +1555,15 @@ public class BasicIndexTest extends AbstractIndexingCommonTest {
.setIndexes(indexes)
))
);
-
+
BinaryObjectBuilder bob = grid().binary().builder("TEST_VAL_SECONDARY_COMPOSITE");
BinaryObjectBuilder bobInner = grid().binary().builder("inner");
-
+
bobInner.setField("inner_k", 0);
bobInner.setField("inner_uuid", UUID.randomUUID());
-
+
bob.setField("val_obj", bobInner.build());
-
+
IgniteCache<Object, Object> cache = grid().cache(cacheName);
cache.put(0, bob.build());
@@ -1588,6 +1589,31 @@ public class BasicIndexTest extends AbstractIndexingCommonTest {
}
/** */
+ @Test
+ public void testCreateSystemIndexWithSpecifiedInlineSizeByDdl() throws Exception {
+ inlineSize = 10;
+
+ final int pkInlineSize = 22;
+ final int affInlineSize = 23;
+
+ IgniteEx ign = startGrid();
+
+ sql("CREATE TABLE TEST (ID VARCHAR, ID_AFF INT, VAL INT, "
+ + "PRIMARY KEY (ID, ID_AFF)) WITH"
+ + "\""
+ + "AFFINITY_KEY=ID_AFF,"
+ + "PK_INLINE_SIZE=" + pkInlineSize + ","
+ + "AFFINITY_INDEX_INLINE_SIZE=" + affInlineSize
+ + "\""
+ );
+
+ GridH2Table tbl = ((IgniteH2Indexing)ign.context().query().getIndexing()).schemaManager().dataTable("PUBLIC", "TEST");
+
+ assertEquals(pkInlineSize, ((H2TreeIndex)tbl.getIndex("_key_PK")).inlineSize());
+ assertEquals(affInlineSize, ((H2TreeIndex)tbl.getIndex("AFFINITY_KEY")).inlineSize());
+ }
+
+ /** */
private void checkAll() {
IgniteCache<Key, Val> cache = grid(0).cache(DEFAULT_CACHE_NAME);