| /** |
| * 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.graph; |
| |
| import com.google.inject.Inject; |
| import org.apache.atlas.AtlasException; |
| import org.apache.atlas.TestOnlyModule; |
| import org.apache.atlas.TestUtils; |
| import org.apache.atlas.repository.Constants; |
| import org.apache.atlas.repository.graphdb.AtlasGraph; |
| import org.apache.atlas.repository.graphdb.AtlasGraphIndex; |
| import org.apache.atlas.repository.graphdb.AtlasGraphManagement; |
| import org.apache.atlas.repository.graphdb.AtlasPropertyKey; |
| import org.apache.atlas.typesystem.types.ClassType; |
| import org.apache.atlas.typesystem.types.DataTypes; |
| import org.apache.atlas.typesystem.types.EnumType; |
| import org.apache.atlas.typesystem.types.EnumValue; |
| import org.apache.atlas.typesystem.types.HierarchicalTypeDefinition; |
| import org.apache.atlas.typesystem.types.TypeSystem; |
| import org.apache.atlas.typesystem.types.utils.TypesUtil; |
| import org.apache.commons.lang.RandomStringUtils; |
| import org.testng.annotations.Guice; |
| import org.testng.annotations.Test; |
| |
| import java.util.Arrays; |
| import java.util.Set; |
| |
| import static junit.framework.Assert.assertTrue; |
| import static org.apache.atlas.typesystem.types.utils.TypesUtil.createClassTypeDef; |
| import static org.testng.Assert.assertFalse; |
| import static org.testng.Assert.assertNotNull; |
| |
| @Guice(modules = TestOnlyModule.class) |
| public class GraphBackedSearchIndexerTest { |
| @Inject |
| private GraphBackedSearchIndexer graphBackedSearchIndexer; |
| |
| @Test |
| public void verifySystemMixedIndexes() { |
| AtlasGraph graph = TestUtils.getGraph(); |
| AtlasGraphManagement managementSystem = graph.getManagementSystem(); |
| try { |
| AtlasGraphIndex vertexIndex = managementSystem.getGraphIndex(Constants.VERTEX_INDEX); |
| assertNotNull(vertexIndex); |
| assertTrue(vertexIndex.isMixedIndex()); |
| assertFalse(vertexIndex.isEdgeIndex()); |
| assertTrue(vertexIndex.isVertexIndex()); |
| |
| AtlasGraphIndex edgeIndex = managementSystem.getGraphIndex(Constants.EDGE_INDEX); |
| assertNotNull(edgeIndex); |
| assertTrue(edgeIndex.isMixedIndex()); |
| assertTrue(edgeIndex.isEdgeIndex()); |
| assertFalse(edgeIndex.isVertexIndex()); |
| |
| |
| verifyVertexIndexContains(managementSystem, Constants.STATE_PROPERTY_KEY); |
| } |
| finally { |
| managementSystem.rollback(); |
| } |
| } |
| |
| @Test |
| public void verifySystemCompositeIndexes() { |
| AtlasGraph graph = TestUtils.getGraph(); |
| AtlasGraphManagement managementSystem = graph.getManagementSystem(); |
| try { |
| verifySystemCompositeIndex(managementSystem, Constants.GUID_PROPERTY_KEY, true); |
| verifyVertexIndexContains(managementSystem, Constants.GUID_PROPERTY_KEY); |
| |
| verifySystemCompositeIndex(managementSystem, Constants.ENTITY_TYPE_PROPERTY_KEY, false); |
| verifyVertexIndexContains(managementSystem, Constants.ENTITY_TYPE_PROPERTY_KEY); |
| |
| verifySystemCompositeIndex(managementSystem, Constants.SUPER_TYPES_PROPERTY_KEY, false); |
| verifyVertexIndexContains(managementSystem, Constants.SUPER_TYPES_PROPERTY_KEY); |
| |
| verifySystemCompositeIndex(managementSystem, Constants.TRAIT_NAMES_PROPERTY_KEY, false); |
| verifyVertexIndexContains(managementSystem, Constants.TRAIT_NAMES_PROPERTY_KEY); |
| } |
| finally { |
| managementSystem.rollback(); |
| } |
| } |
| |
| @Test |
| public void verifyFullTextIndex() { |
| AtlasGraph graph = TestUtils.getGraph(); |
| AtlasGraphManagement managementSystem = graph.getManagementSystem(); |
| try { |
| AtlasGraphIndex fullTextIndex = managementSystem.getGraphIndex(Constants.FULLTEXT_INDEX); |
| assertTrue(fullTextIndex.isMixedIndex()); |
| |
| Arrays.asList(fullTextIndex.getFieldKeys()).contains( |
| managementSystem.getPropertyKey(Constants.ENTITY_TEXT_PROPERTY_KEY)); |
| } |
| finally { |
| managementSystem.rollback(); |
| } |
| } |
| |
| @Test |
| public void verifyTypeStoreIndexes() { |
| AtlasGraph graph = TestUtils.getGraph(); |
| AtlasGraphManagement managementSystem = graph.getManagementSystem(); |
| try { |
| verifySystemCompositeIndex(managementSystem, Constants.TYPENAME_PROPERTY_KEY, true); |
| verifyVertexIndexContains(managementSystem, Constants.TYPENAME_PROPERTY_KEY); |
| |
| verifySystemCompositeIndex(managementSystem, Constants.VERTEX_TYPE_PROPERTY_KEY, false); |
| verifyVertexIndexContains(managementSystem, Constants.VERTEX_TYPE_PROPERTY_KEY); |
| } |
| finally { |
| managementSystem.rollback(); |
| } |
| |
| } |
| |
| @Test |
| public void verifyUserDefinedTypeIndex() throws AtlasException { |
| AtlasGraph graph = TestUtils.getGraph(); |
| AtlasGraphManagement managementSystem = graph.getManagementSystem(); |
| try { |
| TypeSystem typeSystem = TypeSystem.getInstance(); |
| |
| String enumName = "randomEnum" + RandomStringUtils.randomAlphanumeric(10); |
| EnumType managedType = typeSystem.defineEnumType(enumName, new EnumValue("randomEnumValue", 0)); |
| |
| HierarchicalTypeDefinition<ClassType> databaseTypeDefinition = |
| createClassTypeDef("Database", "Database type description", null, |
| TypesUtil.createUniqueRequiredAttrDef("name", DataTypes.STRING_TYPE), |
| TypesUtil.createRequiredAttrDef("managedType", managedType)); |
| |
| ClassType databaseType = typeSystem.defineClassType(databaseTypeDefinition); |
| graphBackedSearchIndexer.onAdd(Arrays.asList(databaseType)); |
| |
| verifySystemCompositeIndex(managementSystem, "Database.name" + Constants.ENTITY_TYPE_PROPERTY_KEY, false); |
| verifyVertexIndexContains(managementSystem, "Database.name" + Constants.ENTITY_TYPE_PROPERTY_KEY); |
| verifySystemCompositeIndex(managementSystem, "Database.name" + Constants.SUPER_TYPES_PROPERTY_KEY, false); |
| |
| verifyVertexIndexContains(managementSystem, "Database.managedType"); |
| } |
| finally { |
| //search indexer uses its own titan management transaction |
| managementSystem.rollback(); |
| } |
| } |
| |
| private void verifyVertexIndexContains(AtlasGraphManagement managementSystem, String indexName) { |
| AtlasGraphIndex vertexIndex = managementSystem.getGraphIndex(Constants.VERTEX_INDEX); |
| Set<AtlasPropertyKey> fieldKeys = vertexIndex.getFieldKeys(); |
| Arrays.asList(fieldKeys).contains(managementSystem.getPropertyKey(indexName)); |
| } |
| |
| private void verifySystemCompositeIndex(AtlasGraphManagement managementSystem, String indexName, boolean isUnique) { |
| AtlasGraphIndex systemIndex = managementSystem.getGraphIndex(indexName); |
| assertNotNull(systemIndex); |
| assertTrue(systemIndex.isCompositeIndex()); |
| if (isUnique) { |
| assertTrue(systemIndex.isUnique()); |
| } else { |
| assertFalse(systemIndex.isUnique()); |
| } |
| } |
| } |