in spectator-reg-atlas/src/main/java/com/netflix/spectator/atlas/impl/QueryIndex.java [281:349]
private boolean remove(List<Query.KeyQuery> queries, int i, T value) {
boolean result = false;
if (i < queries.size()) {
Query.KeyQuery kq = queries.get(i);
// Check for additional queries based on the same key and combine into a
// composite if needed
Query.CompositeKeyQuery composite = null;
int j = i + 1;
while (j < queries.size()) {
Query.KeyQuery q = queries.get(j);
if (kq.key().equals(q.key())) {
if (composite == null) {
composite = new Query.CompositeKeyQuery(kq);
kq = composite;
}
composite.add(q);
++j;
} else {
break;
}
}
if (key != null && key.equals(kq.key())) {
if (kq instanceof Query.Equal) {
String v = ((Query.Equal) kq).value();
QueryIndex<T> idx = equalChecks.get(v);
if (idx != null) {
result |= idx.remove(queries, j, value);
if (idx.isEmpty())
equalChecks.remove(v);
}
} else if (kq instanceof Query.Has) {
if (hasKeyIdx != null) {
result |= hasKeyIdx.remove(queries, j, value);
if (hasKeyIdx.isEmpty())
hasKeyIdx = null;
}
} else {
QueryIndex<T> idx = otherChecks.get(kq);
if (idx != null && idx.remove(queries, j, value)) {
result = true;
otherChecksCache.clear();
if (idx.isEmpty()) {
otherChecks.remove(kq);
otherChecksTree.remove(kq);
}
}
// Not queries should match if the key is missing from the id, so they need to
// be included in the other keys sub-tree as well. Check this by seeing if it will
// match an empty map as there could be a variety of inverted types.
if (kq.matches(Collections.emptyMap()) && missingKeysIdx != null) {
result |= missingKeysIdx.remove(queries, j, value);
if (missingKeysIdx.isEmpty())
missingKeysIdx = null;
}
}
} else if (otherKeysIdx != null) {
result |= otherKeysIdx.remove(queries, i, value);
if (otherKeysIdx.isEmpty())
otherKeysIdx = null;
}
} else {
result |= matches.remove(value);
}
return result;
}