in spectator-reg-atlas/src/main/java/com/netflix/spectator/atlas/impl/QueryIndex.java [200:261]
private void add(List<Query.KeyQuery> queries, int i, T value) {
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 = kq.key();
}
if (key.equals(kq.key())) {
if (kq instanceof Query.Equal) {
String v = ((Query.Equal) kq).value();
QueryIndex<T> idx = equalChecks.computeIfAbsent(v, id -> QueryIndex.empty(cacheSupplier));
idx.add(queries, j, value);
} else if (kq instanceof Query.Has) {
if (hasKeyIdx == null) {
hasKeyIdx = QueryIndex.empty(cacheSupplier);
}
hasKeyIdx.add(queries, j, value);
} else {
QueryIndex<T> idx = otherChecks.computeIfAbsent(kq, id -> QueryIndex.empty(cacheSupplier));
idx.add(queries, j, value);
otherChecksTree.put(kq);
otherChecksCache.clear();
// 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())) {
if (missingKeysIdx == null) {
missingKeysIdx = QueryIndex.empty(cacheSupplier);
}
missingKeysIdx.add(queries, j, value);
}
}
} else {
if (otherKeysIdx == null) {
otherKeysIdx = QueryIndex.empty(cacheSupplier);
}
otherKeysIdx.add(queries, i, value);
}
} else {
matches.add(value);
}
}