fix NPE for missing names in direct queries and block requests based on direct query count before deduping
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateEntityFilter.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateEntityFilter.java
index 955b419..cf1984d 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateEntityFilter.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateEntityFilter.java
@@ -289,13 +289,16 @@
if (!isDirectQuery) {
filterDuplicateCandidates(query);
} else {
- // remove direct query duplicates
+ // remove direct query duplicates or missing entities (names that don't exist will have null ids)
Set<UUID> foundUUIDs = new HashSet<>();
for (FilterResult<Candidate> candidateFilterResult : candidateResults) {
- UUID uuid = candidateFilterResult.getValue().getCandidateResult().getId().getUuid();
- if (!foundUUIDs.contains(uuid)) {
- dedupedCandidateResults.add(candidateFilterResult);
- foundUUIDs.add(uuid);
+ Id id = candidateFilterResult.getValue().getCandidateResult().getId();
+ if (id != null) {
+ UUID uuid = id.getUuid();
+ if (!foundUUIDs.contains(uuid)) {
+ dedupedCandidateResults.add(candidateFilterResult);
+ foundUUIDs.add(uuid);
+ }
}
}
}
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java
index 6dfb2ae..82be6ec 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java
@@ -456,14 +456,15 @@
throw new IllegalArgumentException("a null query string cannot be parsed");
}
+ if (parsedQuery.isDirectQuery() && parsedQuery.getDirectQueryItemCount() > indexFig.directQueryMaxItems()) {
+ throw new TooManyDirectEntitiesException(parsedQuery.getDirectQueryItemCount(), indexFig.directQueryMaxItems());
+ }
+
final QueryVisitor visitor = visitParsedQuery(parsedQuery);
List<Identifier> directIdentifiers = visitor.getDirectIdentifiers();
if (directIdentifiers != null && directIdentifiers.size() > 0) {
// this is a direct query
- if (directIdentifiers.size() > indexFig.directQueryMaxItems()) {
- throw new TooManyDirectEntitiesException(directIdentifiers.size(), indexFig.directQueryMaxItems());
- }
return buildCandidateResultsForDirectQuery(directIdentifiers, parsedQuery, searchTypes);
}
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/query/ParsedQuery.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/query/ParsedQuery.java
index 80ba6b1..4c0da5d 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/query/ParsedQuery.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/query/ParsedQuery.java
@@ -211,4 +211,13 @@
public boolean isDirectQuery() {
return rootOperand instanceof DirectOperand;
}
+
+ public int getDirectQueryItemCount() {
+ int count = 0;
+ if (rootOperand instanceof DirectOperand) {
+ DirectOperand root = (DirectOperand)rootOperand;
+ count = root.getChildCount();
+ }
+ return count;
+ }
}