You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/08/21 08:40:17 UTC

[08/50] [abbrv] ignite git commit: IGNITE-6004: Added QuerySqlField.inlineSize property. This closes #2420.

IGNITE-6004: Added QuerySqlField.inlineSize property. This closes #2420.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/62cbc29b
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/62cbc29b
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/62cbc29b

Branch: refs/heads/ignite-5578
Commit: 62cbc29bf4baccd03729e7b0dbe4da1d248c73d9
Parents: 523c5e5
Author: tledkov-gridgain <tl...@gridgain.com>
Authored: Tue Aug 15 11:19:37 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Tue Aug 15 11:19:37 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/cache/QueryEntity.java    |  15 +-
 .../org/apache/ignite/cache/QueryIndex.java     |   5 +-
 .../query/annotations/QueryGroupIndex.java      |  20 +++
 .../cache/query/annotations/QuerySqlField.java  |  23 +++
 .../cache/query/QueryEntityTypeDescriptor.java  |  17 +-
 ...ridCacheQuerySqlFieldInlineSizeSelfTest.java | 160 +++++++++++++++++++
 .../IgniteCacheQuerySelfTestSuite.java          |   3 +
 7 files changed, 226 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/62cbc29b/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java b/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
index 5180100..6440b48 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
@@ -419,6 +419,7 @@ public class QueryEntity implements Serializable {
                 sortedIdx.setFields(fields);
 
                 sortedIdx.setName(idxEntry.getKey());
+                sortedIdx.setInlineSize(idx.inlineSize());
 
                 idxs.add(sortedIdx);
             }
@@ -480,7 +481,7 @@ public class QueryEntity implements Serializable {
                 String idxName = cls.getSimpleName() + "_" + QueryUtils.VAL_FIELD_NAME + "_idx";
 
                 type.addIndex(idxName, QueryUtils.isGeometryClass(cls) ?
-                    QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED);
+                    QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED, QueryIndex.DFLT_INLINE_SIZE);
 
                 type.addFieldToIndex(idxName, QueryUtils.VAL_FIELD_NAME, 0, false);
             }
@@ -500,13 +501,13 @@ public class QueryEntity implements Serializable {
             QueryGroupIndex grpIdx = cls.getAnnotation(QueryGroupIndex.class);
 
             if (grpIdx != null)
-                type.addIndex(grpIdx.name(), QueryIndexType.SORTED);
+                type.addIndex(grpIdx.name(), QueryIndexType.SORTED, grpIdx.inlineSize());
 
             QueryGroupIndex.List grpIdxList = cls.getAnnotation(QueryGroupIndex.List.class);
 
             if (grpIdxList != null && !F.isEmpty(grpIdxList.value())) {
                 for (QueryGroupIndex idx : grpIdxList.value())
-                    type.addIndex(idx.name(), QueryIndexType.SORTED);
+                    type.addIndex(idx.name(), QueryIndexType.SORTED, idx.inlineSize());
             }
         }
 
@@ -559,11 +560,17 @@ public class QueryEntity implements Serializable {
                     idxName = cls.getSimpleName() + "_" + idxName;
 
                 desc.addIndex(idxName, QueryUtils.isGeometryClass(prop.type()) ?
-                    QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED);
+                    QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED, sqlAnn.inlineSize());
 
                 desc.addFieldToIndex(idxName, prop.fullName(), 0, sqlAnn.descending());
             }
 
