in core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java [511:621]
protected void fillAttrQuery(
final TextStringBuilder query,
final PlainAttrValue attrValue,
final PlainSchema schema,
final AnyCond cond,
final boolean not,
final Map<String, Object> parameters) {
if (not && cond.getType() == AttrCond.Type.ISNULL) {
cond.setType(AttrCond.Type.ISNOTNULL);
fillAttrQuery(query, attrValue, schema, cond, true, parameters);
return;
}
if (not) {
query.append("NOT (");
fillAttrQuery(query, attrValue, schema, cond, false, parameters);
query.append(')');
return;
}
if (not && cond.getType() == AttrCond.Type.ISNULL) {
cond.setType(AttrCond.Type.ISNOTNULL);
fillAttrQuery(query, attrValue, schema, cond, true, parameters);
return;
}
boolean lower = schema.getType().isStringClass()
&& (cond.getType() == AttrCond.Type.IEQ || cond.getType() == AttrCond.Type.ILIKE);
String property = "n." + cond.getSchema();
if (lower) {
property = "toLower (" + property + ')';
}
switch (cond.getType()) {
case ISNULL ->
query.append(property).append(" IS NULL");
case ISNOTNULL ->
query.append(property).append(" IS NOT NULL");
case ILIKE, LIKE -> {
if (schema.getType().isStringClass()) {
query.append(property).append(" =~ ");
if (lower) {
query.append("toLower($").
append(setParameter(parameters, cond.getExpression().replace("%", ".*"))).
append(')');
} else {
query.append('$').append(setParameter(parameters, cond.getExpression().replace("%", ".*")));
}
} else {
query.append(' ').append(ALWAYS_FALSE_CLAUSE);
LOG.error("LIKE is only compatible with string or enum schemas");
}
}
case IEQ, EQ -> {
query.append(property).append('=');
if (lower) {
query.append("toLower($").append(setParameter(parameters, attrValue.getValue())).append(')');
} else {
query.append('$').append(setParameter(parameters, attrValue.getValue()));
}
}
case GE -> {
query.append(property);
if (not) {
query.append('<');
} else {
query.append(">=");
}
query.append('$').append(setParameter(parameters, attrValue.getValue()));
}
case GT -> {
query.append(property);
if (not) {
query.append("<=");
} else {
query.append('>');
}
query.append('$').append(setParameter(parameters, attrValue.getValue()));
}
case LE -> {
query.append(property);
if (not) {
query.append('>');
} else {
query.append("<=");
}
query.append('$').append(setParameter(parameters, attrValue.getValue()));
}
case LT -> {
query.append(property);
if (not) {
query.append(">=");
} else {
query.append('<');
}
query.append('$').append(setParameter(parameters, attrValue.getValue()));
}
default -> {
}
}
}