IGNITE-4814: Implemented correct registartion and unregistration of query types on cache start. Moved GridQueryProcessor statics to separate utility class. This closes #1612.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d9d6ff06 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d9d6ff06 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d9d6ff06 Branch: refs/heads/ignite-4768-1 Commit: d9d6ff06c596b28f1a330f71d13c55bffb97373d Parents: aab4f30 Author: devozerov <[email protected]> Authored: Mon Mar 13 12:51:54 2017 +0300 Committer: devozerov <[email protected]> Committed: Mon Mar 13 12:51:54 2017 +0300 ---------------------------------------------------------------------- .../apache/ignite/cache/CacheTypeMetadata.java | 4 +- .../ignite/cache/query/SqlFieldsQuery.java | 4 +- .../org/apache/ignite/cache/query/SqlQuery.java | 6 +- .../apache/ignite/cache/query/TextQuery.java | 4 +- .../configuration/CacheConfiguration.java | 25 +- .../internal/binary/BinaryClassDescriptor.java | 9 +- .../ignite/internal/binary/BinaryContext.java | 4 +- .../apache/ignite/internal/jdbc2/JdbcUtils.java | 4 +- .../cache/GridCacheClearAllRunnable.java | 4 +- .../processors/cache/GridCacheProcessor.java | 11 +- .../processors/cache/GridCacheSwapManager.java | 4 +- .../processors/cache/IgniteCacheProxy.java | 4 +- .../distributed/dht/GridDhtLocalPartition.java | 10 +- .../cache/query/GridCacheQueryAdapter.java | 4 +- .../cache/query/GridCacheQueryManager.java | 5 +- .../IgniteCacheObjectProcessorImpl.java | 4 +- .../internal/processors/igfs/IgfsUtils.java | 6 +- .../processors/query/GridQueryIndexing.java | 8 +- .../processors/query/GridQueryProcessor.java | 1028 ++---------------- .../processors/query/QueryTypeCandidate.java | 66 ++ .../internal/processors/query/QueryUtils.java | 989 +++++++++++++++++ .../query/property/QueryBinaryProperty.java | 6 +- .../query/h2/DmlStatementsProcessor.java | 6 +- .../processors/query/h2/IgniteH2Indexing.java | 18 +- .../query/h2/dml/UpdatePlanBuilder.java | 4 +- .../cache/IgniteCacheQueryLoadSelfTest.java | 4 +- .../h2/GridIndexingSpiAbstractSelfTest.java | 7 +- 27 files changed, 1209 insertions(+), 1039 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/cache/CacheTypeMetadata.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/cache/CacheTypeMetadata.java b/modules/core/src/main/java/org/apache/ignite/cache/CacheTypeMetadata.java index 76dea6a..0c91394 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/CacheTypeMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/CacheTypeMetadata.java @@ -25,7 +25,7 @@ import java.util.LinkedHashSet; import java.util.Map; import javax.cache.CacheException; import org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStore; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; @@ -212,7 +212,7 @@ public class CacheTypeMetadata implements Serializable { Class<?> cls = U.classForName(valType, null); - simpleValType = cls == null ? valType : GridQueryProcessor.typeName(cls); + simpleValType = cls == null ? valType : QueryUtils.typeName(cls); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java b/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java index eac8cfc..1f10ca8 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java @@ -20,7 +20,7 @@ package org.apache.ignite.cache.query; import java.util.List; import java.util.concurrent.TimeUnit; import org.apache.ignite.IgniteCache; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.S; @@ -147,7 +147,7 @@ public class SqlFieldsQuery extends Query<List<?>> { * @return {@code this} For chaining. */ public SqlFieldsQuery setTimeout(int timeout, TimeUnit timeUnit) { - this.timeout = GridQueryProcessor.validateTimeout(timeout, timeUnit); + this.timeout = QueryUtils.validateTimeout(timeout, timeUnit); return this; } http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/cache/query/SqlQuery.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/SqlQuery.java b/modules/core/src/main/java/org/apache/ignite/cache/query/SqlQuery.java index 5e36d20..d77e5ce 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/query/SqlQuery.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/query/SqlQuery.java @@ -20,7 +20,7 @@ package org.apache.ignite.cache.query; import java.util.concurrent.TimeUnit; import javax.cache.Cache; import org.apache.ignite.IgniteCache; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.S; @@ -178,7 +178,7 @@ public final class SqlQuery<K, V> extends Query<Cache.Entry<K, V>> { * @return {@code this} For chaining. */ public SqlQuery<K, V> setTimeout(int timeout, TimeUnit timeUnit) { - this.timeout = GridQueryProcessor.validateTimeout(timeout, timeUnit); + this.timeout = QueryUtils.validateTimeout(timeout, timeUnit); return this; } @@ -198,7 +198,7 @@ public final class SqlQuery<K, V> extends Query<Cache.Entry<K, V>> { * @return {@code this} For chaining. */ public SqlQuery setType(Class<?> type) { - return setType(GridQueryProcessor.typeName(type)); + return setType(QueryUtils.typeName(type)); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/cache/query/TextQuery.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/TextQuery.java b/modules/core/src/main/java/org/apache/ignite/cache/query/TextQuery.java index 4eba432..23c1bc5 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/query/TextQuery.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/query/TextQuery.java @@ -19,7 +19,7 @@ package org.apache.ignite.cache.query; import javax.cache.Cache; import org.apache.ignite.IgniteCache; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.S; @@ -76,7 +76,7 @@ public final class TextQuery<K, V> extends Query<Cache.Entry<K, V>> { * @return {@code this} For chaining. */ public TextQuery<K, V> setType(Class<?> type) { - return setType(GridQueryProcessor.typeName(type)); + return setType(QueryUtils.typeName(type)); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java index 20308fd..a47f07c 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java @@ -66,6 +66,7 @@ import org.apache.ignite.cache.store.CacheStore; import org.apache.ignite.cache.store.CacheStoreSessionListener; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.F; @@ -77,10 +78,6 @@ import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.plugin.CachePluginConfiguration; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.internal.processors.query.GridQueryProcessor._VAL; -import static org.apache.ignite.internal.processors.query.GridQueryProcessor.isGeometryClass; -import static org.apache.ignite.internal.processors.query.GridQueryProcessor.isSqlType; - /** * This class defines grid cache configuration. This configuration is passed to * grid via {@link IgniteConfiguration#getCacheConfiguration()} method. It defines all configuration @@ -2296,10 +2293,10 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> { txtIdx.setIndexType(QueryIndexType.FULLTEXT); - txtIdx.setFieldNames(Arrays.asList(_VAL), true); + txtIdx.setFieldNames(Arrays.asList(QueryUtils._VAL), true); } else - txtIdx.getFields().put(_VAL, true); + txtIdx.getFields().put(QueryUtils._VAL, true); } if (txtIdx != null) @@ -2318,7 +2315,7 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> { private static Class<?> mask(Class<?> cls) { assert cls != null; - return isSqlType(cls) ? cls : Object.class; + return QueryUtils.isSqlType(cls) ? cls : Object.class; } /** @@ -2351,13 +2348,14 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> { */ private static void processAnnotationsInClass(boolean key, Class<?> cls, TypeDescriptor type, @Nullable ClassProperty parent) { - if (U.isJdk(cls) || isGeometryClass(cls)) { - if (parent == null && !key && isSqlType(cls)) { // We have to index primitive _val. - String idxName = _VAL + "_idx"; + if (U.isJdk(cls) || QueryUtils.isGeometryClass(cls)) { + if (parent == null && !key && QueryUtils.isSqlType(cls)) { // We have to index primitive _val. + String idxName = QueryUtils._VAL + "_idx"; - type.addIndex(idxName, isGeometryClass(cls) ? QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED); + type.addIndex(idxName, QueryUtils.isGeometryClass(cls) ? + QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED); - type.addFieldToIndex(idxName, _VAL, 0, false); + type.addFieldToIndex(idxName, QueryUtils._VAL, 0, false); } return; @@ -2454,7 +2452,8 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> { if (sqlAnn.index()) { String idxName = prop.alias() + "_idx"; - desc.addIndex(idxName, isGeometryClass(prop.type()) ? QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED); + desc.addIndex(idxName, QueryUtils.isGeometryClass(prop.type()) ? + QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED); desc.addFieldToIndex(idxName, prop.fullName(), 0, sqlAnn.descending()); } http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java index 9b3a377..32db1f7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java @@ -41,7 +41,7 @@ import org.apache.ignite.binary.BinaryReflectiveSerializer; import org.apache.ignite.binary.BinarySerializer; import org.apache.ignite.binary.Binarylizable; import org.apache.ignite.internal.processors.cache.CacheObjectImpl; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.internal.util.IgniteUtils; import org.apache.ignite.internal.util.tostring.GridToStringExclude; @@ -52,6 +52,8 @@ import org.apache.ignite.marshaller.MarshallerExclusions; import org.apache.ignite.marshaller.optimized.OptimizedMarshaller; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.internal.processors.query.QueryUtils.isGeometryClass; + /** * Binary class descriptor. */ @@ -158,7 +160,7 @@ public class BinaryClassDescriptor { initialSerializer = serializer; // If serializer is not defined at this point, then we have to use OptimizedMarshaller. - useOptMarshaller = serializer == null || GridQueryProcessor.isGeometryClass(cls); + useOptMarshaller = serializer == null || isGeometryClass(cls); // Reset reflective serializer so that we rely on existing reflection-based serialization. if (serializer instanceof BinaryReflectiveSerializer) @@ -191,8 +193,7 @@ public class BinaryClassDescriptor { mode = serializer != null ? BinaryWriteMode.BINARY : BinaryUtils.mode(cls); } - if (useOptMarshaller && userType && !U.isIgnite(cls) && !U.isJdk(cls) && - !GridQueryProcessor.isGeometryClass(cls)) { + if (useOptMarshaller && userType && !U.isIgnite(cls) && !U.isJdk(cls) && !QueryUtils.isGeometryClass(cls)) { U.warn(ctx.log(), "Class \"" + cls.getName() + "\" cannot be serialized using " + BinaryMarshaller.class.getSimpleName() + " because it either implements Externalizable interface " + "or have writeObject/readObject methods. " + OptimizedMarshaller.class.getSimpleName() + " will be " + http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java index fb5627e..2cd9105 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java @@ -79,7 +79,7 @@ import org.apache.ignite.internal.processors.igfs.meta.IgfsMetaUpdateTimesProces import org.apache.ignite.internal.processors.platform.PlatformJavaObjectFactoryProxy; import org.apache.ignite.internal.processors.platform.websession.PlatformDotNetSessionData; import org.apache.ignite.internal.processors.platform.websession.PlatformDotNetSessionLockResult; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.lang.GridMapEntry; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.T2; @@ -375,7 +375,7 @@ public class BinaryContext { return false; return marshCtx.isSystemType(cls.getName()) || serializerForClass(cls) == null || - GridQueryProcessor.isGeometryClass(cls); + QueryUtils.isGeometryClass(cls); } else return desc.useOptimizedMarshaller(); http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcUtils.java index 38a838e..37304fc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcUtils.java @@ -23,7 +23,7 @@ import java.sql.Timestamp; import java.sql.Types; import java.util.Date; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import static java.sql.Types.BIGINT; import static java.sql.Types.BINARY; @@ -139,6 +139,6 @@ public class JdbcUtils { * @return Whether given type is SQL-compliant. */ static boolean isSqlType(Class<?> cls) { - return GridQueryProcessor.isSqlType(cls) || cls == URL.class; + return QueryUtils.isSqlType(cls) || cls == URL.class; } } http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java index 9e7f329..8c47554 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java @@ -22,7 +22,7 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; @@ -96,7 +96,7 @@ public class GridCacheClearAllRunnable<K, V> implements Runnable { } if (ctx.swap().swapEnabled()) { - if (GridQueryProcessor.isEnabled(ctx.config())) { + if (QueryUtils.isEnabled(ctx.config())) { Iterator<KeyCacheObject> it = null; try { http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java index 4e06427..32e9150 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java @@ -63,6 +63,7 @@ import org.apache.ignite.configuration.NearCacheConfiguration; import org.apache.ignite.configuration.TransactionConfiguration; import org.apache.ignite.events.EventType; import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions; import org.apache.ignite.internal.IgniteClientDisconnectedCheckedException; import org.apache.ignite.internal.IgniteComponentType; @@ -99,9 +100,7 @@ import org.apache.ignite.internal.processors.cache.transactions.IgniteTransactio import org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager; import org.apache.ignite.internal.processors.cache.version.GridCacheVersionManager; import org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessor; -import org.apache.ignite.internal.processors.igfs.IgfsUtils; import org.apache.ignite.internal.processors.plugin.CachePluginManager; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; import org.apache.ignite.internal.processors.timeout.GridTimeoutObject; import org.apache.ignite.internal.util.F0; import org.apache.ignite.internal.util.future.GridCompoundFuture; @@ -493,7 +492,7 @@ public class GridCacheProcessor extends GridProcessorAdapter { } if (cc.getMemoryMode() == CacheMemoryMode.OFFHEAP_VALUES) { - if (GridQueryProcessor.isEnabled(cc)) + if (QueryUtils.isEnabled(cc)) throw new IgniteCheckedException("Cannot have query indexing enabled while values are stored off-heap. " + "You must either disable query indexing or disable off-heap values only flag for cache: " + U.maskName(cc.getName())); @@ -1570,7 +1569,7 @@ public class GridCacheProcessor extends GridProcessorAdapter { String cacheName = ccfg.getName(); - if ((inclLoc || ccfg.getCacheMode() != LOCAL) && GridQueryProcessor.isEnabled(ccfg)) + if ((inclLoc || ccfg.getCacheMode() != LOCAL) && QueryUtils.isEnabled(ccfg)) return publicJCache(cacheName); } @@ -1580,7 +1579,7 @@ public class GridCacheProcessor extends GridProcessorAdapter { CacheConfiguration ccfg = desc.cacheConfiguration(); - if (ccfg.getCacheMode() != LOCAL && GridQueryProcessor.isEnabled(ccfg)) { + if (ccfg.getCacheMode() != LOCAL && QueryUtils.isEnabled(ccfg)) { dynamicStartCache(null, ccfg.getName(), null, false, true, true).get(); return publicJCache(ccfg.getName()); @@ -3534,7 +3533,7 @@ public class GridCacheProcessor extends GridProcessorAdapter { for (Map.Entry<String, DynamicCacheDescriptor> e : registeredCaches.entrySet()) { CacheConfiguration ccfg = e.getValue().cacheConfiguration(); - if (!caches.containsKey(maskNull(ccfg.getName())) && GridQueryProcessor.isEnabled(ccfg)) + if (!caches.containsKey(maskNull(ccfg.getName())) && QueryUtils.isEnabled(ccfg)) dynamicStartCache(null, ccfg.getName(), null, false, true, true).get(); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java index 159b3b8..3fc6075 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java @@ -40,7 +40,7 @@ import org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.processors.cache.version.GridCacheVersionAware; import org.apache.ignite.internal.processors.offheap.GridOffHeapProcessor; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.GridCloseableIteratorAdapter; import org.apache.ignite.internal.util.GridConcurrentHashSet; import org.apache.ignite.internal.util.GridEmptyCloseableIterator; @@ -214,7 +214,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { GridOffHeapEvictListener lsnr; - if (swapEnabled || GridQueryProcessor.isEnabled(cctx.config())) { + if (swapEnabled || QueryUtils.isEnabled(cctx.config())) { unwindOffheapEvicts = true; lsnr = new GridOffHeapEvictListener() { http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java index f806d05..0e8c263 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java @@ -68,7 +68,7 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.query.CacheQuery; import org.apache.ignite.internal.processors.cache.query.CacheQueryFuture; import org.apache.ignite.internal.processors.cache.query.GridCacheQueryType; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.GridCloseableIteratorAdapter; import org.apache.ignite.internal.util.GridEmptyIterator; import org.apache.ignite.internal.util.future.IgniteFutureImpl; @@ -846,7 +846,7 @@ public class IgniteCacheProxy<K, V> extends AsyncSupportAdapter<IgniteCache<K, V * @throws CacheException If query indexing disabled for sql query. */ private void validate(Query qry) { - if (!GridQueryProcessor.isEnabled(ctx.config()) && !(qry instanceof ScanQuery) && + if (!QueryUtils.isEnabled(ctx.config()) && !(qry instanceof ScanQuery) && !(qry instanceof ContinuousQuery) && !(qry instanceof SpiQuery)) throw new CacheException("Indexing is disabled for cache: " + ctx.cache().name() + ". Use setIndexedTypes or setTypeMetadata methods on CacheConfiguration to enable."); http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java index 9f8498a..693a049 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java @@ -44,7 +44,7 @@ import org.apache.ignite.internal.processors.cache.KeyCacheObject; import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPreloader; import org.apache.ignite.internal.processors.cache.extras.GridCacheObsoleteEntryExtras; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.lang.GridCloseableIterator; import org.apache.ignite.internal.util.tostring.GridToStringExclude; @@ -523,7 +523,7 @@ public class GridDhtLocalPartition implements Comparable<GridDhtLocalPartition>, int ord = (int)(reservations >> 32); - if (isEmpty() && !GridQueryProcessor.isEnabled(cctx.config()) && + if (isEmpty() && !QueryUtils.isEnabled(cctx.config()) && ord == RENTING.ordinal() && (reservations & 0xFFFF) == 0 && casState(reservations, EVICTED)) { if (log.isDebugEnabled()) @@ -576,7 +576,7 @@ public class GridDhtLocalPartition implements Comparable<GridDhtLocalPartition>, if (log.isDebugEnabled()) log.debug("Evicted partition: " + this); - if (!GridQueryProcessor.isEnabled(cctx.config())) + if (!QueryUtils.isEnabled(cctx.config())) clearSwap(); if (cctx.isDrEnabled()) @@ -599,7 +599,7 @@ public class GridDhtLocalPartition implements Comparable<GridDhtLocalPartition>, */ private void clearSwap() { assert state() == EVICTED; - assert !GridQueryProcessor.isEnabled(cctx.config()) : "Indexing needs to have unswapped values."; + assert !QueryUtils.isEnabled(cctx.config()) : "Indexing needs to have unswapped values."; try { GridCloseableIterator<Map.Entry<byte[], GridCacheSwapEntry>> it = cctx.swap().iterator(id); @@ -693,7 +693,7 @@ public class GridDhtLocalPartition implements Comparable<GridDhtLocalPartition>, GridCloseableIterator<Map.Entry<byte[], GridCacheSwapEntry>> swapIt = null; - if (swap && GridQueryProcessor.isEnabled(cctx.config())) { // Indexing needs to unswap cache values. + if (swap && QueryUtils.isEnabled(cctx.config())) { // Indexing needs to unswap cache values. Iterator<GridDhtCacheEntry> unswapIt = null; try { http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryAdapter.java index 3ecacf8..0372868 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryAdapter.java @@ -42,7 +42,7 @@ import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtUnreservedPartitionException; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.GridCloseableIteratorAdapter; import org.apache.ignite.internal.util.GridEmptyCloseableIterator; import org.apache.ignite.internal.util.lang.GridCloseableIterator; @@ -433,7 +433,7 @@ public class GridCacheQueryAdapter<T> implements CacheQuery<T> { * @throws IgniteCheckedException If query is invalid. */ public void validate() throws IgniteCheckedException { - if ((type != SCAN && type != SET && type != SPI) && !GridQueryProcessor.isEnabled(cctx.config())) + if ((type != SCAN && type != SET && type != SPI) && !QueryUtils.isEnabled(cctx.config())) throw new IgniteCheckedException("Indexing is disabled for cache: " + cctx.cache().name()); } http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java index 93dee54..5ce3353 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java @@ -84,6 +84,7 @@ import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata; import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; import org.apache.ignite.internal.processors.query.GridQueryProcessor; import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.processors.task.GridInternal; import org.apache.ignite.internal.util.GridBoundedPriorityQueue; import org.apache.ignite.internal.util.GridCloseableIteratorAdapter; @@ -220,7 +221,7 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte @Override public void start0() throws IgniteCheckedException { CacheConfiguration ccfg = cctx.config(); - qryProcEnabled = GridQueryProcessor.isEnabled(ccfg); + qryProcEnabled = QueryUtils.isEnabled(ccfg); qryProc = cctx.kernalContext().query(); @@ -484,7 +485,7 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte public void remove(CacheObject key, CacheObject val) throws IgniteCheckedException { assert key != null; - if (!GridQueryProcessor.isEnabled(cctx.config()) && !(key instanceof GridCacheInternal)) + if (!QueryUtils.isEnabled(cctx.config()) && !(key instanceof GridCacheInternal)) return; // No-op. if (!enterBusy()) http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java index 9f37f6e..ff7c4ba 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java @@ -37,7 +37,7 @@ import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.GridCacheDefaultAffinityKeyMapper; import org.apache.ignite.internal.processors.cache.KeyCacheObject; import org.apache.ignite.internal.processors.cache.KeyCacheObjectImpl; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.internal.util.IgniteUtils; import org.apache.ignite.internal.util.typedef.internal.CU; @@ -245,7 +245,7 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme CacheMemoryMode memMode = ccfg.getMemoryMode(); boolean storeVal = !ccfg.isCopyOnRead() || (!isBinaryEnabled(ccfg) && - (GridQueryProcessor.isEnabled(ccfg) || ctx.config().isPeerClassLoadingEnabled())); + (QueryUtils.isEnabled(ccfg) || ctx.config().isPeerClassLoadingEnabled())); CacheObjectContext res = new CacheObjectContext(ctx, ccfg.getName(), http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsUtils.java index ec12884..3cf88d3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsUtils.java @@ -44,7 +44,7 @@ import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.cluster.ClusterTopologyServerNotFoundException; import org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager; import org.apache.ignite.internal.processors.cache.IgniteInternalCache; -import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.IgniteUtils; import org.apache.ignite.internal.util.future.IgniteFutureImpl; import org.apache.ignite.internal.util.lang.IgniteOutClosureX; @@ -475,10 +475,10 @@ public class IgfsUtils { CacheConfiguration ccfgMeta = cfg.getMetaCacheConfiguration(); - if (GridQueryProcessor.isEnabled(ccfgData)) + if (QueryUtils.isEnabled(ccfgData)) throw new IgniteCheckedException("IGFS data cache cannot start with enabled query indexing."); - if (GridQueryProcessor.isEnabled(ccfgMeta)) + if (QueryUtils.isEnabled(ccfgMeta)) throw new IgniteCheckedException("IGFS metadata cache cannot start with enabled query indexing."); if (ccfgMeta.getAtomicityMode() != TRANSACTIONAL) http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java index c225390..4c32776 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java @@ -135,19 +135,21 @@ public interface GridQueryIndexing { /** * Registers cache. * + * @param spaceName Space name. * @param cctx Cache context. * @param ccfg Cache configuration. * @throws IgniteCheckedException If failed. */ - public void registerCache(GridCacheContext<?,?> cctx, CacheConfiguration<?,?> ccfg) throws IgniteCheckedException; + public void registerCache(String spaceName, GridCacheContext<?,?> cctx, CacheConfiguration<?,?> ccfg) + throws IgniteCheckedException; /** * Unregisters cache. * - * @param ccfg Cache configuration. + * @param spaceName Space name. * @throws IgniteCheckedException If failed to drop cache schema. */ - public void unregisterCache(CacheConfiguration<?, ?> ccfg) throws IgniteCheckedException; + public void unregisterCache(String spaceName) throws IgniteCheckedException; /** * Registers type if it was not known before or updates it otherwise. http://git-wip-us.apache.org/repos/asf/ignite/blob/d9d6ff06/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java index f6cac1a..219373c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java @@ -19,21 +19,12 @@ package org.apache.ignite.internal.processors.query; import java.sql.PreparedStatement; import java.sql.SQLException; -import java.util.concurrent.TimeUnit; -import java.lang.reflect.Method; -import java.math.BigDecimal; -import java.sql.Time; -import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; -import java.util.UUID; import java.util.concurrent.ConcurrentMap; import javax.cache.Cache; import javax.cache.CacheException; @@ -43,41 +34,28 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.binary.Binarylizable; import org.apache.ignite.cache.CacheTypeMetadata; import org.apache.ignite.cache.QueryEntity; -import org.apache.ignite.cache.QueryIndex; -import org.apache.ignite.cache.QueryIndexType; -import org.apache.ignite.cache.affinity.AffinityKeyMapper; import org.apache.ignite.cache.query.QueryCursor; import org.apache.ignite.cache.query.SqlFieldsQuery; import org.apache.ignite.cache.query.SqlQuery; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.events.CacheQueryExecutedEvent; import org.apache.ignite.internal.GridKernalContext; -import org.apache.ignite.internal.binary.BinaryMarshaller; import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.CacheObjectContext; import org.apache.ignite.internal.processors.cache.GridCacheContext; -import org.apache.ignite.internal.processors.cache.GridCacheDefaultAffinityKeyMapper; import org.apache.ignite.internal.processors.cache.IgniteCacheProxy; import org.apache.ignite.internal.processors.cache.QueryCursorImpl; -import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl; import org.apache.ignite.internal.processors.cache.query.CacheQueryFuture; import org.apache.ignite.internal.processors.cache.query.CacheQueryType; import org.apache.ignite.internal.processors.cache.query.GridCacheQueryType; -import org.apache.ignite.internal.processors.query.property.QueryBinaryProperty; -import org.apache.ignite.internal.processors.query.property.QueryClassProperty; -import org.apache.ignite.internal.processors.query.property.QueryFieldAccessor; -import org.apache.ignite.internal.processors.query.property.QueryMethodsAccessor; -import org.apache.ignite.internal.processors.query.property.QueryPropertyAccessor; -import org.apache.ignite.internal.processors.query.property.QueryReadOnlyMethodsAccessor; import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor; import org.apache.ignite.internal.util.GridSpinBusyLock; import org.apache.ignite.internal.util.lang.GridCloseableIterator; import org.apache.ignite.internal.util.lang.GridClosureException; import org.apache.ignite.internal.util.lang.IgniteOutClosureX; import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteBiTuple; import org.apache.ignite.lang.IgniteFuture; @@ -92,34 +70,9 @@ import static org.apache.ignite.internal.IgniteComponentType.INDEXING; * Indexing processor. */ public class GridQueryProcessor extends GridProcessorAdapter { - /** */ - public static final String _VAL = "_val"; - - /** */ - private static final Class<?> GEOMETRY_CLASS = U.classForName("com.vividsolutions.jts.geom.Geometry", null); - /** Queries detail metrics eviction frequency. */ private static final int QRY_DETAIL_METRICS_EVICTION_FREQ = 3_000; - /** */ - private static final Set<Class<?>> SQL_TYPES = new HashSet<>(F.<Class<?>>asList( - Integer.class, - Boolean.class, - Byte.class, - Short.class, - Long.class, - BigDecimal.class, - Double.class, - Float.class, - Time.class, - Timestamp.class, - java.util.Date.class, - java.sql.Date.class, - String.class, - UUID.class, - byte[].class - )); - /** For tests. */ public static Class<? extends GridQueryIndexing> idxCls; @@ -176,16 +129,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { } /** - * @param ccfg Cache configuration. - * @return {@code true} If query index must be enabled for this cache. - */ - public static boolean isEnabled(CacheConfiguration<?,?> ccfg) { - return !F.isEmpty(ccfg.getIndexedTypes()) || - !F.isEmpty(ccfg.getTypeMetadata()) || - !F.isEmpty(ccfg.getQueryEntities()); - } - - /** * @return {@code true} If indexing module is in classpath and successfully initialized. */ public boolean moduleEnabled() { @@ -196,264 +139,70 @@ public class GridQueryProcessor extends GridProcessorAdapter { * @param cctx Cache context. * @throws IgniteCheckedException If failed. */ + @SuppressWarnings("deprecation") private void initializeCache(GridCacheContext<?, ?> cctx) throws IgniteCheckedException { - CacheConfiguration<?,?> ccfg = cctx.config(); - - idx.registerCache(cctx, cctx.config()); - - try { - List<Class<?>> mustDeserializeClss = null; - - boolean binaryEnabled = ctx.cacheObjects().isBinaryEnabled(ccfg); - - CacheObjectContext coCtx = binaryEnabled ? ctx.cacheObjects().contextForCache(ccfg) : null; - - if (!F.isEmpty(ccfg.getQueryEntities())) { - for (QueryEntity qryEntity : ccfg.getQueryEntities()) { - if (F.isEmpty(qryEntity.getValueType())) - throw new IgniteCheckedException("Value type is not set: " + qryEntity); - - QueryTypeDescriptorImpl desc = new QueryTypeDescriptorImpl(); - - // Key and value classes still can be available if they are primitive or JDK part. - // We need that to set correct types for _key and _val columns. - Class<?> keyCls = U.classForName(qryEntity.getKeyType(), null); - Class<?> valCls = U.classForName(qryEntity.getValueType(), null); - - // If local node has the classes and they are externalizable, we must use reflection properties. - boolean keyMustDeserialize = mustDeserializeBinary(keyCls); - boolean valMustDeserialize = mustDeserializeBinary(valCls); - - boolean keyOrValMustDeserialize = keyMustDeserialize || valMustDeserialize; - - if (keyCls == null) - keyCls = Object.class; - - String simpleValType = ((valCls == null) ? typeName(qryEntity.getValueType()) : typeName(valCls)); - - desc.name(simpleValType); + String space = cctx.name(); - desc.tableName(qryEntity.getTableName()); - - if (binaryEnabled && !keyOrValMustDeserialize) { - // Safe to check null. - if (SQL_TYPES.contains(valCls)) - desc.valueClass(valCls); - else - desc.valueClass(Object.class); - - if (SQL_TYPES.contains(keyCls)) - desc.keyClass(keyCls); - else - desc.keyClass(Object.class); - } - else { - if (keyCls == null) - throw new IgniteCheckedException("Failed to find key class in the node classpath " + - "(use default marshaller to enable binary objects): " + qryEntity.getKeyType()); - - if (valCls == null) - throw new IgniteCheckedException("Failed to find value class in the node classpath " + - "(use default marshaller to enable binary objects) : " + qryEntity.getValueType()); - - desc.valueClass(valCls); - desc.keyClass(keyCls); - } - - desc.keyTypeName(qryEntity.getKeyType()); - desc.valueTypeName(qryEntity.getValueType()); - - if (binaryEnabled && keyOrValMustDeserialize) { - if (mustDeserializeClss == null) - mustDeserializeClss = new ArrayList<>(); - - if (keyMustDeserialize) - mustDeserializeClss.add(keyCls); - - if (valMustDeserialize) - mustDeserializeClss.add(valCls); - } - - QueryTypeIdKey typeId; - QueryTypeIdKey altTypeId = null; - - if (valCls == null || (binaryEnabled && !keyOrValMustDeserialize)) { - processBinaryMeta(qryEntity, desc); - - typeId = new QueryTypeIdKey(ccfg.getName(), ctx.cacheObjects().typeId(qryEntity.getValueType())); - - if (valCls != null) - altTypeId = new QueryTypeIdKey(ccfg.getName(), valCls); - - if (!cctx.customAffinityMapper() && qryEntity.getKeyType() != null) { - // Need to setup affinity key for distributed joins. - String affField = ctx.cacheObjects().affinityField(qryEntity.getKeyType()); - - if (affField != null) - desc.affinityKey(affField); - } - } - else { - processClassMeta(qryEntity, desc, coCtx); - - AffinityKeyMapper keyMapper = cctx.config().getAffinityMapper(); - - if (keyMapper instanceof GridCacheDefaultAffinityKeyMapper) { - String affField = - ((GridCacheDefaultAffinityKeyMapper)keyMapper).affinityKeyPropertyName(desc.keyClass()); - - if (affField != null) - desc.affinityKey(affField); - } + CacheConfiguration<?,?> ccfg = cctx.config(); - typeId = new QueryTypeIdKey(ccfg.getName(), valCls); - altTypeId = new QueryTypeIdKey(ccfg.getName(), ctx.cacheObjects().typeId(qryEntity.getValueType())); - } + // Prepare candidates. + List<Class<?>> mustDeserializeClss = new ArrayList<>(); - addTypeByName(ccfg, desc); - types.put(typeId, desc); + Collection<QueryTypeCandidate> cands = new ArrayList<>(); - if (altTypeId != null) - types.put(altTypeId, desc); + if (!F.isEmpty(ccfg.getQueryEntities())) { + for (QueryEntity qryEntity : ccfg.getQueryEntities()) { + QueryTypeCandidate cand = QueryUtils.typeForQueryEntity(space, cctx, qryEntity, mustDeserializeClss); - desc.registered(idx.registerType(ccfg.getName(), desc)); - } + cands.add(cand); } + } - if (!F.isEmpty(ccfg.getTypeMetadata())) { - for (CacheTypeMetadata meta : ccfg.getTypeMetadata()) { - if (F.isEmpty(meta.getValueType())) - throw new IgniteCheckedException("Value type is not set: " + meta); - - if (meta.getQueryFields().isEmpty() && meta.getAscendingFields().isEmpty() && - meta.getDescendingFields().isEmpty() && meta.getGroups().isEmpty()) - continue; - - QueryTypeDescriptorImpl desc = new QueryTypeDescriptorImpl(); - - // Key and value classes still can be available if they are primitive or JDK part. - // We need that to set correct types for _key and _val columns. - Class<?> keyCls = U.classForName(meta.getKeyType(), null); - Class<?> valCls = U.classForName(meta.getValueType(), null); - - // If local node has the classes and they are externalizable, we must use reflection properties. - boolean keyMustDeserialize = mustDeserializeBinary(keyCls); - boolean valMustDeserialize = mustDeserializeBinary(valCls); - - boolean keyOrValMustDeserialize = keyMustDeserialize || valMustDeserialize; - - if (keyCls == null) - keyCls = Object.class; - - String simpleValType = meta.getSimpleValueType(); - - if (simpleValType == null) - simpleValType = typeName(meta.getValueType()); - - desc.name(simpleValType); - - if (binaryEnabled && !keyOrValMustDeserialize) { - // Safe to check null. - if (SQL_TYPES.contains(valCls)) - desc.valueClass(valCls); - else - desc.valueClass(Object.class); - - if (SQL_TYPES.contains(keyCls)) - desc.keyClass(keyCls); - else - desc.keyClass(Object.class); - } - else { - desc.valueClass(valCls); - desc.keyClass(keyCls); - } - - desc.keyTypeName(meta.getKeyType()); - desc.valueTypeName(meta.getValueType()); - - if (binaryEnabled && keyOrValMustDeserialize) { - if (mustDeserializeClss == null) - mustDeserializeClss = new ArrayList<>(); - - if (keyMustDeserialize) - mustDeserializeClss.add(keyCls); - - if (valMustDeserialize) - mustDeserializeClss.add(valCls); - } - - QueryTypeIdKey typeId; - QueryTypeIdKey altTypeId = null; - - if (valCls == null || (binaryEnabled && !keyOrValMustDeserialize)) { - processBinaryMeta(meta, desc); - - typeId = new QueryTypeIdKey(ccfg.getName(), ctx.cacheObjects().typeId(meta.getValueType())); + if (!F.isEmpty(ccfg.getTypeMetadata())) { + for (CacheTypeMetadata meta : ccfg.getTypeMetadata()) { + QueryTypeCandidate cand = QueryUtils.typeForCacheMetadata(space, cctx, meta, mustDeserializeClss); - if (valCls != null) - altTypeId = new QueryTypeIdKey(ccfg.getName(), valCls); - } - else { - processClassMeta(meta, desc, coCtx); + if (cand != null) + cands.add(cand); + } + } - typeId = new QueryTypeIdKey(ccfg.getName(), valCls); - altTypeId = new QueryTypeIdKey(ccfg.getName(), ctx.cacheObjects().typeId(meta.getValueType())); - } + // Register candidates. + idx.registerCache(space, cctx, cctx.config()); - addTypeByName(ccfg, desc); - types.put(typeId, desc); + try { + for (QueryTypeCandidate cand : cands) { + QueryTypeIdKey typeId = cand.typeId(); + QueryTypeIdKey altTypeId = cand.alternativeTypeId(); + QueryTypeDescriptorImpl desc = cand.descriptor(); - if (altTypeId != null) - types.put(altTypeId, desc); + if (typesByName.putIfAbsent(new QueryTypeNameKey(space, desc.name()), desc) != null) + throw new IgniteCheckedException("Type with name '" + desc.name() + "' already indexed " + + "in cache '" + space + "'."); - desc.registered(idx.registerType(ccfg.getName(), desc)); - } - } + types.put(typeId, desc); - // Indexed types must be translated to CacheTypeMetadata in CacheConfiguration. + if (altTypeId != null) + types.put(altTypeId, desc); - if (mustDeserializeClss != null) { - U.warn(log, "Some classes in query configuration cannot be written in binary format " + - "because they either implement Externalizable interface or have writeObject/readObject methods. " + - "Instances of these classes will be deserialized in order to build indexes. Please ensure that " + - "all nodes have these classes in classpath. To enable binary serialization either implement " + - Binarylizable.class.getSimpleName() + " interface or set explicit serializer using " + - "BinaryTypeConfiguration.setSerializer() method: " + mustDeserializeClss); + desc.registered(idx.registerType(space, desc)); } } catch (IgniteCheckedException | RuntimeException e) { - idx.unregisterCache(ccfg); + unregisterCache0(space); throw e; } - } - /** - * Check whether type still must be deserialized when binary marshaller is set. - * - * @param cls Class. - * @return {@code True} if will be deserialized. - */ - private boolean mustDeserializeBinary(Class cls) { - if (cls != null && ctx.config().getMarshaller() instanceof BinaryMarshaller) { - CacheObjectBinaryProcessorImpl proc0 = (CacheObjectBinaryProcessorImpl)ctx.cacheObjects(); - - return proc0.binaryContext().mustDeserialize(cls); + // Warn about possible implicit deserialization. + if (!mustDeserializeClss.isEmpty()) { + U.warn(log, "Some classes in query configuration cannot be written in binary format " + + "because they either implement Externalizable interface or have writeObject/readObject methods. " + + "Instances of these classes will be deserialized in order to build indexes. Please ensure that " + + "all nodes have these classes in classpath. To enable binary serialization either implement " + + Binarylizable.class.getSimpleName() + " interface or set explicit serializer using " + + "BinaryTypeConfiguration.setSerializer() method: " + mustDeserializeClss); } - else - return false; - } - - /** - * @param ccfg Cache configuration. - * @param desc Type descriptor. - * @throws IgniteCheckedException If failed. - */ - private void addTypeByName(CacheConfiguration<?, ?> ccfg, QueryTypeDescriptorImpl desc) throws IgniteCheckedException { - if (typesByName.putIfAbsent(new QueryTypeNameKey(ccfg.getName(), desc.name()), desc) != null) - throw new IgniteCheckedException("Type with name '" + desc.name() + "' already indexed " + - "in cache '" + ccfg.getName() + "'."); } /** {@inheritDoc} */ @@ -522,26 +271,40 @@ public class GridQueryProcessor extends GridProcessorAdapter { return; try { - idx.unregisterCache(cctx.config()); + unregisterCache0(cctx.name()); + } + finally { + busyLock.leaveBusy(); + } + } + + /** + * Unregister cache. + * + * @param space Space. + */ + private void unregisterCache0(String space) { + assert idx != null; + try { + idx.unregisterCache(space); + } + catch (Exception e) { + U.error(log, "Failed to clear indexing on cache unregister (will ignore): " + space, e); + } + finally { Iterator<Map.Entry<QueryTypeIdKey, QueryTypeDescriptorImpl>> it = types.entrySet().iterator(); while (it.hasNext()) { Map.Entry<QueryTypeIdKey, QueryTypeDescriptorImpl> entry = it.next(); - if (F.eq(cctx.name(), entry.getKey().space())) { + if (F.eq(space, entry.getKey().space())) { it.remove(); - typesByName.remove(new QueryTypeNameKey(cctx.name(), entry.getValue().name())); + typesByName.remove(new QueryTypeNameKey(space, entry.getValue().name())); } } } - catch (IgniteCheckedException e) { - U.error(log, "Failed to clear indexing on cache stop (will ignore): " + cctx.name(), e); - } - finally { - busyLock.leaveBusy(); - } } /** @@ -562,7 +325,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { * @param expirationTime Expiration time or 0 if never expires. * @throws IgniteCheckedException In case of error. */ - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "ConstantConditions"}) public void store(final String space, final CacheObject key, final CacheObject val, byte[] ver, long expirationTime) throws IgniteCheckedException { assert key != null; @@ -571,8 +334,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { if (log.isDebugEnabled()) log.debug("Store [space=" + space + ", key=" + key + ", val=" + val + "]"); - CacheObjectContext coctx = null; - if (idx == null) return; @@ -580,8 +341,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { return; try { - if (coctx == null) - coctx = cacheObjectContext(space); + CacheObjectContext coctx = cacheObjectContext(space); Class<?> valCls = null; @@ -847,28 +607,11 @@ public class GridQueryProcessor extends GridProcessorAdapter { } /** - * @param timeout Timeout. - * @param timeUnit Time unit. - * @return Converted time. - */ - public static int validateTimeout(int timeout, TimeUnit timeUnit) { - A.ensure(timeUnit != TimeUnit.MICROSECONDS && timeUnit != TimeUnit.NANOSECONDS, - "timeUnit minimal resolution is millisecond."); - - A.ensure(timeout >= 0, "timeout value should be non-negative."); - - long tmp = TimeUnit.MILLISECONDS.convert(timeout, timeUnit); - - A.ensure(timeout <= Integer.MAX_VALUE, "timeout value too large."); - - return (int) tmp; - } - - /** * @param cctx Cache context. * @param qry Query. * @return Iterator. */ + @SuppressWarnings("unchecked") public QueryCursor<List<?>> queryLocalFields(final GridCacheContext<?, ?> cctx, final SqlFieldsQuery qry) { if (!busyLock.enterBusy()) throw new IllegalStateException("Failed to execute query (grid is stopping)."); @@ -891,6 +634,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { @Override public List<GridQueryFieldMetadata> fieldsMeta() { if (cursor instanceof QueryCursorImpl) return ((QueryCursorImpl)cursor).fieldsMeta(); + return super.fieldsMeta(); } }; @@ -931,76 +675,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { } /** - * Checks if the given class can be mapped to a simple SQL type. - * - * @param cls Class. - * @return {@code true} If can. - */ - public static boolean isSqlType(Class<?> cls) { - cls = U.box(cls); - - return SQL_TYPES.contains(cls) || isGeometryClass(cls); - } - - /** - * Checks if the given class is GEOMETRY. - * - * @param cls Class. - * @return {@code true} If this is geometry. - */ - public static boolean isGeometryClass(Class<?> cls) { - return GEOMETRY_CLASS != null && GEOMETRY_CLASS.isAssignableFrom(cls); - } - - /** - * Gets type name by class. - * - * @param cls Class. - * @return Type name. - */ - public static String typeName(Class<?> cls) { - String typeName = cls.getSimpleName(); - - // To protect from failure on anonymous classes. - if (F.isEmpty(typeName)) { - String pkg = cls.getPackage().getName(); - - typeName = cls.getName().substring(pkg.length() + (pkg.isEmpty() ? 0 : 1)); - } - - if (cls.isArray()) { - assert typeName.endsWith("[]"); - - typeName = typeName.substring(0, typeName.length() - 2) + "_array"; - } - - return typeName; - } - - /** - * Gets type name by class. - * - * @param clsName Class name. - * @return Type name. - */ - public static String typeName(String clsName) { - int pkgEnd = clsName.lastIndexOf('.'); - - if (pkgEnd >= 0 && pkgEnd < clsName.length() - 1) - clsName = clsName.substring(pkgEnd + 1); - - if (clsName.endsWith("[]")) - clsName = clsName.substring(0, clsName.length() - 2) + "_array"; - - int parentEnd = clsName.lastIndexOf('$'); - - if (parentEnd >= 0) - clsName = clsName.substring(parentEnd + 1); - - return clsName; - } - - /** * @param space Space. * @param clause Clause. * @param resType Result type. @@ -1131,459 +805,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { } /** - * Processes declarative metadata for class. - * - * @param meta Type metadata. - * @param d Type descriptor. - * @param coCtx Cache object context. - * @throws IgniteCheckedException If failed. - */ - private void processClassMeta(CacheTypeMetadata meta, QueryTypeDescriptorImpl d, CacheObjectContext coCtx) - throws IgniteCheckedException { - Map<String,String> aliases = meta.getAliases(); - - if (aliases == null) - aliases = Collections.emptyMap(); - - Class<?> keyCls = d.keyClass(); - Class<?> valCls = d.valueClass(); - - assert keyCls != null; - assert valCls != null; - - for (Map.Entry<String, Class<?>> entry : meta.getAscendingFields().entrySet()) - addToIndex(d, keyCls, valCls, entry.getKey(), entry.getValue(), 0, IndexType.ASC, null, aliases, coCtx); - - for (Map.Entry<String, Class<?>> entry : meta.getDescendingFields().entrySet()) - addToIndex(d, keyCls, valCls, entry.getKey(), entry.getValue(), 0, IndexType.DESC, null, aliases, coCtx); - - for (String txtField : meta.getTextFields()) - addToIndex(d, keyCls, valCls, txtField, String.class, 0, IndexType.TEXT, null, aliases, coCtx); - - Map<String, LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>>> grps = meta.getGroups(); - - if (grps != null) { - for (Map.Entry<String, LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>>> entry : grps.entrySet()) { - String idxName = entry.getKey(); - - LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>> idxFields = entry.getValue(); - - int order = 0; - - for (Map.Entry<String, IgniteBiTuple<Class<?>, Boolean>> idxField : idxFields.entrySet()) { - Boolean descending = idxField.getValue().get2(); - - if (descending == null) - descending = false; - - addToIndex(d, keyCls, valCls, idxField.getKey(), idxField.getValue().get1(), order, - descending ? IndexType.DESC : IndexType.ASC, idxName, aliases, coCtx); - - order++; - } - } - } - - for (Map.Entry<String, Class<?>> entry : meta.getQueryFields().entrySet()) { - QueryClassProperty prop = buildClassProperty( - keyCls, - valCls, - entry.getKey(), - entry.getValue(), - aliases, - coCtx); - - d.addProperty(prop, false); - } - } - - /** - * @param d Type descriptor. - * @param keyCls Key class. - * @param valCls Value class. - * @param pathStr Path string. - * @param resType Result type. - * @param idxOrder Order number in index or {@code -1} if no need to index. - * @param idxType Index type. - * @param idxName Index name. - * @param aliases Aliases. - * @throws IgniteCheckedException If failed. - */ - private void addToIndex( - QueryTypeDescriptorImpl d, - Class<?> keyCls, - Class<?> valCls, - String pathStr, - Class<?> resType, - int idxOrder, - IndexType idxType, - String idxName, - Map<String,String> aliases, - CacheObjectContext coCtx - ) throws IgniteCheckedException { - String propName; - Class<?> propCls; - - if (_VAL.equals(pathStr)) { - propName = _VAL; - propCls = valCls; - } - else { - QueryClassProperty prop = buildClassProperty( - keyCls, - valCls, - pathStr, - resType, - aliases, - coCtx); - - d.addProperty(prop, false); - - propName = prop.name(); - propCls = prop.type(); - } - - if (idxType != null) { - if (idxName == null) - idxName = propName + "_idx"; - - if (idxOrder == 0) // Add index only on the first field. - d.addIndex(idxName, isGeometryClass(propCls) ? QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED); - - if (idxType == IndexType.TEXT) - d.addFieldToTextIndex(propName); - else - d.addFieldToIndex(idxName, propName, idxOrder, idxType == IndexType.DESC); - } - } - - /** - * Processes declarative metadata for binary object. - * - * @param meta Declared metadata. - * @param d Type descriptor. - * @throws IgniteCheckedException If failed. - */ - private void processBinaryMeta(CacheTypeMetadata meta, QueryTypeDescriptorImpl d) - throws IgniteCheckedException { - Map<String,String> aliases = meta.getAliases(); - - if (aliases == null) - aliases = Collections.emptyMap(); - - for (Map.Entry<String, Class<?>> entry : meta.getAscendingFields().entrySet()) { - QueryBinaryProperty prop = buildBinaryProperty(entry.getKey(), entry.getValue(), aliases, null); - - d.addProperty(prop, false); - - String idxName = prop.name() + "_idx"; - - d.addIndex(idxName, isGeometryClass(prop.type()) ? QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED); - - d.addFieldToIndex(idxName, prop.name(), 0, false); - } - - for (Map.Entry<String, Class<?>> entry : meta.getDescendingFields().entrySet()) { - QueryBinaryProperty prop = buildBinaryProperty(entry.getKey(), entry.getValue(), aliases, null); - - d.addProperty(prop, false); - - String idxName = prop.name() + "_idx"; - - d.addIndex(idxName, isGeometryClass(prop.type()) ? QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED); - - d.addFieldToIndex(idxName, prop.name(), 0, true); - } - - for (String txtIdx : meta.getTextFields()) { - QueryBinaryProperty prop = buildBinaryProperty(txtIdx, String.class, aliases, null); - - d.addProperty(prop, false); - - d.addFieldToTextIndex(prop.name()); - } - - Map<String, LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>>> grps = meta.getGroups(); - - if (grps != null) { - for (Map.Entry<String, LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>>> entry : grps.entrySet()) { - String idxName = entry.getKey(); - - LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>> idxFields = entry.getValue(); - - int order = 0; - - for (Map.Entry<String, IgniteBiTuple<Class<?>, Boolean>> idxField : idxFields.entrySet()) { - QueryBinaryProperty prop = buildBinaryProperty(idxField.getKey(), idxField.getValue().get1(), aliases, - null); - - d.addProperty(prop, false); - - Boolean descending = idxField.getValue().get2(); - - d.addFieldToIndex(idxName, prop.name(), order, descending != null && descending); - - order++; - } - } - } - - for (Map.Entry<String, Class<?>> entry : meta.getQueryFields().entrySet()) { - QueryBinaryProperty prop = buildBinaryProperty(entry.getKey(), entry.getValue(), aliases, null); - - if (!d.properties().containsKey(prop.name())) - d.addProperty(prop, false); - } - } - - /** - * Processes declarative metadata for binary object. - * - * @param qryEntity Declared metadata. - * @param d Type descriptor. - * @throws IgniteCheckedException If failed. - */ - private void processBinaryMeta(QueryEntity qryEntity, QueryTypeDescriptorImpl d) throws IgniteCheckedException { - Map<String,String> aliases = qryEntity.getAliases(); - - if (aliases == null) - aliases = Collections.emptyMap(); - - Set<String> keyFields = qryEntity.getKeyFields(); - - // We have to distinguish between empty and null keyFields when the key is not of SQL type - - // when a key is not of SQL type, absence of a field in nonnull keyFields tell us that this field - // is a value field, and null keyFields tells us that current configuration - // does not tell us anything about this field's ownership. - boolean hasKeyFields = (keyFields != null); - - boolean isKeyClsSqlType = isSqlType(d.keyClass()); - - if (hasKeyFields && !isKeyClsSqlType) { - //ensure that 'keyFields' is case sensitive subset of 'fields' - for (String keyField : keyFields) { - if (!qryEntity.getFields().containsKey(keyField)) - throw new IgniteCheckedException("QueryEntity 'keyFields' property must be a subset of keys " + - "from 'fields' property (case sensitive): " + keyField); - } - } - - for (Map.Entry<String, String> entry : qryEntity.getFields().entrySet()) { - Boolean isKeyField; - - if (isKeyClsSqlType) // We don't care about keyFields in this case - it might be null, or empty, or anything - isKeyField = false; - else - isKeyField = (hasKeyFields ? keyFields.contains(entry.getKey()) : null); - - QueryBinaryProperty prop = buildBinaryProperty(entry.getKey(), - U.classForName(entry.getValue(), Object.class, true), aliases, isKeyField); - - d.addProperty(prop, false); - } - - processIndexes(qryEntity, d); - } - - /** - * Processes declarative metadata for binary object. - * - * @param qryEntity Declared metadata. - * @param d Type descriptor. - * @throws IgniteCheckedException If failed. - */ - private void processClassMeta( - QueryEntity qryEntity, - QueryTypeDescriptorImpl d, - CacheObjectContext coCtx - ) throws IgniteCheckedException { - Map<String,String> aliases = qryEntity.getAliases(); - - if (aliases == null) - aliases = Collections.emptyMap(); - - for (Map.Entry<String, String> entry : qryEntity.getFields().entrySet()) { - QueryClassProperty prop = buildClassProperty( - d.keyClass(), - d.valueClass(), - entry.getKey(), - U.classForName(entry.getValue(), Object.class), - aliases, - coCtx); - - d.addProperty(prop, false); - } - - processIndexes(qryEntity, d); - } - - /** - * Processes indexes based on query entity. - * - * @param qryEntity Query entity to process. - * @param d Type descriptor to populate. - * @throws IgniteCheckedException If failed to build index information. - */ - private void processIndexes(QueryEntity qryEntity, QueryTypeDescriptorImpl d) throws IgniteCheckedException { - if (!F.isEmpty(qryEntity.getIndexes())) { - Map<String, String> aliases = qryEntity.getAliases(); - - if (aliases == null) - aliases = Collections.emptyMap(); - - for (QueryIndex idx : qryEntity.getIndexes()) { - String idxName = idx.getName(); - - if (idxName == null) - idxName = QueryEntity.defaultIndexName(idx); - - QueryIndexType idxTyp = idx.getIndexType(); - - if (idxTyp == QueryIndexType.SORTED || idxTyp == QueryIndexType.GEOSPATIAL) { - d.addIndex(idxName, idxTyp); - - int i = 0; - - for (Map.Entry<String, Boolean> entry : idx.getFields().entrySet()) { - String field = entry.getKey(); - boolean asc = entry.getValue(); - - String alias = aliases.get(field); - - if (alias != null) - field = alias; - - d.addFieldToIndex(idxName, field, i++, !asc); - } - } - else if (idxTyp == QueryIndexType.FULLTEXT){ - for (String field : idx.getFields().keySet()) { - String alias = aliases.get(field); - - if (alias != null) - field = alias; - - d.addFieldToTextIndex(field); - } - } - else if (idxTyp != null) - throw new IllegalArgumentException("Unsupported index type [idx=" + idx.getName() + - ", typ=" + idxTyp + ']'); - else - throw new IllegalArgumentException("Index type is not set: " + idx.getName()); - } - } - } - - /** - * Builds binary object property. - * - * @param pathStr String representing path to the property. May contains dots '.' to identify - * nested fields. - * @param resType Result type. - * @param aliases Aliases. - * @param isKeyField Key ownership flag, as defined in {@link QueryEntity#keyFields}: {@code true} if field belongs - * to key, {@code false} if it belongs to value, {@code null} if QueryEntity#keyFields is null. - * @return Binary property. - */ - private QueryBinaryProperty buildBinaryProperty(String pathStr, Class<?> resType, Map<String, String> aliases, - @Nullable Boolean isKeyField) throws IgniteCheckedException { - String[] path = pathStr.split("\\."); - - QueryBinaryProperty res = null; - - StringBuilder fullName = new StringBuilder(); - - for (String prop : path) { - if (fullName.length() != 0) - fullName.append('.'); - - fullName.append(prop); - - String alias = aliases.get(fullName.toString()); - - // The key flag that we've found out is valid for the whole path. - res = new QueryBinaryProperty(ctx, log, prop, res, resType, isKeyField, alias); - } - - return res; - } - - /** - * @param keyCls Key class. - * @param valCls Value class. - * @param pathStr Path string. - * @param resType Result type. - * @param aliases Aliases. - * @return Class property. - * @throws IgniteCheckedException If failed. - */ - private static QueryClassProperty buildClassProperty(Class<?> keyCls, Class<?> valCls, String pathStr, Class<?> resType, - Map<String,String> aliases, CacheObjectContext coCtx) throws IgniteCheckedException { - QueryClassProperty res = buildClassProperty( - true, - keyCls, - pathStr, - resType, - aliases, - coCtx); - - if (res == null) // We check key before value consistently with BinaryProperty. - res = buildClassProperty(false, valCls, pathStr, resType, aliases, coCtx); - - if (res == null) - throw new IgniteCheckedException("Failed to initialize property '" + pathStr + "' of type '" + - resType.getName() + "' for key class '" + keyCls + "' and value class '" + valCls + "'. " + - "Make sure that one of these classes contains respective getter method or field."); - - return res; - } - - /** - * @param key If this is a key property. - * @param cls Source type class. - * @param pathStr String representing path to the property. May contains dots '.' to identify nested fields. - * @param resType Expected result type. - * @param aliases Aliases. - * @return Property instance corresponding to the given path. - */ - private static QueryClassProperty buildClassProperty(boolean key, Class<?> cls, String pathStr, Class<?> resType, - Map<String,String> aliases, CacheObjectContext coCtx) { - String[] path = pathStr.split("\\."); - - QueryClassProperty res = null; - - StringBuilder fullName = new StringBuilder(); - - for (String prop : path) { - if (fullName.length() != 0) - fullName.append('.'); - - fullName.append(prop); - - String alias = aliases.get(fullName.toString()); - - QueryPropertyAccessor accessor = findProperty(prop, cls); - - if (accessor == null) - return null; - - QueryClassProperty tmp = new QueryClassProperty(accessor, key, alias, coCtx); - - tmp.parent(res); - - cls = tmp.type(); - - res = tmp; - } - - if (!U.box(resType).isAssignableFrom(U.box(res.type()))) - return null; - - return res; - } - - /** * Gets types for space. * * @param space Space name. @@ -1626,6 +847,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { * @param clo Closure. * @param complete Complete. */ + @SuppressWarnings("ThrowableResultOfMethodCallIgnored") public <R> R executeQuery(GridCacheQueryType qryType, String qry, GridCacheContext<?, ?> cctx, IgniteOutClosureX<R> clo, boolean complete) throws IgniteCheckedException { final long startTime = U.currentTimeMillis(); @@ -1676,104 +898,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { } /** - * Find a member (either a getter method or a field) with given name of given class. - * @param prop Property name. - * @param cls Class to search for a member in. - * @return Member for given name. - */ - @Nullable private static QueryPropertyAccessor findProperty(String prop, Class<?> cls) { - StringBuilder getBldr = new StringBuilder("get"); - getBldr.append(prop); - getBldr.setCharAt(3, Character.toUpperCase(getBldr.charAt(3))); - - StringBuilder setBldr = new StringBuilder("set"); - setBldr.append(prop); - setBldr.setCharAt(3, Character.toUpperCase(setBldr.charAt(3))); - - try { - Method getter = cls.getMethod(getBldr.toString()); - - Method setter; - - try { - // Setter has to have the same name like 'setXxx' and single param of the same type - // as the return type of the getter. - setter = cls.getMethod(setBldr.toString(), getter.getReturnType()); - } - catch (NoSuchMethodException ignore) { - // Have getter, but no setter - return read-only accessor. - return new QueryReadOnlyMethodsAccessor(getter, prop); - } - - return new QueryMethodsAccessor(getter, setter, prop); - } - catch (NoSuchMethodException ignore) { - // No-op. - } - - getBldr = new StringBuilder("is"); - getBldr.append(prop); - getBldr.setCharAt(2, Character.toUpperCase(getBldr.charAt(2))); - - // We do nothing about setBldr here as it corresponds to setProperty name which is what we need - // for boolean property setter as well - try { - Method getter = cls.getMethod(getBldr.toString()); - - Method setter; - - try { - // Setter has to have the same name like 'setXxx' and single param of the same type - // as the return type of the getter. - setter = cls.getMethod(setBldr.toString(), getter.getReturnType()); - } - catch (NoSuchMethodException ignore) { - // Have getter, but no setter - return read-only accessor. - return new QueryReadOnlyMethodsAccessor(getter, prop); - } - - return new QueryMethodsAccessor(getter, setter, prop); - } - catch (NoSuchMethodException ignore) { - // No-op. - } - - Class cls0 = cls; - - while (cls0 != null) - try { - return new QueryFieldAccessor(cls0.getDeclaredField(prop)); - } - catch (NoSuchFieldException ignored) { - cls0 = cls0.getSuperclass(); - } - - try { - Method getter = cls.getMethod(prop); - - Method setter; - - try { - // Setter has to have the same name and single param of the same type - // as the return type of the getter. - setter = cls.getMethod(prop, getter.getReturnType()); - } - catch (NoSuchMethodException ignore) { - // Have getter, but no setter - return read-only accessor. - return new QueryReadOnlyMethodsAccessor(getter, prop); - } - - return new QueryMethodsAccessor(getter, setter, prop); - } - catch (NoSuchMethodException ignored) { - // No-op. - } - - // No luck. - return null; - } - - /** * @param ver Version. */ public static void setRequestAffinityTopologyVersion(AffinityTopologyVersion ver) { @@ -1786,18 +910,4 @@ public class GridQueryProcessor extends GridProcessorAdapter { public static AffinityTopologyVersion getRequestAffinityTopologyVersion() { return requestTopVer.get(); } - - /** - * The way to index. - */ - private enum IndexType { - /** Ascending index. */ - ASC, - - /** Descending index. */ - DESC, - - /** Text index. */ - TEXT - } }