+            if ((!F.isEmpty(sqlAnn.groups()) || !F.isEmpty(sqlAnn.orderedGroups()))
+                && sqlAnn.inlineSize() != QueryIndex.DFLT_INLINE_SIZE) {
+                throw new CacheException("Inline size cannot be set on a field with group index [" +
+                    "type=" + cls.getName() + ", property=" + prop.fullName() + ']');
+            }
+
             if (!F.isEmpty(sqlAnn.groups())) {
                 for (String group : sqlAnn.groups())
                     desc.addFieldToIndex(group, prop.fullName(), 0, false);

http://git-wip-us.apache.org/repos/asf/ignite/blob/62cbc29b/modules/core/src/main/java/org/apache/ignite/cache/QueryIndex.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/QueryIndex.java b/modules/core/src/main/java/org/apache/ignite/cache/QueryIndex.java
index 6e73049..ac7dd8e 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/QueryIndex.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/QueryIndex.java
@@ -38,6 +38,9 @@ public class QueryIndex implements Serializable {
     /** */
     private static final QueryIndexType DFLT_IDX_TYP = QueryIndexType.SORTED;
 
+    /** Default index inline size. */
+    public static final int DFLT_INLINE_SIZE = -1;
+
     /** Index name. */
     private String name;
 
@@ -49,7 +52,7 @@ public class QueryIndex implements Serializable {
     private QueryIndexType type = DFLT_IDX_TYP;
 
     /** */
-    private int inlineSize = -1;
+    private int inlineSize = DFLT_INLINE_SIZE;
 
     /**
      * Creates an empty index. Should be populated via setters.

http://git-wip-us.apache.org/repos/asf/ignite/blob/62cbc29b/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QueryGroupIndex.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QueryGroupIndex.java b/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QueryGroupIndex.java
index b1fefae..a947d0f 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QueryGroupIndex.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QueryGroupIndex.java
@@ -21,6 +21,8 @@ import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.configuration.CacheConfiguration;
 
 /**
  * Describes group index.
@@ -36,6 +38,24 @@ public @interface QueryGroupIndex {
     String name();
 
     /**
+     * Index inline size in bytes. When enabled part of indexed value will be placed directly to index pages,
+     * thus minimizing data page accesses, thus incraesing query performance.
+     * <p>
+     * Allowed values:
+     * <ul>
+     *     <li>{@code -1} (default) - determine inline size automatically (see below)</li>
+     *     <li>{@code 0} - index inline is disabled (not recommended)</li>
+     *     <li>positive value - fixed index inline</li>
+     * </ul>
+     * When set to {@code -1}, Ignite will try to detect inline size automatically. It will be no more than
+     * {@link CacheConfiguration#getSqlIndexMaxInlineSize()}. Index inline will be enabled for all fixed-length types,
+     * but <b>will not be enabled</b> for {@code String}.
+     *
+     * @return Index inline size in bytes.
+     */
+    int inlineSize() default QueryIndex.DFLT_INLINE_SIZE;
+
+    /**
      * List of group indexes for type.
      */
     @SuppressWarnings("PublicInnerClass")

http://git-wip-us.apache.org/repos/asf/ignite/blob/62cbc29b/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlField.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlField.java b/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlField.java
index 94dbea1..64aaa3a 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlField.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlField.java
@@ -22,6 +22,8 @@ import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.processors.cache.query.CacheQuery;
 
 /**
@@ -88,6 +90,27 @@ public @interface QuerySqlField {
     String name() default "";
 
     /**
+     * Index inline size in bytes. When enabled part of indexed value will be placed directly to index pages,
+     * thus minimizing data page accesses, thus incraesing query performance.
+     * <p>
+     * Allowed values:
+     * <ul>
+     *     <li>{@code -1} (default) - determine inline size automatically (see below)</li>
+     *     <li>{@code 0} - index inline is disabled (not recommended)</li>
+     *     <li>positive value - fixed index inline</li>
+     * </ul>
+     * When set to {@code -1}, Ignite will try to detect inline size automatically. It will be no more than
+     * {@link CacheConfiguration#getSqlIndexMaxInlineSize()}. Index inline will be enabled for all fixed-length types,
+     * but <b>will not be enabled</b> for {@code String}.
+     * <p>
+     * When index group is used, inline size must be defined in {@link QueryGroupIndex#inlineSize()}. Any value
+     * except of {@code -1} defined on a specific column will lead to exception.
+     *
+     * @return Index inline size in bytes.
+     */
+    int inlineSize() default QueryIndex.DFLT_INLINE_SIZE;
+
+    /**
      * Describes group of index and position of field in this group.
      * <p>
      * Opposite to {@link #groups()} this annotation gives control over order of fields in a group index.

http://git-wip-us.apache.org/repos/asf/ignite/blob/62cbc29b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java
index 47ab263..837a08f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java
@@ -24,6 +24,7 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 import javax.cache.CacheException;
+import org.apache.ignite.cache.QueryIndex;
 import org.apache.ignite.cache.QueryIndexType;
 import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
@@ -78,6 +79,9 @@ public class QueryEntityTypeDescriptor {
      * @return Index descriptor.
      */
     public QueryEntityIndexDescriptor addIndex(String idxName, QueryIndexType type, int inlineSize) {
+        if (inlineSize < 0 && inlineSize != QueryIndex.DFLT_INLINE_SIZE)
+            throw new CacheException("Illegal inline size [idxName=" + idxName + ", inlineSize=" + inlineSize + ']');
+
         QueryEntityIndexDescriptor idx = new QueryEntityIndexDescriptor(type, inlineSize);
 
         if (indexes.put(idxName, idx) != null)
@@ -87,17 +91,6 @@ public class QueryEntityTypeDescriptor {
     }
 
     /**
-     * Adds index.
-     *
-     * @param idxName Index name.
-     * @param type Index type.
-     * @return Index descriptor.
-     */
-    public QueryEntityIndexDescriptor addIndex(String idxName, QueryIndexType type) {
-        return addIndex(idxName, type, -1);
-    }
-
-    /**
      * Adds field to index.
      *
      * @param idxName Index name.
@@ -110,7 +103,7 @@ public class QueryEntityTypeDescriptor {
         QueryEntityIndexDescriptor desc = indexes.get(idxName);
 
         if (desc == null)
-            desc = addIndex(idxName, QueryIndexType.SORTED);
+            desc = addIndex(idxName, QueryIndexType.SORTED, QueryIndex.DFLT_INLINE_SIZE);
 
         desc.addField(field, orderNum, descending);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/62cbc29b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQuerySqlFieldInlineSizeSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQuerySqlFieldInlineSizeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQuerySqlFieldInlineSizeSelfTest.java
new file mode 100644
index 0000000..a257160
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQuerySqlFieldInlineSizeSelfTest.java
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.util.concurrent.Callable;
+import javax.cache.CacheException;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.query.annotations.QueryGroupIndex;
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ * Tests cache configuration with inlineSize property of the QuerySqlField annotation.
+ */
+@SuppressWarnings({"ThrowableResultOfMethodCallIgnored", "unchecked", "unused"})
+public class GridCacheQuerySqlFieldInlineSizeSelfTest extends GridCommonAbstractTest {
+    /**
+     * @throws Exception If failed.
+     */
+    public void testSingleFieldIndexes() throws Exception {
+        CacheConfiguration ccfg = defaultCacheConfiguration();
+
+        ccfg.setIndexedTypes(Integer.class, TestValueSingleFieldIndexes.class);
+
+        assertEquals(1, ccfg.getQueryEntities().size());
+
+        QueryEntity ent = (QueryEntity)ccfg.getQueryEntities().iterator().next();
+
+        assertEquals(2, ent.getIndexes().size());
+
+        for (QueryIndex idx : ent.getIndexes()) {
+            if(idx.getFields().containsKey("val0"))
+                assertEquals(10, idx.getInlineSize());
+            else if(idx.getFields().containsKey("val1"))
+                assertEquals(20, idx.getInlineSize());
+        }
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testGroupIndex() throws Exception {
+        CacheConfiguration ccfg = defaultCacheConfiguration();
+
+        ccfg.setIndexedTypes(Integer.class, TestValueGroupIndex.class);
+
+        assertEquals(1, ccfg.getQueryEntities().size());
+
+        QueryEntity ent = (QueryEntity)ccfg.getQueryEntities().iterator().next();
+
+        assertEquals(1, ent.getIndexes().size());
+
+        QueryIndex idx = ent.getIndexes().iterator().next();
+
+        assertEquals(10, idx.getInlineSize());
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testGroupIndexInvalidAnnotaion() throws Exception {
+        final CacheConfiguration ccfg = defaultCacheConfiguration();
+
+        GridTestUtils.assertThrows(log, new Callable<Object>() {
+            @Override public Object call() throws Exception {
+                ccfg.setIndexedTypes(Integer.class, TestValueGroupIndexInvalidAnnotation.class);
+
+                return null;
+            }
+        }, CacheException.class, "Inline size cannot be set on a field with group index");
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testNegativeInlineSize() throws Exception {
+        final CacheConfiguration ccfg = defaultCacheConfiguration();
+
+        GridTestUtils.assertThrows(
+            log, new Callable<Object>() {
+
+                @Override public Object call() throws Exception {
+                    ccfg.setIndexedTypes(Integer.class, TestValueNegativeInlineSize.class);
+
+                    return null;
+                }
+            },
+            CacheException.class,
+            "Illegal inline size [idxName=TestValueNegativeInlineSize_val_idx, inlineSize=-10]"
+        );
+    }
+
+    /**
+     *
+     */
+    static class TestValueSingleFieldIndexes {
+        /** */
+        @QuerySqlField(index = true, inlineSize = 10)
+        String val0;
+
+        /** */
+        @QuerySqlField(index = true, inlineSize = 20)
+        String val1;
+    }
+
+    /**
+     *
+     */
+    @QueryGroupIndex(name="idx", inlineSize = 10)
+    static class TestValueGroupIndex {
+        /** */
+        @QuerySqlField(orderedGroups = @QuerySqlField.Group(name = "idx", order = 0))
+        String val0;
+
+        /** */
+        @QuerySqlField(orderedGroups = @QuerySqlField.Group(name = "idx", order = 1))
+        String val1;
+    }
+
+    /**
+     *
+     */
+    @QueryGroupIndex(name="idx")
+    static class TestValueGroupIndexInvalidAnnotation {
+        /** */
+        @QuerySqlField(orderedGroups = @QuerySqlField.Group(name = "idx", order = 0))
+        String val0;
+
+        /** */
+        @QuerySqlField(orderedGroups = @QuerySqlField.Group(name = "idx", order = 1), inlineSize = 10)
+        String val1;
+    }
+
+    /**
+     *
+     */
+    static class TestValueNegativeInlineSize {
+         /** */
+         @QuerySqlField(index = true, inlineSize = -10)
+         String val;
+     }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/62cbc29b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
index decc7d5..99b0370 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
@@ -39,6 +39,7 @@ import org.apache.ignite.internal.processors.cache.GridCacheQueryIndexDisabledSe
 import org.apache.ignite.internal.processors.cache.GridCacheQueryIndexingDisabledSelfTest;
 import org.apache.ignite.internal.processors.cache.GridCacheQueryInternalKeysSelfTest;
 import org.apache.ignite.internal.processors.cache.GridCacheQuerySerializationSelfTest;
+import org.apache.ignite.internal.processors.cache.GridCacheQuerySqlFieldInlineSizeSelfTest;
 import org.apache.ignite.internal.processors.cache.IgniteBinaryObjectFieldsQuerySelfTest;
 import org.apache.ignite.internal.processors.cache.IgniteBinaryObjectLocalQueryArgumentsTest;
 import org.apache.ignite.internal.processors.cache.IgniteBinaryObjectQueryArgumentsTest;
@@ -320,6 +321,8 @@ public class IgniteCacheQuerySelfTestSuite extends TestSuite {
         suite.addTestSuite(IgniteSqlRoutingTest.class);
         suite.addTestSuite(LongIndexNameTest.class);
 
+        suite.addTestSuite(GridCacheQuerySqlFieldInlineSizeSelfTest.class);
+
         return suite;
     }
 }