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);