Repository: incubator-atlas Updated Branches: refs/heads/master 466372ef8 -> 2615b308e
ATLAS-1744 Error when searching type with attribute name order , limit , offset (sumasai) Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/2615b308 Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/2615b308 Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/2615b308 Branch: refs/heads/master Commit: 2615b308e62e617c6e979b91533fefb2bbfc7d01 Parents: 466372e Author: Suma Shivaprasad <[email protected]> Authored: Wed Apr 26 13:32:54 2017 -0700 Committer: Suma Shivaprasad <[email protected]> Committed: Wed Apr 26 15:12:48 2017 -0700 ---------------------------------------------------------------------- .../java/org/apache/atlas/AtlasErrorCode.java | 1 + .../org/apache/atlas/type/AtlasTypeUtil.java | 10 --- .../apache/atlas/RepositoryMetadataModule.java | 5 ++ .../store/graph/v1/AtlasAbstractDefStoreV1.java | 43 ++++++++++++ .../graph/v1/AtlasClassificationDefStoreV1.java | 22 ++++-- .../store/graph/v1/AtlasEntityDefStoreV1.java | 11 +-- .../store/graph/v1/AtlasEnumDefStoreV1.java | 8 +-- .../store/graph/v1/AtlasStructDefStoreV1.java | 8 +-- .../org/apache/atlas/query/QueryParser.scala | 4 ++ .../GraphBackedDiscoveryServiceTest.java | 21 ++++++ .../store/graph/AtlasEntityDefStoreV1Test.java | 73 ++++++++++++++++++++ 11 files changed, 178 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2615b308/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java ---------------------------------------------------------------------- diff --git a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java index 62fe9ac..298df6b 100644 --- a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java +++ b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java @@ -52,6 +52,7 @@ public enum AtlasErrorCode { PATCH_FOR_UNKNOWN_TYPE(400, "ATLAS-400-00-017", "{0} - patch references unknown type {1}"), PATCH_INVALID_DATA(400, "ATLAS-400-00-018", "{0} - patch data is invalid for type {1}"), TYPE_NAME_INVALID_FORMAT(400, "ATLAS-400-00-019", "{0}: invalid name for {1}. Names must consist of a letter followed by a sequence of letter, number, or '_' characters"), + ATTRIBUTE_NAME_INVALID(400, "ATLAS-400-00-020", "{0}: invalid name. Attribute name must not contain query keywords"), INVALID_PARAMETERS(400, "ATLAS-400-00-01A", "invalid parameters: {0}"), CLASSIFICATION_ALREADY_ASSOCIATED(400, "ATLAS-400-00-01B", "instance {0} already is associated with classification {1}"), CONSTRAINT_INVERSE_REF_ATTRIBUTE_INVALID_TYPE(400, "ATLAS-400-00-01C", "{0}.{1}: invalid {2} constraint. Attribute {3} is not an entity type"), http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2615b308/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java ---------------------------------------------------------------------- diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java b/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java index eca1abf..c0135f5 100644 --- a/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java +++ b/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java @@ -99,7 +99,6 @@ public class AtlasTypeUtil { && StringUtils.endsWith(typeName, ATLAS_TYPE_MAP_SUFFIX); } - public static boolean isValidTypeName(String typeName) { Matcher m = NAME_PATTERN.matcher(typeName); @@ -120,15 +119,6 @@ public class AtlasTypeUtil { return InvalidTraitTypeNameErrorMessage; } - public static void validateType(AtlasBaseTypeDef typeDef) throws AtlasBaseException { - boolean isValidName = (typeDef instanceof AtlasClassificationDef) ? isValidTraitTypeName(typeDef.getName()) - : isValidTypeName(typeDef.getName()); - - if (!isValidName) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID_FORMAT, typeDef.getName(), typeDef.getCategory().name()); - } - } - public static String getStringValue(Map map, Object key) { Object ret = map != null ? map.get(key) : null; http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2615b308/repository/src/main/java/org/apache/atlas/RepositoryMetadataModule.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/RepositoryMetadataModule.java b/repository/src/main/java/org/apache/atlas/RepositoryMetadataModule.java index ce29f8d..6c175ae 100755 --- a/repository/src/main/java/org/apache/atlas/RepositoryMetadataModule.java +++ b/repository/src/main/java/org/apache/atlas/RepositoryMetadataModule.java @@ -41,7 +41,9 @@ import org.apache.atlas.repository.audit.EntityAuditRepository; import org.apache.atlas.repository.graph.DeleteHandler; import org.apache.atlas.repository.graph.GraphBackedMetadataRepository; import org.apache.atlas.repository.graph.GraphBackedSearchIndexer; +import org.apache.atlas.repository.store.graph.AtlasEntityDefStore; import org.apache.atlas.repository.store.graph.AtlasEntityStore; +import org.apache.atlas.repository.store.graph.v1.AtlasEntityDefStoreV1; import org.apache.atlas.repository.store.graph.v1.AtlasEntityStoreV1; import org.apache.atlas.repository.store.graph.v1.AtlasTypeDefGraphStoreV1; import org.apache.atlas.repository.store.graph.v1.DeleteHandlerV1; @@ -76,6 +78,9 @@ public class RepositoryMetadataModule extends com.google.inject.AbstractModule { // bind the ITypeStore interface to an implementation bind(ITypeStore.class).to(GraphBackedTypeStore.class).asEagerSingleton(); bind(AtlasTypeDefStore.class).to(AtlasTypeDefGraphStoreV1.class).asEagerSingleton(); + + //For testing + bind(AtlasEntityDefStore.class).to(AtlasEntityDefStoreV1.class).asEagerSingleton(); bind(AtlasTypeRegistry.class).asEagerSingleton(); //GraphBackedSearchIndexer must be an eager singleton to force the search index creation to happen before http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2615b308/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasAbstractDefStoreV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasAbstractDefStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasAbstractDefStoreV1.java index 8144ddf..dde263b 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasAbstractDefStoreV1.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasAbstractDefStoreV1.java @@ -17,8 +17,19 @@ */ package org.apache.atlas.repository.store.graph.v1; +import org.apache.atlas.ApplicationProperties; +import org.apache.atlas.AtlasErrorCode; +import org.apache.atlas.AtlasException; +import org.apache.atlas.exception.AtlasBaseException; +import org.apache.atlas.model.typedef.AtlasBaseTypeDef; +import org.apache.atlas.model.typedef.AtlasStructDef; +import org.apache.atlas.query.QueryParser; import org.apache.atlas.type.AtlasTypeRegistry; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * Abstract typedef-store for v1 format. */ @@ -26,8 +37,40 @@ public abstract class AtlasAbstractDefStoreV1 { protected final AtlasTypeDefGraphStoreV1 typeDefStore; protected final AtlasTypeRegistry typeRegistry; + private static final String NAME_REGEX = "[a-zA-Z][a-zA-Z0-9_ ]*"; + private static final Pattern NAME_PATTERN = Pattern.compile(NAME_REGEX); + + private static final String ALLOW_RESERVED_KEYWORDS = "atlas.types.allowReservedKeywords"; + public AtlasAbstractDefStoreV1(AtlasTypeDefGraphStoreV1 typeDefStore, AtlasTypeRegistry typeRegistry) { this.typeDefStore = typeDefStore; this.typeRegistry = typeRegistry; } + + public void validateType(AtlasBaseTypeDef typeDef) throws AtlasBaseException { + if (!isValidName(typeDef.getName())) { + throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID_FORMAT, typeDef.getName(), typeDef.getCategory().name()); + } + + try { + final boolean allowReservedKeywords = ApplicationProperties.get().getBoolean(ALLOW_RESERVED_KEYWORDS, false); + + if (!allowReservedKeywords && typeDef instanceof AtlasStructDef) { + final List<AtlasStructDef.AtlasAttributeDef> attributeDefs = ((AtlasStructDef) typeDef).getAttributeDefs(); + for (AtlasStructDef.AtlasAttributeDef attrDef : attributeDefs) { + if (QueryParser.isKeyword(attrDef.getName())) { + throw new AtlasBaseException(AtlasErrorCode.ATTRIBUTE_NAME_INVALID, attrDef.getName(), typeDef.getCategory().name()); + } + } + } + } catch (AtlasException e) { + throw new AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR, "Could not load configuration"); + } + } + + public boolean isValidName(String typeName) { + Matcher m = NAME_PATTERN.matcher(typeName); + + return m.matches(); + } } http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2615b308/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasClassificationDefStoreV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasClassificationDefStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasClassificationDefStoreV1.java index d94aa21..8944504 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasClassificationDefStoreV1.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasClassificationDefStoreV1.java @@ -27,7 +27,6 @@ import org.apache.atlas.repository.store.graph.AtlasClassificationDefStore; import org.apache.atlas.type.AtlasClassificationType; import org.apache.atlas.type.AtlasType; import org.apache.atlas.type.AtlasTypeRegistry; -import org.apache.atlas.type.AtlasTypeUtil; import org.apache.atlas.typesystem.types.DataTypes.TypeCategory; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; @@ -36,6 +35,8 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * ClassificationDef store in v1 format. @@ -43,6 +44,10 @@ import java.util.List; public class AtlasClassificationDefStoreV1 extends AtlasAbstractDefStoreV1 implements AtlasClassificationDefStore { private static final Logger LOG = LoggerFactory.getLogger(AtlasClassificationDefStoreV1.class); + private static final String TRAIT_NAME_REGEX = "[a-zA-Z][a-zA-Z0-9_ .]*"; + + private static final Pattern TRAIT_NAME_PATTERN = Pattern.compile(TRAIT_NAME_REGEX); + public AtlasClassificationDefStoreV1(AtlasTypeDefGraphStoreV1 typeDefStore, AtlasTypeRegistry typeRegistry) { super(typeDefStore, typeRegistry); } @@ -53,7 +58,7 @@ public class AtlasClassificationDefStoreV1 extends AtlasAbstractDefStoreV1 imple LOG.debug("==> AtlasClassificationDefStoreV1.preCreate({})", classificationDef); } - AtlasTypeUtil.validateType(classificationDef); + validateType(classificationDef); AtlasType type = typeRegistry.getType(classificationDef.getName()); @@ -173,7 +178,7 @@ public class AtlasClassificationDefStoreV1 extends AtlasAbstractDefStoreV1 imple LOG.debug("==> AtlasClassificationDefStoreV1.update({})", classifiDef); } - AtlasTypeUtil.validateType(classifiDef); + validateType(classifiDef); AtlasClassificationDef ret = StringUtils.isNotBlank(classifiDef.getGuid()) ? updateByGuid(classifiDef.getGuid(), classifiDef) : updateByName(classifiDef.getName(), classifiDef); @@ -192,7 +197,7 @@ public class AtlasClassificationDefStoreV1 extends AtlasAbstractDefStoreV1 imple LOG.debug("==> AtlasClassificationDefStoreV1.updateByName({}, {})", name, classificationDef); } - AtlasTypeUtil.validateType(classificationDef); + validateType(classificationDef); AtlasType type = typeRegistry.getType(classificationDef.getName()); @@ -224,7 +229,7 @@ public class AtlasClassificationDefStoreV1 extends AtlasAbstractDefStoreV1 imple LOG.debug("==> AtlasClassificationDefStoreV1.updateByGuid({})", guid); } - AtlasTypeUtil.validateType(classificationDef); + validateType(classificationDef); AtlasType type = typeRegistry.getTypeByGuid(guid); @@ -375,4 +380,11 @@ public class AtlasClassificationDefStoreV1 extends AtlasAbstractDefStoreV1 imple return ret; } + + @Override + public boolean isValidName(String typeName) { + Matcher m = TRAIT_NAME_PATTERN.matcher(typeName); + + return m.matches(); + } } http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2615b308/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityDefStoreV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityDefStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityDefStoreV1.java index 096f99b..1bfe3b9 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityDefStoreV1.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityDefStoreV1.java @@ -17,6 +17,7 @@ */ package org.apache.atlas.repository.store.graph.v1; +import com.google.inject.Inject; import org.apache.atlas.AtlasErrorCode; import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.typedef.AtlasEntityDef; @@ -26,7 +27,6 @@ import org.apache.atlas.repository.store.graph.AtlasEntityDefStore; import org.apache.atlas.type.AtlasEntityType; import org.apache.atlas.type.AtlasType; import org.apache.atlas.type.AtlasTypeRegistry; -import org.apache.atlas.type.AtlasTypeUtil; import org.apache.atlas.typesystem.types.DataTypes.TypeCategory; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; @@ -42,6 +42,7 @@ import java.util.List; public class AtlasEntityDefStoreV1 extends AtlasAbstractDefStoreV1 implements AtlasEntityDefStore { private static final Logger LOG = LoggerFactory.getLogger(AtlasEntityDefStoreV1.class); + @Inject public AtlasEntityDefStoreV1(AtlasTypeDefGraphStoreV1 typeDefStore, AtlasTypeRegistry typeRegistry) { super(typeDefStore, typeRegistry); } @@ -52,7 +53,7 @@ public class AtlasEntityDefStoreV1 extends AtlasAbstractDefStoreV1 implements At LOG.debug("==> AtlasEntityDefStoreV1.preCreate({})", entityDef); } - AtlasTypeUtil.validateType(entityDef); + validateType(entityDef); AtlasType type = typeRegistry.getType(entityDef.getName()); @@ -172,7 +173,7 @@ public class AtlasEntityDefStoreV1 extends AtlasAbstractDefStoreV1 implements At LOG.debug("==> AtlasEntityDefStoreV1.update({})", entityDef); } - AtlasTypeUtil.validateType(entityDef); + validateType(entityDef); AtlasEntityDef ret = StringUtils.isNotBlank(entityDef.getGuid()) ? updateByGuid(entityDef.getGuid(), entityDef) : updateByName(entityDef.getName(), entityDef); @@ -190,7 +191,7 @@ public class AtlasEntityDefStoreV1 extends AtlasAbstractDefStoreV1 implements At LOG.debug("==> AtlasEntityDefStoreV1.updateByName({}, {})", name, entityDef); } - AtlasTypeUtil.validateType(entityDef); + validateType(entityDef); AtlasType type = typeRegistry.getType(entityDef.getName()); @@ -222,7 +223,7 @@ public class AtlasEntityDefStoreV1 extends AtlasAbstractDefStoreV1 implements At LOG.debug("==> AtlasEntityDefStoreV1.updateByGuid({})", guid); } - AtlasTypeUtil.validateType(entityDef); + validateType(entityDef); AtlasType type = typeRegistry.getTypeByGuid(guid); http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2615b308/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEnumDefStoreV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEnumDefStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEnumDefStoreV1.java index a79b6c5..39c4dd9 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEnumDefStoreV1.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEnumDefStoreV1.java @@ -52,7 +52,7 @@ public class AtlasEnumDefStoreV1 extends AtlasAbstractDefStoreV1 implements Atla LOG.debug("==> AtlasEnumDefStoreV1.create({})", enumDef); } - AtlasTypeUtil.validateType(enumDef); + validateType(enumDef); AtlasVertex vertex = typeDefStore.findTypeVertexByName(enumDef.getName()); @@ -143,7 +143,7 @@ public class AtlasEnumDefStoreV1 extends AtlasAbstractDefStoreV1 implements Atla LOG.debug("==> AtlasEnumDefStoreV1.update({})", enumDef); } - AtlasTypeUtil.validateType(enumDef); + validateType(enumDef); AtlasEnumDef ret = StringUtils.isNotBlank(enumDef.getGuid()) ? updateByGuid(enumDef.getGuid(), enumDef) : updateByName(enumDef.getName(), enumDef); @@ -161,7 +161,7 @@ public class AtlasEnumDefStoreV1 extends AtlasAbstractDefStoreV1 implements Atla LOG.debug("==> AtlasEnumDefStoreV1.updateByName({}, {})", name, enumDef); } - AtlasTypeUtil.validateType(enumDef); + validateType(enumDef); AtlasVertex vertex = typeDefStore.findTypeVertexByNameAndCategory(name, TypeCategory.ENUM); @@ -188,7 +188,7 @@ public class AtlasEnumDefStoreV1 extends AtlasAbstractDefStoreV1 implements Atla LOG.debug("==> AtlasEnumDefStoreV1.updateByGuid({})", guid); } - AtlasTypeUtil.validateType(enumDef); + validateType(enumDef); AtlasVertex vertex = typeDefStore.findTypeVertexByGuidAndCategory(guid, TypeCategory.ENUM); http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2615b308/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java index f154555..6f1b80c 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java @@ -64,7 +64,7 @@ public class AtlasStructDefStoreV1 extends AtlasAbstractDefStoreV1 implements At LOG.debug("==> AtlasStructDefStoreV1.preCreate({})", structDef); } - AtlasTypeUtil.validateType(structDef); + validateType(structDef); AtlasType type = typeRegistry.getType(structDef.getName()); @@ -183,7 +183,7 @@ public class AtlasStructDefStoreV1 extends AtlasAbstractDefStoreV1 implements At LOG.debug("==> AtlasStructDefStoreV1.update({})", structDef); } - AtlasTypeUtil.validateType(structDef); + validateType(structDef); AtlasStructDef ret = StringUtils.isNotBlank(structDef.getGuid()) ? updateByGuid(structDef.getGuid(), structDef) : updateByName(structDef.getName(), structDef); @@ -201,7 +201,7 @@ public class AtlasStructDefStoreV1 extends AtlasAbstractDefStoreV1 implements At LOG.debug("==> AtlasStructDefStoreV1.updateByName({}, {})", name, structDef); } - AtlasTypeUtil.validateType(structDef); + validateType(structDef); AtlasType type = typeRegistry.getType(structDef.getName()); @@ -233,7 +233,7 @@ public class AtlasStructDefStoreV1 extends AtlasAbstractDefStoreV1 implements At LOG.debug("==> AtlasStructDefStoreV1.updateByGuid({})", guid); } - AtlasTypeUtil.validateType(structDef); + validateType(structDef); AtlasType type = typeRegistry.getTypeByGuid(guid); http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2615b308/repository/src/main/scala/org/apache/atlas/query/QueryParser.scala ---------------------------------------------------------------------- diff --git a/repository/src/main/scala/org/apache/atlas/query/QueryParser.scala b/repository/src/main/scala/org/apache/atlas/query/QueryParser.scala index 803b702..d9fd865 100755 --- a/repository/src/main/scala/org/apache/atlas/query/QueryParser.scala +++ b/repository/src/main/scala/org/apache/atlas/query/QueryParser.scala @@ -421,6 +421,10 @@ object QueryParser extends StandardTokenParsers with QueryKeywords with Expressi case g ~ ce => ce } + def isKeyword(s: String) = queryreservedWords.contains(s) + + def isDelimiter(s: String) = querydelims.contains(s) + } class QueryLexer(val keywords: Seq[String], val delims: Seq[String]) extends StdLexical with ImplicitConversions { http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2615b308/repository/src/test/java/org/apache/atlas/discovery/GraphBackedDiscoveryServiceTest.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/discovery/GraphBackedDiscoveryServiceTest.java b/repository/src/test/java/org/apache/atlas/discovery/GraphBackedDiscoveryServiceTest.java index 120187d..f3fdf08 100755 --- a/repository/src/test/java/org/apache/atlas/discovery/GraphBackedDiscoveryServiceTest.java +++ b/repository/src/test/java/org/apache/atlas/discovery/GraphBackedDiscoveryServiceTest.java @@ -1006,6 +1006,18 @@ public class GraphBackedDiscoveryServiceTest extends BaseRepositoryTest { System.out.println("results = " + results); } + @Test + public void testSearchForTypeWithReservedKeywordAttributes() throws Exception { + createTypesWithReservedKeywordAttributes(); + + String dslQuery = "from OrderType where `order` = 1"; + String jsonResults = searchByDSL(dslQuery); + assertNotNull(jsonResults); + + JSONObject results = new JSONObject(jsonResults); + System.out.println("results = " + results); + } + /* * Type Hierarchy is: * A(a) @@ -1028,6 +1040,15 @@ public class GraphBackedDiscoveryServiceTest extends BaseRepositoryTest { TypeSystem.getInstance().defineClassTypes(A, B, C, D); } + private void createTypesWithReservedKeywordAttributes() throws Exception { + HierarchicalTypeDefinition orderType = createClassTypeDef("OrderType", null, createRequiredAttrDef("order", DataTypes.INT_TYPE)); + + HierarchicalTypeDefinition limitType = + createClassTypeDef("LimitType", null, createOptionalAttrDef("limit", DataTypes.BOOLEAN_TYPE)); + + TypeSystem.getInstance().defineClassTypes(orderType, limitType); + } + private void createInstances() throws Exception { Referenceable instance = new Referenceable("D"); instance.set("d", 1); http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2615b308/repository/src/test/java/org/apache/atlas/repository/store/graph/AtlasEntityDefStoreV1Test.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/AtlasEntityDefStoreV1Test.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/AtlasEntityDefStoreV1Test.java new file mode 100644 index 0000000..9f69e5b --- /dev/null +++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/AtlasEntityDefStoreV1Test.java @@ -0,0 +1,73 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.atlas.repository.store.graph; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Inject; +import org.apache.atlas.AtlasErrorCode; +import org.apache.atlas.RepositoryMetadataModule; +import org.apache.atlas.exception.AtlasBaseException; +import org.apache.atlas.model.typedef.AtlasEntityDef; +import org.apache.atlas.repository.graph.AtlasGraphProvider; +import org.apache.atlas.type.AtlasTypeUtil; +import org.testng.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.fail; + +/** + * Tests for AtlasEntityStoreV1 + */ +@Guice(modules = RepositoryMetadataModule.class) +public class AtlasEntityDefStoreV1Test { + + @Inject + private + AtlasEntityDefStore entityDefStore; + + @DataProvider + public Object[][] invalidAttributeNameWithReservedKeywords(){ + AtlasEntityDef invalidAttrNameType = + AtlasTypeUtil.createClassTypeDef("Invalid_Attribute_Type", "description", ImmutableSet.<String>of(), + AtlasTypeUtil.createRequiredAttrDef("order", "string"), + AtlasTypeUtil.createRequiredAttrDef("limit", "string")); + + return new Object[][] {{ + invalidAttrNameType + }}; + } + + @Test(dataProvider = "invalidAttributeNameWithReservedKeywords") + public void testCreateTypeWithReservedKeywords(AtlasEntityDef atlasEntityDef) { + try { + entityDefStore.create(atlasEntityDef, null); + } catch (AtlasBaseException e) { + Assert.assertEquals(e.getAtlasErrorCode(), AtlasErrorCode.ATTRIBUTE_NAME_INVALID); + } + } + + @AfterClass + public void clear(){ + AtlasGraphProvider.cleanup(); + } +}
