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/03/13 11:35:55 UTC
[02/29] ignite git commit: IGNITE-4814: Implemented correct
registartion and unregistration of query types on cache start. Moved
GridQueryProcessor statics to separate utility class. This closes #1612.
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-4705-2
Commit: d9d6ff06c596b28f1a330f71d13c55bffb97373d
Parents: aab4f30
Author: devozerov <vo...@gridgain.com>
Authored: Mon Mar 13 12:51:54 2017 +0300
Committer: devozerov <vo...@gridgain.com>
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
- }
}