Commit ac808af0 by Madhan Neethiraj

ATLAS-3613: updated search to support namespace attributes

parent 10bcaa80
...@@ -238,6 +238,11 @@ public class AtlasClassificationType extends AtlasStructType { ...@@ -238,6 +238,11 @@ public class AtlasClassificationType extends AtlasStructType {
classificationDef.setSubTypes(subTypes); classificationDef.setSubTypes(subTypes);
} }
@Override
public AtlasAttribute getSystemAttribute(String attributeName) {
return AtlasClassificationType.CLASSIFICATION_ROOT.allAttributes.get(attributeName);
}
private void addSubType(AtlasClassificationType subType) { private void addSubType(AtlasClassificationType subType) {
subTypes.add(subType.getTypeName()); subTypes.add(subType.getTypeName());
} }
......
...@@ -55,7 +55,8 @@ import java.util.Set; ...@@ -55,7 +55,8 @@ import java.util.Set;
public class AtlasEntityType extends AtlasStructType { public class AtlasEntityType extends AtlasStructType {
private static final Logger LOG = LoggerFactory.getLogger(AtlasEntityType.class); private static final Logger LOG = LoggerFactory.getLogger(AtlasEntityType.class);
public static final AtlasEntityType ENTITY_ROOT = initRootEntityType(); public static final AtlasEntityType ENTITY_ROOT = new AtlasRootEntityType();
private static final String NAME = "name"; private static final String NAME = "name";
private static final String DESCRIPTION = "description"; private static final String DESCRIPTION = "description";
private static final String OWNER = "owner"; private static final String OWNER = "owner";
...@@ -64,6 +65,8 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -64,6 +65,8 @@ public class AtlasEntityType extends AtlasStructType {
private static final String OPTION_SCHEMA_ATTRIBUTES = "schemaAttributes"; private static final String OPTION_SCHEMA_ATTRIBUTES = "schemaAttributes";
private static final String INTERNAL_TYPENAME = "__internal"; private static final String INTERNAL_TYPENAME = "__internal";
private static final char NS_ATTRIBUTE_NAME_SEPARATOR = '.';
private static final char DYN_ATTRIBUTE_NAME_SEPARATOR = '.'; private static final char DYN_ATTRIBUTE_NAME_SEPARATOR = '.';
private static final char DYN_ATTRIBUTE_OPEN_DELIM = '{'; private static final char DYN_ATTRIBUTE_OPEN_DELIM = '{';
private static final char DYN_ATTRIBUTE_CLOSE_DELIM = '}'; private static final char DYN_ATTRIBUTE_CLOSE_DELIM = '}';
...@@ -90,7 +93,7 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -90,7 +93,7 @@ public class AtlasEntityType extends AtlasStructType {
private List<AtlasAttribute> dynEvalTriggerAttributes = Collections.emptyList(); private List<AtlasAttribute> dynEvalTriggerAttributes = Collections.emptyList();
private Map<String,List<TemplateToken>> parsedTemplates = Collections.emptyMap(); private Map<String,List<TemplateToken>> parsedTemplates = Collections.emptyMap();
private Set<String> tagPropagationEdges = Collections.emptySet(); private Set<String> tagPropagationEdges = Collections.emptySet();
private Map<String, List<AtlasNamespaceAttribute>> namespaceAttributes = Collections.emptyMap(); private Map<String, Map<String, AtlasNamespaceAttribute>> namespaceAttributes = Collections.emptyMap();
public AtlasEntityType(AtlasEntityDef entityDef) { public AtlasEntityType(AtlasEntityDef entityDef) {
super(entityDef); super(entityDef);
...@@ -237,24 +240,22 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -237,24 +240,22 @@ public class AtlasEntityType extends AtlasStructType {
} }
} }
Map<String, List<AtlasNamespaceAttribute>> superTypeNamespaces = superType.getNamespaceAttributes(); Map<String, Map<String, AtlasNamespaceAttribute>> superTypeNamespaces = superType.getNamespaceAttributes();
if (MapUtils.isNotEmpty(superTypeNamespaces)) { if (MapUtils.isNotEmpty(superTypeNamespaces)) {
for (Map.Entry<String, List<AtlasNamespaceAttribute>> entry : superTypeNamespaces.entrySet()) { for (Map.Entry<String, Map<String, AtlasNamespaceAttribute>> entry : superTypeNamespaces.entrySet()) {
String nsName = entry.getKey(); String nsName = entry.getKey();
List<AtlasNamespaceAttribute> superTypeNsAttrs = entry.getValue(); Map<String, AtlasNamespaceAttribute> superTypeNsAttrs = entry.getValue();
List<AtlasNamespaceAttribute> nsAttrs = namespaceAttributes.get(nsName); Map<String, AtlasNamespaceAttribute> nsAttrs = namespaceAttributes.get(nsName);
if (nsAttrs == null) { if (nsAttrs == null) {
nsAttrs = new ArrayList<>(); nsAttrs = new HashMap<>();
namespaceAttributes.put(nsName, nsAttrs); namespaceAttributes.put(nsName, nsAttrs);
} }
for (AtlasNamespaceAttribute superTypeNsAttr : superTypeNsAttrs) { for (Map.Entry<String, AtlasNamespaceAttribute> nsAttrEntry : superTypeNsAttrs.entrySet()) {
if (!nsAttrs.contains(superTypeNsAttr)) { nsAttrs.put(nsAttrEntry.getKey(), nsAttrEntry.getValue());
nsAttrs.add(superTypeNsAttr);
}
} }
} }
} }
...@@ -306,12 +307,12 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -306,12 +307,12 @@ public class AtlasEntityType extends AtlasStructType {
Map<String, List<AtlasAttributeDef>> namespaceAttributeDefs = new HashMap<>(); Map<String, List<AtlasAttributeDef>> namespaceAttributeDefs = new HashMap<>();
for (Map.Entry<String, List<AtlasNamespaceAttribute>> entry : namespaceAttributes.entrySet()) { for (Map.Entry<String, Map<String, AtlasNamespaceAttribute>> entry : namespaceAttributes.entrySet()) {
String nsName = entry.getKey(); String nsName = entry.getKey();
List<AtlasNamespaceAttribute> nsAttrs = entry.getValue(); Map<String, AtlasNamespaceAttribute> nsAttrs = entry.getValue();
List<AtlasAttributeDef> nsAttrDefs = new ArrayList<>(); List<AtlasAttributeDef> nsAttrDefs = new ArrayList<>();
for (AtlasNamespaceAttribute nsAttr : nsAttrs) { for (AtlasNamespaceAttribute nsAttr : nsAttrs.values()) {
nsAttrDefs.add(nsAttr.getAttributeDef()); nsAttrDefs.add(nsAttr.getAttributeDef());
} }
...@@ -329,6 +330,29 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -329,6 +330,29 @@ public class AtlasEntityType extends AtlasStructType {
} }
} }
@Override
public AtlasAttribute getSystemAttribute(String attributeName) {
return AtlasEntityType.ENTITY_ROOT.allAttributes.get(attributeName);
}
@Override
public AtlasNamespaceAttribute getNamespaceAttribute(String nsAttrQualifiedName) {
AtlasNamespaceAttribute ret = null;
if (nsAttrQualifiedName != null) {
int idxSep = nsAttrQualifiedName.indexOf(AtlasEntityType.NS_ATTRIBUTE_NAME_SEPARATOR);
if (idxSep != -1) {
String nsName = nsAttrQualifiedName.substring(0, idxSep);
String nsAttrName = nsAttrQualifiedName.substring(idxSep + 1);
ret = getNamespaceAttribute(nsName, nsAttrName);
}
}
return ret;
}
public Set<String> getSuperTypes() { public Set<String> getSuperTypes() {
return entityDef.getSuperTypes(); return entityDef.getSuperTypes();
} }
...@@ -407,14 +431,21 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -407,14 +431,21 @@ public class AtlasEntityType extends AtlasStructType {
return CollectionUtils.isNotEmpty(tagPropagationEdges) ? tagPropagationEdges.toArray(new String[tagPropagationEdges.size()]) : null; return CollectionUtils.isNotEmpty(tagPropagationEdges) ? tagPropagationEdges.toArray(new String[tagPropagationEdges.size()]) : null;
} }
public Map<String, List<AtlasNamespaceAttribute>> getNamespaceAttributes() { public Map<String, Map<String, AtlasNamespaceAttribute>> getNamespaceAttributes() {
return namespaceAttributes; return namespaceAttributes;
} }
public List<AtlasNamespaceAttribute> getNamespaceAttributes(String nsName) { public Map<String, AtlasNamespaceAttribute> getNamespaceAttributes(String nsName) {
return namespaceAttributes.get(nsName); return namespaceAttributes.get(nsName);
} }
public AtlasNamespaceAttribute getNamespaceAttribute(String nsName, String nsAttrName) {
Map<String, AtlasNamespaceAttribute> nsAttrs = namespaceAttributes.get(nsName);
AtlasNamespaceAttribute ret = nsAttrs != null ? nsAttrs.get(nsAttrName) : null;
return ret;
}
public Map<String,List<TemplateToken>> getParsedTemplates() { return parsedTemplates; } public Map<String,List<TemplateToken>> getParsedTemplates() { return parsedTemplates; }
public AtlasAttribute getRelationshipAttribute(String attributeName, String relationshipType) { public AtlasAttribute getRelationshipAttribute(String attributeName, String relationshipType) {
...@@ -506,16 +537,16 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -506,16 +537,16 @@ public class AtlasEntityType extends AtlasStructType {
} }
public void addNamespaceAttribute(AtlasNamespaceAttribute attribute) { public void addNamespaceAttribute(AtlasNamespaceAttribute attribute) {
String nsName = attribute.getDefinedInType().getTypeName(); String nsName = attribute.getDefinedInType().getTypeName();
List<AtlasNamespaceAttribute> attributes = namespaceAttributes.get(nsName); Map<String, AtlasNamespaceAttribute> nsAttrs = namespaceAttributes.get(nsName);
if (attributes == null) { if (nsAttrs == null) {
attributes = new ArrayList<>(); nsAttrs = new HashMap<>();
namespaceAttributes.put(nsName, attributes); namespaceAttributes.put(nsName, nsAttrs);
} }
attributes.add(attribute); nsAttrs.put(attribute.getName(), attribute);
} }
public String getQualifiedAttributeName(String attrName) throws AtlasBaseException { public String getQualifiedAttributeName(String attrName) throws AtlasBaseException {
...@@ -739,30 +770,6 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -739,30 +770,6 @@ public class AtlasEntityType extends AtlasStructType {
} }
} }
private static AtlasEntityType initRootEntityType() {
List<AtlasAttributeDef> attributeDefs = new ArrayList<AtlasAttributeDef>() {{
add(new AtlasAttributeDef(TIMESTAMP_PROPERTY_KEY, ATLAS_TYPE_DATE, false, true));
add(new AtlasAttributeDef(MODIFICATION_TIMESTAMP_PROPERTY_KEY, ATLAS_TYPE_DATE, false, true));
add(new AtlasAttributeDef(MODIFIED_BY_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(CREATED_BY_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(STATE_PROPERTY_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(GUID_PROPERTY_KEY, ATLAS_TYPE_STRING, true, true));
add(new AtlasAttributeDef(HISTORICAL_GUID_PROPERTY_KEY, ATLAS_TYPE_STRING, true, true));
add(new AtlasAttributeDef(TYPE_NAME_PROPERTY_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(CLASSIFICATION_TEXT_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(CLASSIFICATION_NAMES_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(PROPAGATED_CLASSIFICATION_NAMES_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(IS_INCOMPLETE_PROPERTY_KEY, ATLAS_TYPE_INT, false, true));
add(new AtlasAttributeDef(LABELS_PROPERTY_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(CUSTOM_ATTRIBUTES_PROPERTY_KEY, ATLAS_TYPE_STRING, false, true));
}};
AtlasEntityDef entityDef = new AtlasEntityDef(ENTITY_ROOT_NAME, "Root entity for system attributes", "1.0", attributeDefs);
return new AtlasEntityType(entityDef);
}
private void addSubType(AtlasEntityType subType) { private void addSubType(AtlasEntityType subType) {
subTypes.add(subType.getTypeName()); subTypes.add(subType.getTypeName());
} }
...@@ -1198,4 +1205,53 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -1198,4 +1205,53 @@ public class AtlasEntityType extends AtlasStructType {
return adj; return adj;
} }
/* this class provides abstractions that help basic-search and dsl-search to deal with
* system-attributes and namespace-attributes
*/
private static class AtlasRootEntityType extends AtlasEntityType {
private AtlasTypeRegistry typeRegistry = null;
public AtlasRootEntityType() {
super(getRootEntityDef());
}
@Override
void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
super.resolveReferences(typeRegistry);
// save typeRegistry for use in getNamespaceAttribute()
this.typeRegistry = typeRegistry;
}
@Override
public AtlasNamespaceAttribute getNamespaceAttribute(String nsName, String nsAttrName) {
AtlasNamespaceType nsType = typeRegistry != null ? typeRegistry.getNamespaceTypeByName(nsName) : null;
AtlasAttribute nsAttr = nsType != null ? nsType.getAttribute(nsAttrName) : null;
return (nsAttr instanceof AtlasNamespaceAttribute) ? (AtlasNamespaceAttribute) nsAttr : null;
}
private static AtlasEntityDef getRootEntityDef() {
List<AtlasAttributeDef> attributeDefs = new ArrayList<AtlasAttributeDef>() {{
add(new AtlasAttributeDef(TIMESTAMP_PROPERTY_KEY, ATLAS_TYPE_DATE, false, true));
add(new AtlasAttributeDef(MODIFICATION_TIMESTAMP_PROPERTY_KEY, ATLAS_TYPE_DATE, false, true));
add(new AtlasAttributeDef(MODIFIED_BY_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(CREATED_BY_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(STATE_PROPERTY_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(GUID_PROPERTY_KEY, ATLAS_TYPE_STRING, true, true));
add(new AtlasAttributeDef(HISTORICAL_GUID_PROPERTY_KEY, ATLAS_TYPE_STRING, true, true));
add(new AtlasAttributeDef(TYPE_NAME_PROPERTY_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(CLASSIFICATION_TEXT_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(CLASSIFICATION_NAMES_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(PROPAGATED_CLASSIFICATION_NAMES_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(IS_INCOMPLETE_PROPERTY_KEY, ATLAS_TYPE_INT, false, true));
add(new AtlasAttributeDef(LABELS_PROPERTY_KEY, ATLAS_TYPE_STRING, false, true));
add(new AtlasAttributeDef(CUSTOM_ATTRIBUTES_PROPERTY_KEY, ATLAS_TYPE_STRING, false, true));
}};
return new AtlasEntityDef(ENTITY_ROOT_NAME, "Root entity for system attributes", "1.0", attributeDefs);
}
}
} }
...@@ -226,17 +226,19 @@ public class AtlasStructType extends AtlasType { ...@@ -226,17 +226,19 @@ public class AtlasStructType extends AtlasType {
ret = getSystemAttribute(attributeName); ret = getSystemAttribute(attributeName);
} }
if (ret == null) {
ret = getNamespaceAttribute(attributeName);
}
return ret; return ret;
} }
public AtlasAttribute getSystemAttribute(String attributeName) { public AtlasAttribute getSystemAttribute(String attributeName) {
AtlasAttribute ret = null; return null;
if (this instanceof AtlasEntityType) { }
ret = AtlasEntityType.ENTITY_ROOT.allAttributes.get(attributeName);
} else if (this instanceof AtlasClassificationType) { public AtlasAttribute getNamespaceAttribute(String attributeName) {
ret = AtlasClassificationType.CLASSIFICATION_ROOT.allAttributes.get(attributeName); return null;
}
return ret;
} }
@Override @Override
......
...@@ -119,9 +119,9 @@ public class GremlinQueryComposer { ...@@ -119,9 +119,9 @@ public class GremlinQueryComposer {
if (ia.isTrait()) { if (ia.isTrait()) {
String traitName = ia.get(); String traitName = ia.get();
if (traitName.equalsIgnoreCase(ALL_CLASSIFICATIONS)) { if (traitName.equals(ALL_CLASSIFICATIONS)) {
addTrait(GremlinClause.ANY_TRAIT, ia); addTrait(GremlinClause.ANY_TRAIT, ia);
} else if (traitName.equalsIgnoreCase(NO_CLASSIFICATIONS)) { } else if (traitName.equals(NO_CLASSIFICATIONS)) {
addTrait(GremlinClause.NO_TRAIT, ia); addTrait(GremlinClause.NO_TRAIT, ia);
} else { } else {
addTrait(GremlinClause.TRAIT, ia); addTrait(GremlinClause.TRAIT, ia);
......
...@@ -20,6 +20,8 @@ package org.apache.atlas.query; ...@@ -20,6 +20,8 @@ package org.apache.atlas.query;
import org.apache.atlas.AtlasErrorCode; import org.apache.atlas.AtlasErrorCode;
import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.type.AtlasNamespaceType;
import org.apache.atlas.type.AtlasType;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import java.util.regex.Matcher; import java.util.regex.Matcher;
...@@ -148,7 +150,6 @@ public class IdentifierHelper { ...@@ -148,7 +150,6 @@ public class IdentifierHelper {
raw = context.getTypeNameFromAlias(this.raw); raw = context.getTypeNameFromAlias(this.raw);
} }
updateParts();
updateTypeInfo(lookup, context); updateTypeInfo(lookup, context);
setIsTrait(context, lookup, attributeName); setIsTrait(context, lookup, attributeName);
updateEdgeInfo(lookup, context); updateEdgeInfo(lookup, context);
...@@ -183,15 +184,29 @@ public class IdentifierHelper { ...@@ -183,15 +184,29 @@ public class IdentifierHelper {
} }
private void updateTypeInfo(org.apache.atlas.query.Lookup lookup, GremlinQueryComposer.Context context) { private void updateTypeInfo(org.apache.atlas.query.Lookup lookup, GremlinQueryComposer.Context context) {
parts = StringUtils.split(raw, ".");
// check if this is a namespace attribute
if (parts.length == 2) {
try {
AtlasType type = lookup.getType(parts[0]);
if (type instanceof AtlasNamespaceType) {
parts = new String[1];
parts[0] = raw;
}
} catch (AtlasBaseException excp) {
// ignore
}
}
if (parts.length == 1) { if (parts.length == 1) {
typeName = context.hasAlias(parts[0]) ? typeName = context.hasAlias(parts[0]) ?
context.getTypeNameFromAlias(parts[0]) : context.getTypeNameFromAlias(parts[0]) :
context.getActiveTypeName(); context.getActiveTypeName();
qualifiedName = getDefaultQualifiedNameForSinglePartName(context, parts[0]); qualifiedName = getDefaultQualifiedNameForSinglePartName(context, parts[0]);
attributeName = parts[0]; attributeName = parts[0];
} } else if (parts.length == 2) {
if (parts.length == 2) {
boolean isAttrOfActiveType = lookup.hasAttribute(context, parts[0]); boolean isAttrOfActiveType = lookup.hasAttribute(context, parts[0]);
if (isAttrOfActiveType) { if (isAttrOfActiveType) {
attributeName = parts[0]; attributeName = parts[0];
...@@ -242,10 +257,6 @@ public class IdentifierHelper { ...@@ -242,10 +257,6 @@ public class IdentifierHelper {
} }
} }
private void updateParts() {
parts = StringUtils.split(raw, ".");
}
public String getQualifiedName() { public String getQualifiedName() {
return qualifiedName; return qualifiedName;
} }
......
...@@ -21,7 +21,6 @@ package org.apache.atlas.query; ...@@ -21,7 +21,6 @@ package org.apache.atlas.query;
import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.TypeCategory; import org.apache.atlas.model.TypeCategory;
import org.apache.atlas.model.typedef.AtlasBaseTypeDef; import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
import org.apache.atlas.repository.Constants;
import org.apache.atlas.type.*; import org.apache.atlas.type.*;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
...@@ -29,20 +28,12 @@ import java.util.*; ...@@ -29,20 +28,12 @@ import java.util.*;
import static org.apache.atlas.discovery.SearchContext.MATCH_ALL_CLASSIFIED; import static org.apache.atlas.discovery.SearchContext.MATCH_ALL_CLASSIFIED;
import static org.apache.atlas.discovery.SearchContext.MATCH_ALL_NOT_CLASSIFIED; import static org.apache.atlas.discovery.SearchContext.MATCH_ALL_NOT_CLASSIFIED;
import static org.apache.atlas.discovery.SearchContext.MATCH_ALL_ENTITY_TYPES;
import static org.apache.atlas.model.discovery.SearchParameters.ALL_CLASSIFICATIONS; import static org.apache.atlas.model.discovery.SearchParameters.ALL_CLASSIFICATIONS;
import static org.apache.atlas.model.discovery.SearchParameters.NO_CLASSIFICATIONS; import static org.apache.atlas.model.discovery.SearchParameters.NO_CLASSIFICATIONS;
import static org.apache.atlas.model.discovery.SearchParameters.ALL_ENTITY_TYPES;
class RegistryBasedLookup implements Lookup { class RegistryBasedLookup implements Lookup {
private static final Set<String> SYSTEM_ATTRIBUTES = new HashSet<>(
Arrays.asList(Constants.GUID_PROPERTY_KEY,
Constants.MODIFIED_BY_KEY,
Constants.CREATED_BY_KEY,
Constants.STATE_PROPERTY_KEY,
Constants.TIMESTAMP_PROPERTY_KEY,
Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY,
Constants.HOME_ID_KEY
));
private static final Map<String, String> NUMERIC_ATTRIBUTES = new HashMap<String, String>() {{ private static final Map<String, String> NUMERIC_ATTRIBUTES = new HashMap<String, String>() {{
put(AtlasBaseTypeDef.ATLAS_TYPE_SHORT, ""); put(AtlasBaseTypeDef.ATLAS_TYPE_SHORT, "");
put(AtlasBaseTypeDef.ATLAS_TYPE_INT, ""); put(AtlasBaseTypeDef.ATLAS_TYPE_INT, "");
...@@ -63,10 +54,12 @@ class RegistryBasedLookup implements Lookup { ...@@ -63,10 +54,12 @@ class RegistryBasedLookup implements Lookup {
public AtlasType getType(String typeName) throws AtlasBaseException { public AtlasType getType(String typeName) throws AtlasBaseException {
AtlasType ret; AtlasType ret;
if (typeName.equalsIgnoreCase(ALL_CLASSIFICATIONS)) { if (typeName.equals(ALL_CLASSIFICATIONS)) {
ret = MATCH_ALL_CLASSIFIED; ret = MATCH_ALL_CLASSIFIED;
} else if (typeName.equalsIgnoreCase(NO_CLASSIFICATIONS)) { } else if (typeName.equals(NO_CLASSIFICATIONS)) {
ret = MATCH_ALL_NOT_CLASSIFIED; ret = MATCH_ALL_NOT_CLASSIFIED;
} else if (typeName.equals(ALL_ENTITY_TYPES)) {
ret = MATCH_ALL_ENTITY_TYPES;
} else { } else {
ret = typeRegistry.getType(typeName); ret = typeRegistry.getType(typeName);
} }
...@@ -81,15 +74,7 @@ class RegistryBasedLookup implements Lookup { ...@@ -81,15 +74,7 @@ class RegistryBasedLookup implements Lookup {
return ""; return "";
} }
if(isSystemAttribute(name)) { return et.getQualifiedAttributeName(name);
return name;
} else {
return et.getQualifiedAttributeName(name);
}
}
private boolean isSystemAttribute(String s) {
return SYSTEM_ATTRIBUTES.contains(s);
} }
@Override @Override
...@@ -99,10 +84,6 @@ class RegistryBasedLookup implements Lookup { ...@@ -99,10 +84,6 @@ class RegistryBasedLookup implements Lookup {
return false; return false;
} }
if(isSystemAttribute(attributeName)) {
return true;
}
AtlasType at = getAttributeType(et, attributeName); AtlasType at = getAttributeType(et, attributeName);
if(at == null) { if(at == null) {
return false; return false;
...@@ -144,8 +125,7 @@ class RegistryBasedLookup implements Lookup { ...@@ -144,8 +125,7 @@ class RegistryBasedLookup implements Lookup {
public boolean hasAttribute(GremlinQueryComposer.Context context, String typeName) { public boolean hasAttribute(GremlinQueryComposer.Context context, String typeName) {
AtlasEntityType entityType = context.getActiveEntityType(); AtlasEntityType entityType = context.getActiveEntityType();
return (entityType != null) && return getAttribute(entityType, typeName) != null;
(isSystemAttribute(typeName) || entityType.hasAttribute(typeName) || entityType.hasRelationshipAttribute(typeName));
} }
@Override @Override
...@@ -178,6 +158,8 @@ class RegistryBasedLookup implements Lookup { ...@@ -178,6 +158,8 @@ class RegistryBasedLookup implements Lookup {
t = MATCH_ALL_CLASSIFIED; t = MATCH_ALL_CLASSIFIED;
} else if (typeName.equalsIgnoreCase(NO_CLASSIFICATIONS)) { } else if (typeName.equalsIgnoreCase(NO_CLASSIFICATIONS)) {
t = MATCH_ALL_NOT_CLASSIFIED; t = MATCH_ALL_NOT_CLASSIFIED;
} else if (typeName.equalsIgnoreCase(ALL_ENTITY_TYPES)) {
t = MATCH_ALL_ENTITY_TYPES;
} else { } else {
t = typeRegistry.getType(typeName); t = typeRegistry.getType(typeName);
} }
...@@ -257,6 +239,11 @@ class RegistryBasedLookup implements Lookup { ...@@ -257,6 +239,11 @@ class RegistryBasedLookup implements Lookup {
@Override @Override
public String getVertexPropertyName(String typeName, String attrName) { public String getVertexPropertyName(String typeName, String attrName) {
AtlasEntityType entityType = typeRegistry.getEntityTypeByName(typeName); AtlasEntityType entityType = typeRegistry.getEntityTypeByName(typeName);
if (entityType == null && StringUtils.equals(typeName, ALL_ENTITY_TYPES)) {
entityType = MATCH_ALL_ENTITY_TYPES;
}
AtlasStructType.AtlasAttribute attribute = getAttribute(entityType, attrName); AtlasStructType.AtlasAttribute attribute = getAttribute(entityType, attrName);
if (attribute == null) { if (attribute == null) {
return null; return null;
......
...@@ -1377,19 +1377,19 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore { ...@@ -1377,19 +1377,19 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore {
private void validateNamespaceAttributes(AtlasVertex entityVertex, AtlasEntityType entityType, Map<String, Map<String, Object>> entityNamespaces, boolean isOverwrite) throws AtlasBaseException { private void validateNamespaceAttributes(AtlasVertex entityVertex, AtlasEntityType entityType, Map<String, Map<String, Object>> entityNamespaces, boolean isOverwrite) throws AtlasBaseException {
List<String> messages = new ArrayList<>(); List<String> messages = new ArrayList<>();
Map<String, List<AtlasNamespaceAttribute>> entityTypeNamespaces = entityType.getNamespaceAttributes(); Map<String, Map<String, AtlasNamespaceAttribute>> entityTypeNamespaces = entityType.getNamespaceAttributes();
for (String nsName : entityNamespaces.keySet()) { for (String nsName : entityNamespaces.keySet()) {
if (!entityNamespaces.containsKey(nsName)) { if (!entityTypeNamespaces.containsKey(nsName)) {
messages.add(nsName + ": invalid namespace for entity type " + entityType.getTypeName()); messages.add(nsName + ": invalid namespace for entity type " + entityType.getTypeName());
continue; continue;
} }
List<AtlasNamespaceAttribute> entityTypeNsAttributes = entityTypeNamespaces.get(nsName); Map<String, AtlasNamespaceAttribute> entityTypeNsAttributes = entityTypeNamespaces.get(nsName);
Map<String, Object> entityNsAttributes = entityNamespaces.get(nsName); Map<String, Object> entityNsAttributes = entityNamespaces.get(nsName);
for (AtlasNamespaceAttribute nsAttribute : entityTypeNsAttributes) { for (AtlasNamespaceAttribute nsAttribute : entityTypeNsAttributes.values()) {
AtlasType attrType = nsAttribute.getAttributeType(); AtlasType attrType = nsAttribute.getAttributeType();
String attrName = nsAttribute.getName(); String attrName = nsAttribute.getName();
Object attrValue = entityNsAttributes.get(attrName); Object attrValue = entityNsAttributes.get(attrName);
......
...@@ -427,14 +427,14 @@ public class EntityGraphMapper { ...@@ -427,14 +427,14 @@ public class EntityGraphMapper {
LOG.debug("==> setNamespaceAttributes(entityVertex={}, entityType={}, entityNamespaces={}", entityVertex, entityType.getTypeName(), entityNamespaces); LOG.debug("==> setNamespaceAttributes(entityVertex={}, entityType={}, entityNamespaces={}", entityVertex, entityType.getTypeName(), entityNamespaces);
} }
Map<String, List<AtlasNamespaceAttribute>> entityTypeNamespaces = entityType.getNamespaceAttributes(); Map<String, Map<String, AtlasNamespaceAttribute>> entityTypeNamespaces = entityType.getNamespaceAttributes();
for (Map.Entry<String, List<AtlasNamespaceAttribute>> entry : entityTypeNamespaces.entrySet()) { for (Map.Entry<String, Map<String, AtlasNamespaceAttribute>> entry : entityTypeNamespaces.entrySet()) {
String nsName = entry.getKey(); String nsName = entry.getKey();
List<AtlasNamespaceAttribute> entityTypeNsAttributes = entry.getValue(); Map<String, AtlasNamespaceAttribute> entityTypeNsAttributes = entry.getValue();
Map<String, Object> entityNsAttributes = MapUtils.isEmpty(entityNamespaces) ? null : entityNamespaces.get(nsName); Map<String, Object> entityNsAttributes = MapUtils.isEmpty(entityNamespaces) ? null : entityNamespaces.get(nsName);
for (AtlasNamespaceAttribute nsAttribute : entityTypeNsAttributes) { for (AtlasNamespaceAttribute nsAttribute : entityTypeNsAttributes.values()) {
String nsAttrName = nsAttribute.getName(); String nsAttrName = nsAttribute.getName();
Object nsAttrExistingValue = entityVertex.getProperty(nsAttribute.getVertexPropertyName(), Object.class); Object nsAttrExistingValue = entityVertex.getProperty(nsAttribute.getVertexPropertyName(), Object.class);
Object nsAttrNewValue = MapUtils.isEmpty(entityNsAttributes) ? null : entityNsAttributes.get(nsAttrName); Object nsAttrNewValue = MapUtils.isEmpty(entityNsAttributes) ? null : entityNsAttributes.get(nsAttrName);
...@@ -480,19 +480,19 @@ public class EntityGraphMapper { ...@@ -480,19 +480,19 @@ public class EntityGraphMapper {
LOG.debug("==> addOrUpdateNamespaceAttributes(entityVertex={}, entityType={}, entityNamespaces={}", entityVertex, entityType.getTypeName(), entityNamespaces); LOG.debug("==> addOrUpdateNamespaceAttributes(entityVertex={}, entityType={}, entityNamespaces={}", entityVertex, entityType.getTypeName(), entityNamespaces);
} }
Map<String, List<AtlasNamespaceAttribute>> entityTypeNamespaces = entityType.getNamespaceAttributes(); Map<String, Map<String, AtlasNamespaceAttribute>> entityTypeNamespaces = entityType.getNamespaceAttributes();
if (MapUtils.isNotEmpty(entityTypeNamespaces) && MapUtils.isNotEmpty(entityNamespaces)) { if (MapUtils.isNotEmpty(entityTypeNamespaces) && MapUtils.isNotEmpty(entityNamespaces)) {
for (Map.Entry<String, List<AtlasNamespaceAttribute>> entry : entityTypeNamespaces.entrySet()) { for (Map.Entry<String, Map<String, AtlasNamespaceAttribute>> entry : entityTypeNamespaces.entrySet()) {
String nsName = entry.getKey(); String nsName = entry.getKey();
List<AtlasNamespaceAttribute> entityTypeNsAttributes = entry.getValue(); Map<String, AtlasNamespaceAttribute> entityTypeNsAttributes = entry.getValue();
Map<String, Object> entityNsAttributes = entityNamespaces.get(nsName); Map<String, Object> entityNsAttributes = entityNamespaces.get(nsName);
if (MapUtils.isEmpty(entityNsAttributes)) { if (MapUtils.isEmpty(entityNsAttributes)) {
continue; continue;
} }
for (AtlasNamespaceAttribute nsAttribute : entityTypeNsAttributes) { for (AtlasNamespaceAttribute nsAttribute : entityTypeNsAttributes.values()) {
String nsAttrName = nsAttribute.getName(); String nsAttrName = nsAttribute.getName();
if (!entityNsAttributes.containsKey(nsAttrName)) { if (!entityNsAttributes.containsKey(nsAttrName)) {
...@@ -528,12 +528,12 @@ public class EntityGraphMapper { ...@@ -528,12 +528,12 @@ public class EntityGraphMapper {
LOG.debug("==> removeNamespaceAttributes(entityVertex={}, entityType={}, entityNamespaces={}", entityVertex, entityType.getTypeName(), entityNamespaces); LOG.debug("==> removeNamespaceAttributes(entityVertex={}, entityType={}, entityNamespaces={}", entityVertex, entityType.getTypeName(), entityNamespaces);
} }
Map<String, List<AtlasNamespaceAttribute>> entityTypeNamespaces = entityType.getNamespaceAttributes(); Map<String, Map<String, AtlasNamespaceAttribute>> entityTypeNamespaces = entityType.getNamespaceAttributes();
if (MapUtils.isNotEmpty(entityTypeNamespaces) && MapUtils.isNotEmpty(entityNamespaces)) { if (MapUtils.isNotEmpty(entityTypeNamespaces) && MapUtils.isNotEmpty(entityNamespaces)) {
for (Map.Entry<String, List<AtlasNamespaceAttribute>> entry : entityTypeNamespaces.entrySet()) { for (Map.Entry<String, Map<String, AtlasNamespaceAttribute>> entry : entityTypeNamespaces.entrySet()) {
String nsName = entry.getKey(); String nsName = entry.getKey();
List<AtlasNamespaceAttribute> entityTypeNsAttributes = entry.getValue(); Map<String, AtlasNamespaceAttribute> entityTypeNsAttributes = entry.getValue();
if (!entityNamespaces.containsKey(nsName)) { // nothing to remove for this namespace if (!entityNamespaces.containsKey(nsName)) { // nothing to remove for this namespace
continue; continue;
...@@ -541,7 +541,7 @@ public class EntityGraphMapper { ...@@ -541,7 +541,7 @@ public class EntityGraphMapper {
Map<String, Object> entityNsAttributes = entityNamespaces.get(nsName); Map<String, Object> entityNsAttributes = entityNamespaces.get(nsName);
for (AtlasNamespaceAttribute nsAttribute : entityTypeNsAttributes) { for (AtlasNamespaceAttribute nsAttribute : entityTypeNsAttributes.values()) {
// if (entityNsAttributes is empty) remove all attributes in this namespace // if (entityNsAttributes is empty) remove all attributes in this namespace
// else remove the attribute only if its given in entityNsAttributes // else remove the attribute only if its given in entityNsAttributes
if (MapUtils.isEmpty(entityNsAttributes) || entityNsAttributes.containsKey(nsAttribute.getName())) { if (MapUtils.isEmpty(entityNsAttributes) || entityNsAttributes.containsKey(nsAttribute.getName())) {
......
...@@ -678,21 +678,26 @@ public class EntityGraphRetriever { ...@@ -678,21 +678,26 @@ public class EntityGraphRetriever {
if (CollectionUtils.isNotEmpty(attributes)) { if (CollectionUtils.isNotEmpty(attributes)) {
for (String attrName : attributes) { for (String attrName : attributes) {
String nonQualifiedAttrName = toNonQualifiedName(attrName); AtlasAttribute attribute = entityType.getAttribute(attrName);
if (ret.hasAttribute(attrName)) {
continue;
}
AtlasAttribute attribute = entityType.getAttribute(nonQualifiedAttrName);
if (attribute == null) { if (attribute == null) {
attribute = entityType.getRelationshipAttribute(nonQualifiedAttrName, null); attrName = toNonQualifiedName(attrName);
if (ret.hasAttribute(attrName)) {
continue;
}
attribute = entityType.getAttribute(attrName);
if (attribute == null) {
attribute = entityType.getRelationshipAttribute(attrName, null);
}
} }
Object attrValue = getVertexAttribute(entityVertex, attribute); Object attrValue = getVertexAttribute(entityVertex, attribute);
if (attrValue != null) { if (attrValue != null) {
ret.setAttribute(nonQualifiedAttrName, attrValue); ret.setAttribute(attrName, attrValue);
} }
} }
} }
...@@ -765,15 +770,15 @@ public class EntityGraphRetriever { ...@@ -765,15 +770,15 @@ public class EntityGraphRetriever {
} }
private void mapNamespaceAttributes(AtlasVertex entityVertex, AtlasEntity entity) throws AtlasBaseException { private void mapNamespaceAttributes(AtlasVertex entityVertex, AtlasEntity entity) throws AtlasBaseException {
AtlasEntityType entityType = typeRegistry.getEntityTypeByName(entity.getTypeName()); AtlasEntityType entityType = typeRegistry.getEntityTypeByName(entity.getTypeName());
Map<String, List<AtlasNamespaceAttribute>> entityTypeNamespaces = entityType != null ? entityType.getNamespaceAttributes() : null; Map<String, Map<String, AtlasNamespaceAttribute>> entityTypeNamespaces = entityType != null ? entityType.getNamespaceAttributes() : null;
if (MapUtils.isNotEmpty(entityTypeNamespaces)) { if (MapUtils.isNotEmpty(entityTypeNamespaces)) {
for (Map.Entry<String, List<AtlasNamespaceAttribute>> entry : entityTypeNamespaces.entrySet()) { for (Map.Entry<String, Map<String, AtlasNamespaceAttribute>> entry : entityTypeNamespaces.entrySet()) {
String nsName = entry.getKey(); String nsName = entry.getKey();
List<AtlasNamespaceAttribute> nsAttributes = entry.getValue(); Map<String, AtlasNamespaceAttribute> nsAttributes = entry.getValue();
for (AtlasNamespaceAttribute nsAttribute : nsAttributes) { for (AtlasNamespaceAttribute nsAttribute : nsAttributes.values()) {
Object nsAttrValue = mapVertexToAttribute(entityVertex, nsAttribute, null, false, false); Object nsAttrValue = mapVertexToAttribute(entityVertex, nsAttribute, null, false, false);
if (nsAttrValue != null) { if (nsAttrValue != null) {
......
...@@ -25,7 +25,7 @@ import org.apache.atlas.model.typedef.AtlasNamespaceDef; ...@@ -25,7 +25,7 @@ import org.apache.atlas.model.typedef.AtlasNamespaceDef;
import org.apache.atlas.model.typedef.AtlasStructDef; import org.apache.atlas.model.typedef.AtlasStructDef;
import org.apache.atlas.model.typedef.AtlasTypesDef; import org.apache.atlas.model.typedef.AtlasTypesDef;
import org.apache.atlas.type.AtlasEntityType; import org.apache.atlas.type.AtlasEntityType;
import org.apache.atlas.type.AtlasNamespaceType; import org.apache.atlas.type.AtlasNamespaceType.AtlasNamespaceAttribute;
import org.apache.atlas.type.AtlasType; import org.apache.atlas.type.AtlasType;
import org.apache.atlas.type.AtlasTypeRegistry; import org.apache.atlas.type.AtlasTypeRegistry;
import org.testng.Assert; import org.testng.Assert;
...@@ -84,7 +84,7 @@ public class AtlasNamespaceDefStoreV2Test { ...@@ -84,7 +84,7 @@ public class AtlasNamespaceDefStoreV2Test {
createNamespaceTypes(namespaceName); createNamespaceTypes(namespaceName);
Assert.assertEquals(typeRegistry.getAllNamespaceDefs().size(), 1); Assert.assertEquals(typeRegistry.getAllNamespaceDefs().size(), 1);
AtlasEntityType entityType = typeRegistry.getEntityTypeByName("hive_table"); AtlasEntityType entityType = typeRegistry.getEntityTypeByName("hive_table");
Map<String, List<AtlasNamespaceType.AtlasNamespaceAttribute>> m1 = entityType.getNamespaceAttributes(); Map<String, Map<String, AtlasNamespaceAttribute>> m1 = entityType.getNamespaceAttributes();
Assert.assertEquals(m1.get(namespaceName).size(), 2); Assert.assertEquals(m1.get(namespaceName).size(), 2);
} }
...@@ -117,7 +117,7 @@ public class AtlasNamespaceDefStoreV2Test { ...@@ -117,7 +117,7 @@ public class AtlasNamespaceDefStoreV2Test {
updateNamespaceTypeDefs(namespaceDef); updateNamespaceTypeDefs(namespaceDef);
typeDefStore.updateTypesDef(typesDefs); typeDefStore.updateTypesDef(typesDefs);
AtlasEntityType entityType = typeRegistry.getEntityTypeByName("hive_table"); AtlasEntityType entityType = typeRegistry.getEntityTypeByName("hive_table");
Map<String, List<AtlasNamespaceType.AtlasNamespaceAttribute>> m1 = entityType.getNamespaceAttributes(); Map<String, Map<String, AtlasNamespaceAttribute>> m1 = entityType.getNamespaceAttributes();
Assert.assertEquals(m1.get(namespaceName).size(), 3); Assert.assertEquals(m1.get(namespaceName).size(), 3);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment