in ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java [298:424]
protected Query getQuery(final SearchCond cond, final AnyTypeKind kind) {
Query query = null;
switch (cond.getType()) {
case LEAF:
case NOT_LEAF:
query = cond.asLeaf(AnyTypeCond.class).
filter(leaf -> AnyTypeKind.ANY_OBJECT == kind).
map(this::getQuery).
orElse(null);
if (query == null) {
query = cond.asLeaf(RelationshipTypeCond.class).
map(this::getQuery).
orElse(null);
}
if (query == null) {
query = cond.asLeaf(RelationshipCond.class).
map(this::getQuery).
orElse(null);
}
if (query == null) {
query = cond.asLeaf(MembershipCond.class).
filter(leaf -> AnyTypeKind.GROUP != kind).
map(this::getQuery).
orElse(null);
}
if (query == null) {
query = cond.asLeaf(MemberCond.class).
filter(leaf -> AnyTypeKind.GROUP == kind).
map(this::getQuery).
orElse(null);
}
if (query == null) {
query = cond.asLeaf(RoleCond.class).
filter(leaf -> AnyTypeKind.USER == kind).
map(this::getQuery).
orElse(null);
}
if (query == null) {
query = cond.asLeaf(DynRealmCond.class).
map(this::getQuery).
orElse(null);
}
if (query == null) {
query = cond.asLeaf(AuxClassCond.class).
map(this::getQuery).
orElse(null);
}
if (query == null) {
query = cond.asLeaf(ResourceCond.class).
map(this::getQuery).
orElse(null);
}
if (query == null) {
query = cond.asLeaf(AnyCond.class).map(ac -> getQuery(ac, kind)).
or(() -> cond.asLeaf(AttrCond.class).map(this::getQuery)).
orElse(null);
}
// allow for additional search conditions
if (query == null) {
query = getQueryForCustomConds(cond, kind);
}
if (query == null) {
throw new IllegalArgumentException("Cannot construct QueryBuilder");
}
if (cond.getType() == SearchCond.Type.NOT_LEAF) {
query = new Query.Builder().bool(QueryBuilders.bool().mustNot(query).build()).build();
}
break;
case AND:
List<Query> andCompound = new ArrayList<>();
Query andLeft = getQuery(cond.getLeft(), kind);
if (andLeft._kind() == Query.Kind.Bool && !((BoolQuery) andLeft._get()).must().isEmpty()) {
andCompound.addAll(((BoolQuery) andLeft._get()).must());
} else {
andCompound.add(andLeft);
}
Query andRight = getQuery(cond.getRight(), kind);
if (andRight._kind() == Query.Kind.Bool && !((BoolQuery) andRight._get()).must().isEmpty()) {
andCompound.addAll(((BoolQuery) andRight._get()).must());
} else {
andCompound.add(andRight);
}
query = new Query.Builder().bool(QueryBuilders.bool().must(andCompound).build()).build();
break;
case OR:
List<Query> orCompound = new ArrayList<>();
Query orLeft = getQuery(cond.getLeft(), kind);
if (orLeft._kind() == Query.Kind.DisMax) {
orCompound.addAll(((DisMaxQuery) orLeft._get()).queries());
} else {
orCompound.add(orLeft);
}
Query orRight = getQuery(cond.getRight(), kind);
if (orRight._kind() == Query.Kind.DisMax) {
orCompound.addAll(((DisMaxQuery) orRight._get()).queries());
} else {
orCompound.add(orRight);
}
query = new Query.Builder().disMax(QueryBuilders.disMax().queries(orCompound).build()).build();
break;
default:
}
return query;
}