You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2017/02/09 01:48:10 UTC
incubator-atlas git commit: ATLAS-1541: renamed GraphEntityMapper to
EntityGraphRetriever;
added methods to retrieve an entity from the given vertex
Repository: incubator-atlas
Updated Branches:
refs/heads/master db18c8240 -> a67e89625
ATLAS-1541: renamed GraphEntityMapper to EntityGraphRetriever; added methods to retrieve an entity from the given vertex
Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/a67e8962
Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/a67e8962
Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/a67e8962
Branch: refs/heads/master
Commit: a67e896253e3af4631cfbe40c77e14221f06f278
Parents: db18c82
Author: Madhan Neethiraj <ma...@apache.org>
Authored: Wed Feb 8 14:56:40 2017 -0800
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Wed Feb 8 17:48:04 2017 -0800
----------------------------------------------------------------------
.../store/graph/v1/AtlasEntityStoreV1.java | 13 +-
.../store/graph/v1/EntityGraphRetriever.java | 410 +++++++++++++++++++
.../store/graph/v1/GraphEntityMapper.java | 400 ------------------
.../store/graph/v1/AtlasEntityStoreV1Test.java | 4 +-
4 files changed, 418 insertions(+), 409 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a67e8962/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
index a95ae8e..365f3cd 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
@@ -55,18 +55,15 @@ import java.util.Map;
public class AtlasEntityStoreV1 implements AtlasEntityStore {
protected AtlasTypeRegistry typeRegistry;
- protected final GraphHelper graphHelper = GraphHelper.getInstance();
private final EntityGraphMapper graphMapper;
- private final GraphEntityMapper entityMapper;
private final AtlasGraph graph;
private static final Logger LOG = LoggerFactory.getLogger(AtlasEntityStoreV1.class);
@Inject
- public AtlasEntityStoreV1(EntityGraphMapper vertexMapper, GraphEntityMapper entityMapper) {
+ public AtlasEntityStoreV1(EntityGraphMapper vertexMapper) {
this.graphMapper = vertexMapper;
- this.entityMapper = entityMapper;
this.graph = AtlasGraphProvider.getGraphInstance();
}
@@ -81,7 +78,9 @@ public class AtlasEntityStoreV1 implements AtlasEntityStore {
LOG.debug("Retrieving entity with guid={}", guid);
}
- return entityMapper.toAtlasEntity(guid, true);
+ EntityGraphRetriever entityRetriever = new EntityGraphRetriever(typeRegistry);
+
+ return entityRetriever.toAtlasEntityWithExtInfo(guid);
}
@Override
@@ -112,7 +111,9 @@ public class AtlasEntityStoreV1 implements AtlasEntityStore {
String guid = GraphHelper.getGuid(entityVertex);
- return entityMapper.toAtlasEntity(guid, true);
+ EntityGraphRetriever entityRetriever = new EntityGraphRetriever(typeRegistry);
+
+ return entityRetriever.toAtlasEntityWithExtInfo(guid);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a67e8962/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java
new file mode 100644
index 0000000..e3c1f5c
--- /dev/null
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java
@@ -0,0 +1,410 @@
+/**
+ * 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.v1;
+
+import org.apache.atlas.AtlasErrorCode;
+import org.apache.atlas.AtlasException;
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityExtInfo;
+import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo;
+import org.apache.atlas.model.instance.AtlasObjectId;
+import org.apache.atlas.model.instance.AtlasStruct;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
+import org.apache.atlas.repository.graph.GraphHelper;
+import org.apache.atlas.repository.graphdb.AtlasEdge;
+import org.apache.atlas.repository.graphdb.AtlasEdgeDirection;
+import org.apache.atlas.repository.graphdb.AtlasVertex;
+import org.apache.atlas.type.AtlasArrayType;
+import org.apache.atlas.type.AtlasMapType;
+import org.apache.atlas.type.AtlasStructType;
+import org.apache.atlas.type.AtlasStructType.AtlasAttribute;
+import org.apache.atlas.type.AtlasType;
+import org.apache.atlas.type.AtlasTypeRegistry;
+import org.apache.commons.collections.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BIGDECIMAL;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BOOLEAN;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BYTE;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_DATE;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_DOUBLE;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_FLOAT;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_INT;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_LONG;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_SHORT;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_STRING;
+import static org.apache.atlas.repository.graph.GraphHelper.EDGE_LABEL_PREFIX;
+
+
+public final class EntityGraphRetriever {
+ private static final Logger LOG = LoggerFactory.getLogger(EntityGraphRetriever.class);
+
+ private static final GraphHelper graphHelper = GraphHelper.getInstance();
+
+ private final AtlasTypeRegistry typeRegistry;
+
+ public EntityGraphRetriever(AtlasTypeRegistry typeRegistry) {
+ this.typeRegistry = typeRegistry;
+ }
+
+ public AtlasEntity toAtlasEntity(String guid) throws AtlasBaseException {
+ return toAtlasEntity(getEntityVertex(guid));
+ }
+
+ public AtlasEntity toAtlasEntity(AtlasVertex entityVertex) throws AtlasBaseException {
+ return mapVertexToAtlasEntity(entityVertex, null);
+ }
+
+ public AtlasEntityWithExtInfo toAtlasEntityWithExtInfo(String guid) throws AtlasBaseException {
+ return toAtlasEntityWithExtInfo(getEntityVertex(guid));
+ }
+
+ public AtlasEntityWithExtInfo toAtlasEntityWithExtInfo(AtlasVertex entityVertex) throws AtlasBaseException {
+ AtlasEntityExtInfo entityExtInfo = new AtlasEntityExtInfo();
+ AtlasEntity entity = mapVertexToAtlasEntity(entityVertex, entityExtInfo);
+ AtlasEntityWithExtInfo ret = new AtlasEntityWithExtInfo(entity, entityExtInfo);
+
+ ret.compact();
+
+ return ret;
+ }
+
+ private AtlasVertex getEntityVertex(String guid) throws AtlasBaseException {
+ try {
+ return graphHelper.getVertexForGUID(guid);
+ } catch (AtlasException excp) {
+ throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid);
+ }
+ }
+
+ private AtlasEntity mapVertexToAtlasEntity(AtlasVertex entityVertex, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException {
+ String guid = GraphHelper.getGuid(entityVertex);
+ AtlasEntity entity = entityExtInfo != null ? entityExtInfo.getEntity(guid) : null;
+
+ if (entity == null) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Mapping graph vertex to atlas entity for guid {}", guid);
+ }
+
+ entity = new AtlasEntity();
+
+ if (entityExtInfo != null) {
+ entityExtInfo.addReferredEntity(guid, entity);
+ }
+
+ mapSystemAttributes(entityVertex, entity);
+
+ mapAttributes(entityVertex, entity, entityExtInfo);
+
+ mapClassifications(entityVertex, entity, entityExtInfo);
+ }
+
+ return entity;
+ }
+
+ private AtlasEntity mapSystemAttributes(AtlasVertex entityVertex, AtlasEntity entity) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Mapping system attributes for type {}", entity.getTypeName());
+ }
+
+ entity.setGuid(GraphHelper.getGuid(entityVertex));
+ entity.setTypeName(GraphHelper.getTypeName(entityVertex));
+ entity.setStatus(GraphHelper.getStatus(entityVertex));
+ entity.setVersion(GraphHelper.getVersion(entityVertex).longValue());
+
+ entity.setCreatedBy(GraphHelper.getCreatedByAsString(entityVertex));
+ entity.setUpdatedBy(GraphHelper.getModifiedByAsString(entityVertex));
+
+ entity.setCreateTime(new Date(GraphHelper.getCreatedTime(entityVertex)));
+ entity.setUpdateTime(new Date(GraphHelper.getModifiedTime(entityVertex)));
+
+ return entity;
+ }
+
+ private void mapAttributes(AtlasVertex entityVertex, AtlasStruct struct, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException {
+ AtlasType objType = typeRegistry.getType(struct.getTypeName());
+
+ if (!(objType instanceof AtlasStructType)) {
+ throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, struct.getTypeName());
+ }
+
+ AtlasStructType structType = (AtlasStructType) objType;
+
+ for (AtlasAttribute attribute : structType.getAllAttributes().values()) {
+ Object attrValue = mapVertexToAttribute(entityVertex, attribute, entityExtInfo);
+
+ struct.setAttribute(attribute.getName(), attrValue);
+ }
+ }
+
+ private void mapClassifications(AtlasVertex entityVertex, AtlasEntity entity, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException {
+ List<String> classificationNames = GraphHelper.getTraitNames(entityVertex);
+
+ if (CollectionUtils.isNotEmpty(classificationNames)) {
+ List<AtlasClassification> classifications = new ArrayList<>(classificationNames.size());
+
+ for (String classficationName : classificationNames) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("mapping classification {} to atlas entity", classficationName);
+ }
+
+ Iterable<AtlasEdge> edges = entityVertex.getEdges(AtlasEdgeDirection.OUT, classficationName);
+ AtlasEdge edge = (edges != null && edges.iterator().hasNext()) ? edges.iterator().next() : null;
+
+ if (edge != null) {
+ AtlasClassification classification = new AtlasClassification(classficationName);
+
+ mapAttributes(edge.getInVertex(), classification, entityExtInfo);
+
+ classifications.add(classification);
+ }
+ }
+
+ entity.setClassifications(classifications);
+ }
+ }
+
+ private Object mapVertexToAttribute(AtlasVertex entityVertex, AtlasAttribute attribute, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException {
+ Object ret = null;
+ AtlasType attrType = attribute.getAttributeType();
+ String vertexPropertyName = attribute.getQualifiedName();
+ String edgeLabel = EDGE_LABEL_PREFIX + vertexPropertyName;
+ boolean isOwnedAttribute = attribute.isOwnedRef();
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Mapping vertex {} to atlas entity {}.{}", entityVertex, attribute.getDefinedInDef().getName(), attribute.getName());
+ }
+
+ switch (attrType.getTypeCategory()) {
+ case PRIMITIVE:
+ ret = mapVertexToPrimitive(entityVertex, vertexPropertyName, attribute.getAttributeDef());
+ break;
+ case ENUM:
+ ret = GraphHelper.getProperty(entityVertex, vertexPropertyName);
+ break;
+ case STRUCT:
+ ret = mapVertexToStruct(entityVertex, edgeLabel, null, entityExtInfo);
+ break;
+ case ENTITY:
+ ret = mapVertexToObjectId(entityVertex, edgeLabel, null, entityExtInfo, isOwnedAttribute);
+ break;
+ case ARRAY:
+ ret = mapVertexToArray(entityVertex, (AtlasArrayType) attrType, vertexPropertyName, entityExtInfo, isOwnedAttribute);
+ break;
+ case MAP:
+ ret = mapVertexToMap(entityVertex, (AtlasMapType) attrType, vertexPropertyName, entityExtInfo, isOwnedAttribute);
+ break;
+ case CLASSIFICATION:
+ // do nothing
+ break;
+ }
+
+ return ret;
+ }
+
+ private Map<String, Object> mapVertexToMap(AtlasVertex entityVertex, AtlasMapType atlasMapType, final String propertyName,
+ AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute) throws AtlasBaseException {
+ List<String> mapKeys = GraphHelper.getListProperty(entityVertex, propertyName);
+
+ if (CollectionUtils.isEmpty(mapKeys)) {
+ return null;
+ }
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Mapping map attribute {} for vertex {}", atlasMapType.getTypeName(), entityVertex);
+ }
+
+ Map<String, Object> ret = new HashMap<>(mapKeys.size());
+ AtlasType mapValueType = atlasMapType.getValueType();
+
+ for (String mapKey : mapKeys) {
+ final String keyPropertyName = propertyName + "." + mapKey;
+ final String edgeLabel = EDGE_LABEL_PREFIX + keyPropertyName;
+ final Object keyValue = GraphHelper.getMapValueProperty(mapValueType, entityVertex, keyPropertyName);
+
+ Object mapValue = mapVertexToCollectionEntry(entityVertex, mapValueType, keyValue, edgeLabel, entityExtInfo, isOwnedAttribute);
+ if (mapValue != null) {
+ ret.put(mapKey, mapValue);
+ }
+ }
+
+ return ret;
+ }
+
+ private List<Object> mapVertexToArray(AtlasVertex entityVertex, AtlasArrayType arrayType, String propertyName,
+ AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute) throws AtlasBaseException {
+ AtlasType arrayElementType = arrayType.getElementType();
+ List<Object> arrayElements = GraphHelper.getArrayElementsProperty(arrayElementType, entityVertex, propertyName);
+
+ if (CollectionUtils.isEmpty(arrayElements)) {
+ return null;
+ }
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Mapping array attribute {} for vertex {}", arrayElementType.getTypeName(), entityVertex);
+ }
+
+ List arrValues = new ArrayList(arrayElements.size());
+ String edgeLabel = EDGE_LABEL_PREFIX + propertyName;
+
+ for (Object element : arrayElements) {
+ Object arrValue = mapVertexToCollectionEntry(entityVertex, arrayElementType, element,
+ edgeLabel, entityExtInfo, isOwnedAttribute);
+
+ if (arrValue != null) {
+ arrValues.add(arrValue);
+ }
+ }
+
+ return arrValues;
+ }
+
+ private Object mapVertexToCollectionEntry(AtlasVertex entityVertex, AtlasType arrayElement, Object value, String edgeLabel,
+ AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute) throws AtlasBaseException {
+ Object ret = null;
+
+ switch (arrayElement.getTypeCategory()) {
+ case PRIMITIVE:
+ case ENUM:
+ ret = value;
+ break;
+
+ case ARRAY:
+ case MAP:
+ case CLASSIFICATION:
+ break;
+
+ case STRUCT:
+ ret = mapVertexToStruct(entityVertex, edgeLabel, (AtlasEdge) value, entityExtInfo);
+ break;
+
+ case ENTITY:
+ ret = mapVertexToObjectId(entityVertex, edgeLabel, (AtlasEdge) value, entityExtInfo, isOwnedAttribute);
+ break;
+
+ default:
+ break;
+ }
+
+ return ret;
+ }
+
+ private Object mapVertexToPrimitive(AtlasVertex entityVertex, final String vertexPropertyName, AtlasAttributeDef attrDef) {
+ Object ret = null;
+
+ if (GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Object.class) == null) {
+ return null;
+ }
+
+ switch (attrDef.getTypeName().toLowerCase()) {
+ case ATLAS_TYPE_STRING:
+ ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, String.class);
+ break;
+ case ATLAS_TYPE_SHORT:
+ ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Short.class);
+ break;
+ case ATLAS_TYPE_INT:
+ ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Integer.class);
+ break;
+ case ATLAS_TYPE_BIGINTEGER:
+ ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, BigInteger.class);
+ break;
+ case ATLAS_TYPE_BOOLEAN:
+ ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Boolean.class);
+ break;
+ case ATLAS_TYPE_BYTE:
+ ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Byte.class);
+ break;
+ case ATLAS_TYPE_LONG:
+ ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Long.class);
+ break;
+ case ATLAS_TYPE_FLOAT:
+ ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Float.class);
+ break;
+ case ATLAS_TYPE_DOUBLE:
+ ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Double.class);
+ break;
+ case ATLAS_TYPE_BIGDECIMAL:
+ ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, BigDecimal.class);
+ break;
+ case ATLAS_TYPE_DATE:
+ ret = new Date(GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Long.class));
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+ }
+
+ private AtlasObjectId mapVertexToObjectId(AtlasVertex entityVertex, String edgeLabel, AtlasEdge edge,
+ AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute) throws AtlasBaseException {
+ AtlasObjectId ret = null;
+
+ if (edge == null) {
+ edge = graphHelper.getEdgeForLabel(entityVertex, edgeLabel);
+ }
+
+ if (GraphHelper.elementExists(edge)) {
+ final AtlasVertex referenceVertex = edge.getInVertex();
+
+ if (referenceVertex != null) {
+ if (entityExtInfo != null && isOwnedAttribute) {
+ AtlasEntity entity = mapVertexToAtlasEntity(referenceVertex, entityExtInfo);
+
+ if (entity != null) {
+ ret = entity.getAtlasObjectId();
+ }
+ } else {
+ ret = new AtlasObjectId(GraphHelper.getTypeName(referenceVertex), GraphHelper.getGuid(referenceVertex));
+ }
+ }
+ }
+
+ return ret;
+ }
+
+ private AtlasStruct mapVertexToStruct(AtlasVertex entityVertex, String edgeLabel, AtlasEdge edge, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException {
+ AtlasStruct ret = null;
+
+ if (edge == null) {
+ edge = graphHelper.getEdgeForLabel(entityVertex, edgeLabel);
+ }
+
+ if (GraphHelper.elementExists(edge)) {
+ final AtlasVertex referenceVertex = edge.getInVertex();
+ ret = new AtlasStruct(GraphHelper.getTypeName(referenceVertex));
+
+ mapAttributes(referenceVertex, ret, entityExtInfo);
+ }
+
+ return ret;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a67e8962/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/GraphEntityMapper.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/GraphEntityMapper.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/GraphEntityMapper.java
deleted file mode 100644
index a0d8940..0000000
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/GraphEntityMapper.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/**
- * 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.v1;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.apache.atlas.AtlasErrorCode;
-import org.apache.atlas.AtlasException;
-import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.model.instance.AtlasClassification;
-import org.apache.atlas.model.instance.AtlasEntity;
-import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityExtInfo;
-import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo;
-import org.apache.atlas.model.instance.AtlasObjectId;
-import org.apache.atlas.model.instance.AtlasStruct;
-import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
-import org.apache.atlas.repository.Constants;
-import org.apache.atlas.repository.graph.GraphHelper;
-import org.apache.atlas.repository.graphdb.AtlasEdge;
-import org.apache.atlas.repository.graphdb.AtlasEdgeDirection;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.atlas.type.AtlasArrayType;
-import org.apache.atlas.type.AtlasMapType;
-import org.apache.atlas.type.AtlasStructType;
-import org.apache.atlas.type.AtlasStructType.AtlasAttribute;
-import org.apache.atlas.type.AtlasType;
-import org.apache.atlas.type.AtlasTypeRegistry;
-import org.apache.commons.collections.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BIGDECIMAL;
-import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER;
-import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BOOLEAN;
-import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BYTE;
-import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_DATE;
-import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_DOUBLE;
-import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_FLOAT;
-import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_INT;
-import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_LONG;
-import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_SHORT;
-import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_STRING;
-import static org.apache.atlas.repository.graph.GraphHelper.EDGE_LABEL_PREFIX;
-
-@Singleton
-public final class GraphEntityMapper {
- private static final Logger LOG = LoggerFactory.getLogger(GraphEntityMapper.class);
- private static final GraphHelper graphHelper = GraphHelper.getInstance();
-
- @Inject
- protected AtlasTypeRegistry typeRegistry;
-
- public AtlasEntityWithExtInfo toAtlasEntity(String guid, boolean includeReferences) throws AtlasBaseException {
- AtlasEntityExtInfo entityExtInfo = includeReferences ? new AtlasEntityExtInfo() : null;
- AtlasEntity entity = mapVertexToAtlasEntity(guid, entityExtInfo);
- AtlasEntityWithExtInfo ret = new AtlasEntityWithExtInfo(entity, entityExtInfo);
-
- ret.compact();
-
- return ret;
- }
-
- private AtlasEntity mapVertexToAtlasEntity(String guid, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException {
- AtlasEntity entity = entityExtInfo != null ? entityExtInfo.getEntity(guid) : null;
-
- if (entity != null) {
- return entity;
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Mapping graph vertex to atlas entity for guid {}", guid);
- }
-
- try {
- AtlasVertex entityVertex = graphHelper.getVertexForGUID(guid);
- entity = new AtlasEntity();
-
- if (entityExtInfo != null) {
- entityExtInfo.addReferredEntity(guid, entity);
- }
-
- mapSystemAttributes(entityVertex, entity);
-
- mapAttributes(entityVertex, entity, entityExtInfo);
-
- mapClassifications(entityVertex, entity, entityExtInfo);
-
- } catch (AtlasException e) {
- throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid);
- }
-
- return entity;
- }
-
- private AtlasEntity mapSystemAttributes(AtlasVertex entityVertex, AtlasEntity entity) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Mapping system attributes for type {}", entity.getTypeName());
- }
-
- entity.setGuid(GraphHelper.getGuid(entityVertex));
- entity.setTypeName(GraphHelper.getSingleValuedProperty(entityVertex, Constants.ENTITY_TYPE_PROPERTY_KEY, String.class));
- entity.setStatus(GraphHelper.getStatus(entityVertex));
- entity.setVersion(GraphHelper.getVersion(entityVertex).longValue());
-
- entity.setCreatedBy(GraphHelper.getCreatedByAsString(entityVertex));
- entity.setUpdatedBy(GraphHelper.getModifiedByAsString(entityVertex));
-
- entity.setCreateTime(new Date(GraphHelper.getCreatedTime(entityVertex)));
- entity.setUpdateTime(new Date(GraphHelper.getModifiedTime(entityVertex)));
-
- return entity;
- }
-
- private void mapAttributes(AtlasVertex entityVertex, AtlasStruct struct, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException {
- AtlasType objType = typeRegistry.getType(struct.getTypeName());
-
- if (!(objType instanceof AtlasStructType)) {
- throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, struct.getTypeName());
- }
-
- AtlasStructType structType = (AtlasStructType) objType;
- Collection<AtlasAttribute> attributes = structType.getAllAttributes().values();
-
- if (CollectionUtils.isNotEmpty(attributes)) {
- for (AtlasAttribute attribute : attributes) {
- Object attrValue = mapVertexToAttribute(entityVertex, attribute, entityExtInfo);
-
- struct.setAttribute(attribute.getName(), attrValue);
- }
- }
- }
-
- private void mapClassifications(AtlasVertex entityVertex, AtlasEntity entity, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException {
- List<String> classficationNames = GraphHelper.getTraitNames(entityVertex);
-
- if (CollectionUtils.isNotEmpty(classficationNames)) {
- List<AtlasClassification> classifications = new ArrayList<>();
-
- for (String classficationName : classficationNames) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("mapping classification {} to atlas entity", classficationName);
- }
-
- Iterable<AtlasEdge> edges = entityVertex.getEdges(AtlasEdgeDirection.OUT, classficationName);
-
- AtlasEdge edge = (edges != null && edges.iterator().hasNext()) ? edges.iterator().next() : null;
-
- if (edge != null) {
- AtlasClassification classification = new AtlasClassification(classficationName);
-
- mapAttributes(edge.getInVertex(), classification, entityExtInfo);
-
- classifications.add(classification);
- }
- }
-
- entity.setClassifications(classifications);
- }
- }
-
- private Object mapVertexToAttribute(AtlasVertex entityVertex, AtlasAttribute attribute, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException {
- Object ret = null;
- AtlasType attrType = attribute.getAttributeType();
- String vertexPropertyName = attribute.getQualifiedName();
- String edgeLabel = EDGE_LABEL_PREFIX + vertexPropertyName;
- boolean isOwnedAttribute = attribute.isOwnedRef();
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Mapping vertex {} to atlas entity {}.{}", entityVertex, attribute.getDefinedInDef().getName(), attribute.getName());
- }
-
- switch (attrType.getTypeCategory()) {
- case PRIMITIVE:
- ret = mapVertexToPrimitive(entityVertex, vertexPropertyName, attribute.getAttributeDef());
- break;
- case ENUM:
- ret = GraphHelper.getProperty(entityVertex, vertexPropertyName);
- break;
- case STRUCT:
- ret = mapVertexToStruct(entityVertex, edgeLabel, null, entityExtInfo);
- break;
- case ENTITY:
- ret = mapVertexToObjectId(entityVertex, edgeLabel, null, entityExtInfo, isOwnedAttribute);
- break;
- case ARRAY:
- ret = mapVertexToArray(entityVertex, (AtlasArrayType) attrType, vertexPropertyName, entityExtInfo, isOwnedAttribute);
- break;
- case MAP:
- ret = mapVertexToMap(entityVertex, (AtlasMapType) attrType, vertexPropertyName, entityExtInfo, isOwnedAttribute);
- break;
- case CLASSIFICATION:
- // do nothing
- break;
- }
-
- return ret;
- }
-
- private Map<String, Object> mapVertexToMap(AtlasVertex entityVertex, AtlasMapType atlasMapType, final String propertyName,
- AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute) throws AtlasBaseException {
- Map<String, Object> ret = new HashMap<>();
- List<String> mapKeys = GraphHelper.getListProperty(entityVertex, propertyName);
- AtlasType mapValueType = atlasMapType.getValueType();
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Mapping map attribute {} for vertex {}", atlasMapType.getTypeName(), entityVertex);
- }
-
- if (CollectionUtils.isEmpty(mapKeys)) {
- return null;
- }
-
- for (String mapKey : mapKeys) {
- final String keyPropertyName = propertyName + "." + mapKey;
- final String edgeLabel = EDGE_LABEL_PREFIX + keyPropertyName;
- final Object keyValue = GraphHelper.getMapValueProperty(mapValueType, entityVertex, keyPropertyName);
-
- Object mapValue = mapVertexToCollectionEntry(entityVertex, mapValueType, keyValue, edgeLabel, entityExtInfo, isOwnedAttribute);
- if (mapValue != null) {
- ret.put(mapKey, mapValue);
- }
- }
-
- return ret;
- }
-
- private List<Object> mapVertexToArray(AtlasVertex entityVertex, AtlasArrayType arrayType, String propertyName,
- AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute) throws AtlasBaseException {
- AtlasType arrayElementType = arrayType.getElementType();
- List<Object> arrayElements = GraphHelper.getArrayElementsProperty(arrayElementType, entityVertex, propertyName);
- List arrValues = new ArrayList();
- String edgeLabel = EDGE_LABEL_PREFIX + propertyName;
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Mapping array attribute {} for vertex {}", arrayElementType.getTypeName(), entityVertex);
- }
-
- if (CollectionUtils.isEmpty(arrayElements)) {
- return null;
- }
-
- for (Object element : arrayElements) {
- Object arrValue = mapVertexToCollectionEntry(entityVertex, arrayElementType, element,
- edgeLabel, entityExtInfo, isOwnedAttribute);
-
- arrValues.add(arrValue);
- }
-
- return arrValues;
- }
-
- private Object mapVertexToCollectionEntry(AtlasVertex entityVertex, AtlasType arrayElement, Object value, String edgeLabel,
- AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute) throws AtlasBaseException {
- Object ret = null;
-
- switch (arrayElement.getTypeCategory()) {
- case PRIMITIVE:
- case ENUM:
- ret = value;
- break;
-
- case ARRAY:
- case MAP:
- case CLASSIFICATION:
- break;
-
- case STRUCT:
- ret = mapVertexToStruct(entityVertex, edgeLabel, (AtlasEdge) value, entityExtInfo);
- break;
-
- case ENTITY:
- ret = mapVertexToObjectId(entityVertex, edgeLabel, (AtlasEdge) value, entityExtInfo, isOwnedAttribute);
- break;
-
- default:
- break;
- }
-
- return ret;
- }
-
- private Object mapVertexToPrimitive(AtlasVertex entityVertex, final String vertexPropertyName, AtlasAttributeDef attrDef) {
- Object ret = null;
-
- if (GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Object.class) == null) {
- return null;
- }
-
- switch (attrDef.getTypeName().toLowerCase()) {
- case ATLAS_TYPE_STRING:
- ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, String.class);
- break;
- case ATLAS_TYPE_SHORT:
- ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Short.class);
- break;
- case ATLAS_TYPE_INT:
- ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Integer.class);
- break;
- case ATLAS_TYPE_BIGINTEGER:
- ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, BigInteger.class);
- break;
- case ATLAS_TYPE_BOOLEAN:
- ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Boolean.class);
- break;
- case ATLAS_TYPE_BYTE:
- ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Byte.class);
- break;
- case ATLAS_TYPE_LONG:
- ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Long.class);
- break;
- case ATLAS_TYPE_FLOAT:
- ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Float.class);
- break;
- case ATLAS_TYPE_DOUBLE:
- ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Double.class);
- break;
- case ATLAS_TYPE_BIGDECIMAL:
- ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, BigDecimal.class);
- break;
- case ATLAS_TYPE_DATE:
- ret = new Date(GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Long.class));
- break;
- default:
- break;
- }
-
- return ret;
- }
-
- private AtlasObjectId mapVertexToObjectId(AtlasVertex entityVertex, final String edgeLabel, final AtlasEdge optionalEdge,
- AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute) throws AtlasBaseException {
- AtlasObjectId ret = new AtlasObjectId();
- AtlasEdge edge;
-
- if (optionalEdge == null) {
- edge = graphHelper.getEdgeForLabel(entityVertex, edgeLabel);
- } else {
- edge = optionalEdge;
- }
-
- if (GraphHelper.elementExists(edge)) {
- final AtlasVertex referenceVertex = edge.getInVertex();
- final String guid = GraphHelper.getSingleValuedProperty(referenceVertex, Constants.GUID_PROPERTY_KEY, String.class);
- final String typeName = GraphHelper.getTypeName(referenceVertex);
-
- if (entityExtInfo != null && isOwnedAttribute) {
- mapVertexToAtlasEntity(guid, entityExtInfo);
- }
-
- ret = new AtlasObjectId(typeName, guid);
- }
-
- return ret;
- }
-
- private AtlasStruct mapVertexToStruct(AtlasVertex entityVertex, final String edgeLabel, final AtlasEdge optionalEdge,
- AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException {
- AtlasStruct ret = null;
- AtlasEdge edge;
-
- if (optionalEdge == null) {
- edge = graphHelper.getEdgeForLabel(entityVertex, edgeLabel);
- } else {
- edge = optionalEdge;
- }
-
- if (GraphHelper.elementExists(edge)) {
- final AtlasVertex referenceVertex = edge.getInVertex();
- ret = new AtlasStruct(GraphHelper.getSingleValuedProperty(referenceVertex, Constants.ENTITY_TYPE_PROPERTY_KEY, String.class));
-
- mapAttributes(referenceVertex, ret, entityExtInfo);
- }
-
- return ret;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a67e8962/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java
index 197e46a..ed1e494 100644
--- a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java
+++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java
@@ -69,8 +69,6 @@ import java.util.List;
import java.util.Map;
import static org.apache.atlas.TestUtils.COLUMNS_ATTR_NAME;
-import static org.apache.atlas.TestUtils.COLUMN_TYPE;
-import static org.apache.atlas.TestUtils.NAME;
import static org.apache.atlas.TestUtils.TABLE_TYPE;
import static org.apache.atlas.TestUtils.randomString;
import static org.testng.Assert.assertEquals;
@@ -133,7 +131,7 @@ public class AtlasEntityStoreV1Test {
MapVertexMapper mapVertexMapper = new MapVertexMapper(deleteHandler);
- entityStore = new AtlasEntityStoreV1(new EntityGraphMapper(arrVertexMapper, mapVertexMapper, deleteHandler), new GraphEntityMapper());
+ entityStore = new AtlasEntityStoreV1(new EntityGraphMapper(arrVertexMapper, mapVertexMapper, deleteHandler));
entityStore.init(typeRegistry);
RequestContextV1.clear();