Commit 7718c5eb by Pinal Shah Committed by nixonrodrigues

ATLAS-3802 : BasicSearch: filter, attribute with NEQ operator doesn't match…

ATLAS-3802 : BasicSearch: filter, attribute with NEQ operator doesn't match attribute having null values. Change-Id: I19141c1a0917aa2d761cc6429857d4f56c272094 Signed-off-by: 's avatarnixonrodrigues <nixon@apache.org>
parent b9f4ae79
......@@ -279,7 +279,7 @@ public class SearchPredicateUtil {
public Predicate generatePredicate(final String attrName, final Object attrVal, final Class attrClass) {
final Predicate ret;
if (attrName == null || attrClass == null || attrVal == null) {
if (attrName == null || attrClass == null) {
ret = ALWAYS_FALSE;
} else if (Boolean.class.isAssignableFrom(attrClass)) {
ret = BooleanPredicate.getNEQPredicate(attrName, attrClass, (Boolean)attrVal);
......@@ -585,16 +585,16 @@ public class SearchPredicateUtil {
public Predicate generatePredicate(final String attrName, final Object attrVal, final Class attrClass) {
final Predicate ret;
if (attrName == null || attrClass == null || attrVal == null) {
if (attrName == null || attrClass == null) {
ret = ALWAYS_FALSE;
} else if (String.class.isAssignableFrom(attrClass)) {
ret = StringPredicate.getNotContainsPredicate(attrName, attrClass, (String) attrVal);
} else if (Collection.class.isAssignableFrom(attrClass)) {
// Check if the provided value is present in the list of stored values
ret = new VertexAttributePredicate(attrName, attrClass) {
ret = new VertexAttributePredicate(attrName, attrClass,true) {
@Override
protected boolean compareValue(final Object vertexAttrVal) {
return !((Collection) vertexAttrVal).contains(attrVal);
return vertexAttrVal == null || !((Collection) vertexAttrVal).contains(attrVal);
}
};
} else {
......@@ -817,6 +817,11 @@ public class SearchPredicateUtil {
this.value = value;
}
BooleanPredicate(String attrName, Class attrClass, Boolean value, boolean isNullValid) {
super(attrName, attrClass, isNullValid);
this.value = value;
}
static VertexAttributePredicate getEQPredicate(String attrName, Class attrClass, Boolean value) {
return new SearchPredicateUtil.BooleanPredicate(attrName, attrClass, value) {
protected boolean compareValue(Object vertexAttrVal) {
......@@ -826,9 +831,9 @@ public class SearchPredicateUtil {
}
static VertexAttributePredicate getNEQPredicate(String attrName, Class attrClass, Boolean value) {
return new SearchPredicateUtil.BooleanPredicate(attrName, attrClass, value) {
return new SearchPredicateUtil.BooleanPredicate(attrName, attrClass, value, true) {
protected boolean compareValue(Object vertexAttrVal) {
return ((Boolean) vertexAttrVal).compareTo(value) != 0;
return vertexAttrVal == null || ((Boolean) vertexAttrVal).compareTo(value) != 0;
}
};
}
......@@ -843,6 +848,11 @@ public class SearchPredicateUtil {
this.value = value;
}
ShortPredicate(String attrName, Class attrClass, Short value, boolean isNullValid) {
super(attrName, attrClass, isNullValid);
this.value = value;
}
static VertexAttributePredicate getEQPredicate(String attrName, Class attrClass, Short value) {
return new ShortPredicate(attrName, attrClass, value) {
protected boolean compareValue(Object vertexAttrVal) {
......@@ -852,9 +862,9 @@ public class SearchPredicateUtil {
}
static VertexAttributePredicate getNEQPredicate(String attrName, Class attrClass, Short value) {
return new ShortPredicate(attrName, attrClass, value) {
return new ShortPredicate(attrName, attrClass, value, true) {
protected boolean compareValue(Object vertexAttrVal) {
return ((Short) vertexAttrVal).compareTo(value) != 0;
return vertexAttrVal == null || ((Short) vertexAttrVal).compareTo(value) != 0;
}
};
}
......@@ -901,6 +911,11 @@ public class SearchPredicateUtil {
this.value = value;
}
IntegerPredicate(String attrName, Class attrClass, Integer value, boolean isNullValid) {
super(attrName, attrClass, isNullValid);
this.value = value;
}
static VertexAttributePredicate getEQPredicate(String attrName, Class attrClass, Integer value) {
return new IntegerPredicate(attrName, attrClass, value) {
protected boolean compareValue(Object vertexAttrVal) {
......@@ -910,9 +925,9 @@ public class SearchPredicateUtil {
}
static VertexAttributePredicate getNEQPredicate(String attrName, Class attrClass, Integer value) {
return new IntegerPredicate(attrName, attrClass, value) {
return new IntegerPredicate(attrName, attrClass, value, true) {
protected boolean compareValue(Object vertexAttrVal) {
return ((Integer) vertexAttrVal).compareTo(value) != 0;
return vertexAttrVal == null || ((Integer) vertexAttrVal).compareTo(value) != 0;
}
};
}
......@@ -959,6 +974,11 @@ public class SearchPredicateUtil {
this.value = value;
}
LongPredicate(String attrName, Class attrClass, Long value, boolean isNullValid) {
super(attrName, attrClass, isNullValid);
this.value = value;
}
static VertexAttributePredicate getEQPredicate(String attrName, Class attrClass, Long value) {
return new LongPredicate(attrName, attrClass, value) {
protected boolean compareValue(Object vertexAttrVal) {
......@@ -968,9 +988,9 @@ public class SearchPredicateUtil {
}
static VertexAttributePredicate getNEQPredicate(String attrName, Class attrClass, Long value) {
return new LongPredicate(attrName, attrClass, value) {
return new LongPredicate(attrName, attrClass, value, true) {
protected boolean compareValue(Object vertexAttrVal) {
return ((Long) vertexAttrVal).compareTo(value) != 0;
return vertexAttrVal == null || ((Long) vertexAttrVal).compareTo(value) != 0;
}
};
}
......@@ -1017,6 +1037,11 @@ public class SearchPredicateUtil {
this.value = value;
}
FloatPredicate(String attrName, Class attrClass, Float value, boolean isNullValid) {
super(attrName, attrClass, isNullValid);
this.value = value;
}
static VertexAttributePredicate getEQPredicate(String attrName, Class attrClass, Float value) {
return new FloatPredicate(attrName, attrClass, value) {
protected boolean compareValue(Object vertexAttrVal) {
......@@ -1026,9 +1051,9 @@ public class SearchPredicateUtil {
}
static VertexAttributePredicate getNEQPredicate(String attrName, Class attrClass, Float value) {
return new FloatPredicate(attrName, attrClass, value) {
return new FloatPredicate(attrName, attrClass, value, true) {
protected boolean compareValue(Object vertexAttrVal) {
return ((Float) vertexAttrVal).compareTo(value) != 0;
return vertexAttrVal == null || ((Float) vertexAttrVal).compareTo(value) != 0;
}
};
}
......@@ -1075,6 +1100,11 @@ public class SearchPredicateUtil {
this.value = value;
}
DoublePredicate(String attrName, Class attrClass, Double value, boolean isNullValid) {
super(attrName, attrClass, isNullValid);
this.value = value;
}
static VertexAttributePredicate getEQPredicate(String attrName, Class attrClass, Double value) {
return new DoublePredicate(attrName, attrClass, value) {
protected boolean compareValue(Object vertexAttrVal) {
......@@ -1084,9 +1114,9 @@ public class SearchPredicateUtil {
}
static VertexAttributePredicate getNEQPredicate(String attrName, Class attrClass, Double value) {
return new DoublePredicate(attrName, attrClass, value) {
return new DoublePredicate(attrName, attrClass, value, true) {
protected boolean compareValue(Object vertexAttrVal) {
return ((Double) vertexAttrVal).compareTo(value) != 0;
return vertexAttrVal == null || ((Double) vertexAttrVal).compareTo(value) != 0;
}
};
}
......@@ -1133,6 +1163,11 @@ public class SearchPredicateUtil {
this.value = value;
}
BytePredicate(String attrName, Class attrClass, Byte value, boolean isNullValid) {
super(attrName, attrClass, isNullValid);
this.value = value;
}
static VertexAttributePredicate getEQPredicate(String attrName, Class attrClass, Byte value) {
return new BytePredicate(attrName, attrClass, value) {
protected boolean compareValue(Object vertexAttrVal) {
......@@ -1142,9 +1177,9 @@ public class SearchPredicateUtil {
}
static VertexAttributePredicate getNEQPredicate(String attrName, Class attrClass, Byte value) {
return new BytePredicate(attrName, attrClass, value) {
return new BytePredicate(attrName, attrClass, value, true) {
protected boolean compareValue(Object vertexAttrVal) {
return ((Byte) vertexAttrVal).compareTo(value) != 0;
return vertexAttrVal == null || ((Byte) vertexAttrVal).compareTo(value) != 0;
}
};
}
......@@ -1191,6 +1226,11 @@ public class SearchPredicateUtil {
this.value = value;
}
BigIntegerPredicate(String attrName, Class attrClass, BigInteger value, boolean isNullValid) {
super(attrName, attrClass, isNullValid);
this.value = value;
}
static VertexAttributePredicate getEQPredicate(String attrName, Class attrClass, BigInteger value) {
return new BigIntegerPredicate(attrName, attrClass, value) {
protected boolean compareValue(Object vertexAttrVal) {
......@@ -1200,9 +1240,9 @@ public class SearchPredicateUtil {
}
static VertexAttributePredicate getNEQPredicate(String attrName, Class attrClass, BigInteger value) {
return new BigIntegerPredicate(attrName, attrClass, value) {
return new BigIntegerPredicate(attrName, attrClass, value, true) {
protected boolean compareValue(Object vertexAttrVal) {
return ((BigInteger) vertexAttrVal).compareTo(value) != 0;
return vertexAttrVal == null || ((BigInteger) vertexAttrVal).compareTo(value) != 0;
}
};
}
......@@ -1249,6 +1289,11 @@ public class SearchPredicateUtil {
this.value = value;
}
BigDecimalPredicate(String attrName, Class attrClass, BigDecimal value, boolean isNullValid) {
super(attrName, attrClass, true);
this.value = value;
}
static VertexAttributePredicate getEQPredicate(String attrName, Class attrClass, BigDecimal value) {
return new BigDecimalPredicate(attrName, attrClass, value) {
protected boolean compareValue(Object vertexAttrVal) {
......@@ -1258,9 +1303,9 @@ public class SearchPredicateUtil {
}
static VertexAttributePredicate getNEQPredicate(String attrName, Class attrClass, BigDecimal value) {
return new BigDecimalPredicate(attrName, attrClass, value) {
return new BigDecimalPredicate(attrName, attrClass, value, true) {
protected boolean compareValue(Object vertexAttrVal) {
return ((BigDecimal) vertexAttrVal).compareTo(value) != 0;
return vertexAttrVal == null || ((BigDecimal) vertexAttrVal).compareTo(value) != 0;
}
};
}
......@@ -1307,6 +1352,11 @@ public class SearchPredicateUtil {
this.value = value;
}
StringPredicate(String attrName, Class attrClass, String value, boolean isNullValid) {
super(attrName, attrClass, isNullValid);
this.value = value;
}
static VertexAttributePredicate getEQPredicate(String attrName, Class attrClass, String value) {
return new StringPredicate(attrName, attrClass, value) {
protected boolean compareValue(Object vertexAttrVal) {
......@@ -1316,9 +1366,9 @@ public class SearchPredicateUtil {
}
static VertexAttributePredicate getNEQPredicate(String attrName, Class attrClass, String value) {
return new StringPredicate(attrName, attrClass, value) {
return new StringPredicate(attrName, attrClass, value, true) {
protected boolean compareValue(Object vertexAttrVal) {
return ((String) vertexAttrVal).compareTo(value) != 0;
return vertexAttrVal == null || ((String) vertexAttrVal).compareTo(value) != 0;
}
};
}
......@@ -1364,9 +1414,9 @@ public class SearchPredicateUtil {
}
static VertexAttributePredicate getNotContainsPredicate(String attrName, Class attrClass, String value) {
return new StringPredicate(attrName, attrClass, value) {
return new StringPredicate(attrName, attrClass, value, true) {
protected boolean compareValue(Object vertexAttrVal) {
return !((String) vertexAttrVal).contains(value);
return vertexAttrVal == null || !((String) vertexAttrVal).contains(value);
}
};
}
......
......@@ -19,6 +19,7 @@ package org.apache.atlas;
import com.google.common.collect.ImmutableList;
import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.discovery.SearchParameters;
import org.apache.atlas.model.instance.AtlasClassification;
import org.apache.atlas.model.instance.AtlasEntity;
import org.apache.atlas.model.instance.AtlasObjectId;
......@@ -448,4 +449,27 @@ public abstract class BasicTestSetup {
return datasetSubType;
}
public void createDummyEntity(String name, String type, String... traitNames) throws AtlasBaseException {
AtlasEntity entity = new AtlasEntity(type);
entity.setAttribute("name", name);
entity.setAttribute(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, name);
entity.setClassifications(Stream.of(traitNames).map(AtlasClassification::new).collect(Collectors.toList()));
entityStore.createOrUpdate(new AtlasEntityStream(new AtlasEntity.AtlasEntitiesWithExtInfo(entity)), false);
}
public SearchParameters.FilterCriteria getSingleFilterCondition(String attName, SearchParameters.Operator op, String attrValue) {
SearchParameters.FilterCriteria filterCriteria = new SearchParameters.FilterCriteria();
filterCriteria.setCondition(SearchParameters.FilterCriteria.Condition.AND);
List<SearchParameters.FilterCriteria> criteria = new ArrayList<>();
SearchParameters.FilterCriteria f1 = new SearchParameters.FilterCriteria();
f1.setAttributeName(attName);
f1.setOperator(op);
String time = String.valueOf(System.currentTimeMillis());
f1.setAttributeValue(attrValue);
criteria.add(f1);
filterCriteria.setCriterion(criteria);
return filterCriteria;
}
}
......@@ -225,17 +225,5 @@ public class BasicSearchClassificationTest extends BasicTestSetup {
List<AtlasEntityHeader> entityHeaders = discoveryService.searchWithParameters(params).getEntities();
return entityHeaders.size();
}
private FilterCriteria getSingleFilterCondition(String attName, Operator op, String attrValue) {
FilterCriteria filterCriteria = new FilterCriteria();
filterCriteria.setCondition(FilterCriteria.Condition.AND);
List<FilterCriteria> criteria = new ArrayList<>();
FilterCriteria f1 = new FilterCriteria();
f1.setAttributeName(attName);
f1.setOperator(op);
String time = String.valueOf(System.currentTimeMillis());
f1.setAttributeValue(attrValue);
criteria.add(f1);
filterCriteria.setCriterion(criteria);
return filterCriteria;
}
}
......@@ -23,6 +23,7 @@ import org.apache.atlas.SortOrder;
import org.apache.atlas.TestModules;
import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.discovery.SearchParameters;
import org.apache.atlas.repository.graph.GraphBackedSearchIndexer;
import org.apache.atlas.repository.graphdb.AtlasGraph;
import org.apache.atlas.repository.graphdb.AtlasVertex;
import org.apache.atlas.repository.store.graph.v2.EntityGraphRetriever;
......@@ -32,6 +33,7 @@ import org.testng.annotations.Guice;
import org.testng.annotations.Test;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
......@@ -56,6 +58,8 @@ public class EntitySearchProcessorTest extends BasicTestSetup {
setupTestData();
}
@Inject
public GraphBackedSearchIndexer indexer;
@Test
public void searchTablesByClassification() throws AtlasBaseException {
......@@ -126,4 +130,71 @@ public class EntitySearchProcessorTest extends BasicTestSetup {
new EntitySearchProcessor(context);
}
@Test
public void searchWithNEQ_stringAttr() throws AtlasBaseException {
String expectedEntityName = "hive_Table_Null_tableType";
createDummyEntity(expectedEntityName,HIVE_TABLE_TYPE);
SearchParameters params = new SearchParameters();
params.setTypeName(HIVE_TABLE_TYPE);
SearchParameters.FilterCriteria filterCriteria = getSingleFilterCondition("tableType", SearchParameters.Operator.NEQ, "Managed");
params.setEntityFilters(filterCriteria);
params.setLimit(20);
SearchContext context = new SearchContext(params, typeRegistry, graph, indexer.getVertexIndexKeys());
EntitySearchProcessor processor = new EntitySearchProcessor(context);
List<AtlasVertex> vertices = processor.execute();
assertEquals(vertices.size(), 3);
List<String> nameList = new ArrayList<>();
for (AtlasVertex vertex : vertices) {
nameList.add((String) entityRetriever.toAtlasEntityHeader(vertex, Collections.singleton("name")).getAttribute("name"));
}
assertTrue(nameList.contains(expectedEntityName));
}
@Test(dependsOnMethods = "searchWithNEQ_stringAttr")
public void searchWithNEQ_pipeSeperatedAttr() throws AtlasBaseException {
SearchParameters params = new SearchParameters();
params.setTypeName(HIVE_TABLE_TYPE);
SearchParameters.FilterCriteria filterCriteria = getSingleFilterCondition("__classificationNames", SearchParameters.Operator.NEQ, METRIC_CLASSIFICATION);
params.setEntityFilters(filterCriteria);
params.setLimit(20);
SearchContext context = new SearchContext(params, typeRegistry, graph, indexer.getVertexIndexKeys());
EntitySearchProcessor processor = new EntitySearchProcessor(context);
List<AtlasVertex> vertices = processor.execute();
assertEquals(vertices.size(), 7);
List<String> nameList = new ArrayList<>();
for (AtlasVertex vertex : vertices) {
nameList.add((String) entityRetriever.toAtlasEntityHeader(vertex, Collections.singleton("name")).getAttribute("name"));
}
assertTrue(nameList.contains("hive_Table_Null_tableType"));
}
@Test(dependsOnMethods = "searchWithNEQ_stringAttr")
public void searchWithNEQ_doubleAttr() throws AtlasBaseException {
SearchParameters params = new SearchParameters();
params.setTypeName(HIVE_TABLE_TYPE);
SearchParameters.FilterCriteria filterCriteria = getSingleFilterCondition("retention", SearchParameters.Operator.NEQ, "5");
params.setEntityFilters(filterCriteria);
params.setLimit(20);
SearchContext context = new SearchContext(params, typeRegistry, graph, indexer.getVertexIndexKeys());
EntitySearchProcessor processor = new EntitySearchProcessor(context);
List<AtlasVertex> vertices = processor.execute();
assertEquals(vertices.size(), 1);
List<String> nameList = new ArrayList<>();
for (AtlasVertex vertex : vertices) {
nameList.add((String) entityRetriever.toAtlasEntityHeader(vertex, Collections.singleton("name")).getAttribute("name"));
}
assertTrue(nameList.contains("hive_Table_Null_tableType"));
}
}
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