Return-Path: X-Original-To: apmail-ignite-commits-archive@minotaur.apache.org Delivered-To: apmail-ignite-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 073A117D1A for ; Thu, 2 Apr 2015 19:53:56 +0000 (UTC) Received: (qmail 3655 invoked by uid 500); 2 Apr 2015 19:53:34 -0000 Delivered-To: apmail-ignite-commits-archive@ignite.apache.org Received: (qmail 3592 invoked by uid 500); 2 Apr 2015 19:53:33 -0000 Mailing-List: contact commits-help@ignite.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.incubator.apache.org Delivered-To: mailing list commits@ignite.incubator.apache.org Received: (qmail 3524 invoked by uid 99); 2 Apr 2015 19:53:33 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 02 Apr 2015 19:53:33 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED,T_RP_MATCHES_RCVD X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO mail.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with SMTP; Thu, 02 Apr 2015 19:53:31 +0000 Received: (qmail 1965 invoked by uid 99); 2 Apr 2015 19:53:11 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 02 Apr 2015 19:53:11 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 3DC42E2F4F; Thu, 2 Apr 2015 19:53:11 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sergi@apache.org To: commits@ignite.incubator.apache.org Date: Thu, 02 Apr 2015 19:53:13 -0000 Message-Id: In-Reply-To: <12fbc40737aa4884a4e49e5c2f2e15e8@git.apache.org> References: <12fbc40737aa4884a4e49e5c2f2e15e8@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [03/10] incubator-ignite git commit: ignite-gg-10002 - fixed X-Virus-Checked: Checked by ClamAV on apache.org ignite-gg-10002 - fixed Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/e78ce56a Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/e78ce56a Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/e78ce56a Branch: refs/heads/ignite-sprint-3 Commit: e78ce56aebcb83d43b25ae96360d586d72d0eaf5 Parents: c9b3f21 Author: S.Vladykin Authored: Wed Apr 1 16:29:30 2015 +0300 Committer: S.Vladykin Committed: Wed Apr 1 16:29:30 2015 +0300 ---------------------------------------------------------------------- .../apache/ignite/cache/CacheTypeMetadata.java | 4 +- .../cacheobject/IgniteCacheObjectProcessor.java | 8 ++ .../IgniteCacheObjectProcessorImpl.java | 6 +- .../processors/query/GridQueryProcessor.java | 143 ++++++++++--------- 4 files changed, 87 insertions(+), 74 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e78ce56a/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 db088e6..20129b7 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 @@ -98,9 +98,9 @@ public class CacheTypeMetadata implements Serializable { dbTbl = src.getDatabaseTable(); - keyType = getKeyType(); + keyType = src.getKeyType(); - valType = getValueType(); + valType = src.getValueType(); keyFields = new ArrayList<>(src.getKeyFields()); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e78ce56a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java index 42586d2..1f1f601 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java @@ -75,6 +75,14 @@ public interface IgniteCacheObjectProcessor extends GridProcessor { public boolean isPortableObject(Object obj); /** + * Checks whether given class is portable. + * + * @param cls Class. + * @return {@code true} If the class was registered as portable. + */ + public boolean isPortableClass(Class cls); + + /** * @param obj Portable object to get field from. * @param fieldName Field name. * @return Field value. http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e78ce56a/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 c0be7c9..53c3ea8 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 @@ -26,7 +26,6 @@ import org.apache.ignite.internal.processors.*; import org.apache.ignite.internal.processors.cache.*; import org.apache.ignite.internal.processors.query.*; import org.apache.ignite.internal.util.*; -import org.apache.ignite.internal.util.typedef.*; import org.apache.ignite.internal.util.typedef.internal.*; import org.apache.ignite.lang.*; import org.jetbrains.annotations.*; @@ -294,6 +293,11 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme } /** {@inheritDoc} */ + @Override public boolean isPortableClass(Class cls) { + return false; + } + + /** {@inheritDoc} */ @Override public int typeId(Object obj) { return 0; } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e78ce56a/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 2e5a7a0..4e30f41 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 @@ -70,9 +70,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { /** */ private final GridQueryIndexing idx; - /** Portable ID to name mapping. */ - private final Map portableIds = new ConcurrentHashMap8<>(); - /** * @param ctx Kernal context. */ @@ -113,24 +110,39 @@ public class GridQueryProcessor extends GridProcessorAdapter { * @param ccfg Cache configuration. */ public void initializeCache(CacheConfiguration ccfg) throws IgniteCheckedException { - Map declaredTypes = new HashMap<>(); - idx.registerCache(ccfg); if (!F.isEmpty(ccfg.getTypeMetadata())) { for (CacheTypeMetadata meta : ccfg.getTypeMetadata()) { - declaredTypes.put(new TypeName(ccfg.getName(), meta.getValueType()), meta); + if (F.isEmpty(meta.getValueType())) + throw new IgniteCheckedException("Value type is not set: " + meta); + + TypeDescriptor desc = new TypeDescriptor(ccfg); + + Class valCls = U.classForName(meta.getValueType(), null); + + desc.name(valCls != null ? typeName(valCls) : meta.getValueType()); + + desc.valueClass(valCls != null ? valCls : Object.class); + desc.keyClass(meta.getKeyType() == null ? Object.class : U.classForName(meta.getKeyType(), Object.class)); - int valTypeId = ctx.cacheObjects().typeId(meta.getValueType()); + TypeId typeId; - portableIds.put(valTypeId, meta.getValueType()); + if (valCls == null || ctx.cacheObjects().isPortableClass(valCls)) { + processPortableMeta(meta, desc); - TypeDescriptor desc = processPortableMeta(ccfg, meta); + typeId = new TypeId(ccfg.getName(), ctx.cacheObjects().typeId(meta.getValueType())); + } + else { + processClassMeta(meta, desc); + + typeId = new TypeId(ccfg.getName(), valCls); + } desc.registered(idx.registerType(ccfg.getName(), desc)); typesByName.put(new TypeName(ccfg.getName(), desc.name()), desc); - types.put(new TypeId(ccfg.getName(), valTypeId), desc); + types.put(typeId, desc); } } @@ -141,7 +153,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { Class keyCls = clss[i]; Class valCls = clss[i + 1]; - TypeDescriptor desc = processKeyAndValueClasses(ccfg, keyCls, valCls, declaredTypes); + TypeDescriptor desc = processKeyAndValueClasses(ccfg, keyCls, valCls); desc.registered(idx.registerType(ccfg.getName(), desc)); @@ -155,35 +167,23 @@ public class GridQueryProcessor extends GridProcessorAdapter { * @param ccfg Cache configuration. * @param keyCls Key class. * @param valCls Value class. - * @param declaredTypes Knows types. * @return Type descriptor. * @throws IgniteCheckedException If failed. */ - private TypeDescriptor processKeyAndValueClasses(CacheConfiguration ccfg, Class keyCls, Class valCls, - Map declaredTypes) + private TypeDescriptor processKeyAndValueClasses(CacheConfiguration ccfg, Class keyCls, Class valCls) throws IgniteCheckedException { TypeDescriptor d = new TypeDescriptor(ccfg); d.keyClass(keyCls); d.valueClass(valCls); - CacheTypeMetadata keyMeta = declaredTypes.get(new TypeName(ccfg.getName(), keyCls.getName())); - - if (keyMeta == null) - processAnnotationsInClass(true, d.keyCls, d, null); - else - processClassMeta(true, d.keyCls, keyMeta, d); + processAnnotationsInClass(true, d.keyCls, d, null); String valTypeName = typeName(valCls); d.name(valTypeName); - CacheTypeMetadata typeMeta = declaredTypes.get(new TypeName(ccfg.getName(), valCls.getName())); - - if (typeMeta == null) - processAnnotationsInClass(false, d.valCls, d, null); - else - processClassMeta(false, d.valCls, typeMeta, d); + processAnnotationsInClass(false, d.valCls, d, null); return d; } @@ -397,16 +397,17 @@ public class GridQueryProcessor extends GridProcessorAdapter { try { final Class valCls = val.getClass(); - int typeId = ctx.cacheObjects().typeId(val); + TypeId id; if (ctx.cacheObjects().isPortableObject(val)) { - String typeName = portableName(typeId); + int typeId = ctx.cacheObjects().typeId(val); - if (typeName == null) - return; + id = new TypeId(space, typeId); } + else + id = new TypeId(space, valCls); - TypeDescriptor desc = types.get(new TypeId(space, typeId)); + TypeDescriptor desc = types.get(id); if (desc == null || !desc.registered()) return; @@ -707,16 +708,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { } /** - * Gets portable type name by portable ID. - * - * @param typeId Type ID. - * @return Name. - */ - private String portableName(int typeId) { - return portableIds.get(typeId); - } - - /** * @param space Space. * @param clause Clause. * @param resType Result type. @@ -985,16 +976,20 @@ public class GridQueryProcessor extends GridProcessorAdapter { /** * Processes declarative metadata for class. * - * @param key Key or value flag. - * @param cls Class to process. * @param meta Type metadata. * @param d Type descriptor. * @throws IgniteCheckedException If failed. */ - static void processClassMeta(boolean key, Class cls, CacheTypeMetadata meta, TypeDescriptor d) + static void processClassMeta(CacheTypeMetadata meta, TypeDescriptor d) throws IgniteCheckedException { + Class keyCls = d.keyClass(); + Class valCls = d.valueClass(); + + assert keyCls != null; + assert valCls != null; + for (Map.Entry> entry : meta.getAscendingFields().entrySet()) { - ClassProperty prop = buildClassProperty(key, cls, entry.getKey(), entry.getValue()); + ClassProperty prop = buildClassProperty(keyCls, valCls, entry.getKey(), entry.getValue()); d.addProperty(prop, false); @@ -1006,7 +1001,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { } for (Map.Entry> entry : meta.getDescendingFields().entrySet()) { - ClassProperty prop = buildClassProperty(key, cls, entry.getKey(), entry.getValue()); + ClassProperty prop = buildClassProperty(keyCls, valCls, entry.getKey(), entry.getValue()); d.addProperty(prop, false); @@ -1018,7 +1013,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { } for (String txtIdx : meta.getTextFields()) { - ClassProperty prop = buildClassProperty(key, cls, txtIdx, String.class); + ClassProperty prop = buildClassProperty(keyCls, valCls, txtIdx, String.class); d.addProperty(prop, false); @@ -1036,7 +1031,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { int order = 0; for (Map.Entry, Boolean>> idxField : idxFields.entrySet()) { - ClassProperty prop = buildClassProperty(key, cls, idxField.getKey(), idxField.getValue().get1()); + ClassProperty prop = buildClassProperty(keyCls, valCls, idxField.getKey(), idxField.getValue().get1()); d.addProperty(prop, false); @@ -1050,7 +1045,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { } for (Map.Entry> entry : meta.getQueryFields().entrySet()) { - ClassProperty prop = buildClassProperty(key, cls, entry.getKey(), entry.getValue()); + ClassProperty prop = buildClassProperty(keyCls, valCls, entry.getKey(), entry.getValue()); d.addProperty(prop, false); } @@ -1059,15 +1054,12 @@ public class GridQueryProcessor extends GridProcessorAdapter { /** * Processes declarative metadata for portable object. * - * @param ccfg Cache configuration. * @param meta Declared metadata. - * @return Type descriptor. + * @param d Type descriptor. * @throws IgniteCheckedException If failed. */ - private TypeDescriptor processPortableMeta(CacheConfiguration ccfg, CacheTypeMetadata meta) + private void processPortableMeta(CacheTypeMetadata meta, TypeDescriptor d) throws IgniteCheckedException { - TypeDescriptor d = new TypeDescriptor(ccfg); - for (Map.Entry> entry : meta.getAscendingFields().entrySet()) { PortableProperty prop = buildPortableProperty(entry.getKey(), entry.getValue()); @@ -1130,18 +1122,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { if (!d.props.containsKey(prop.name())) d.addProperty(prop, false); } - - if (F.isEmpty(meta.getValueType())) - throw new IgniteCheckedException("Value type is not set: " + meta); - - Class valCls = U.classForName(meta.getValueType(), null); - - d.name(valCls != null ? typeName(valCls) : meta.getValueType()); - - d.valueClass(valCls != null ? valCls : Object.class); - d.keyClass(meta.getKeyType() == null ? Object.class : U.classForName(meta.getKeyType(), Object.class)); - - return d; } /** @@ -1164,6 +1144,29 @@ public class GridQueryProcessor extends GridProcessorAdapter { } /** + * @param keyCls Key class. + * @param valCls Value class. + * @param pathStr Path string. + * @param resType Result type. + * @return Class property. + * @throws IgniteCheckedException If failed. + */ + private static ClassProperty buildClassProperty(Class keyCls, Class valCls, String pathStr, Class resType) + throws IgniteCheckedException { + ClassProperty res = buildClassProperty(true, keyCls, pathStr, resType); + + if (res == null) // We check key before value consistently with PortableProperty. + res = buildClassProperty(false, valCls, pathStr, resType); + + if (res == null) + throw new IgniteCheckedException("Failed to initialize property '" + pathStr + "' 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. @@ -1194,8 +1197,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { tmp = new ClassProperty(cls.getDeclaredField(prop), key); } catch (NoSuchFieldException ignored) { - throw new IgniteCheckedException("Failed to find getter method or field for property named " + - "'" + prop + "': " + cls.getName()); + return null; } } @@ -1207,9 +1209,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { } if (!U.box(resType).isAssignableFrom(U.box(res.type()))) - throw new IgniteCheckedException("Failed to create property for given path (actual property type is not assignable" + - " to declared type [path=" + pathStr + ", actualType=" + res.type().getName() + - ", declaredType=" + resType.getName() + ']'); + return null; return res; } @@ -1449,6 +1449,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { int isKeyProp0 = isKeyProp; if (isKeyProp0 == 0) { // Key is allowed to be a non-portable object here. + // We check key before value consistently with ClassProperty. if (ctx.cacheObjects().isPortableObject(key) && ctx.cacheObjects().hasField(key, propName)) isKeyProp = isKeyProp0 = 1; else if (ctx.cacheObjects().hasField(val, propName))