in client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java [225:478]
public static String buildFIQL(
final List<SearchClause> clauses,
final AbstractFiqlSearchConditionBuilder<?, ?, ?> builder,
final Map<String, PlainSchemaTO> availableSchemaTypes,
final Function<SearchClause, CompleteCondition> customCondition) {
LOG.debug("Generating FIQL from {}", clauses);
CompleteCondition prevCondition;
CompleteCondition condition = null;
boolean notTheFirst = false;
for (SearchClause clause : clauses) {
prevCondition = condition;
if (clause.getType() != null) {
String value = clause.getValue() == null
? null
: ENCODINGS.keySet().stream().
reduce(clause.getValue(), (s, k) -> s.replace(k, ENCODINGS.get(k)));
switch (clause.getType()) {
case GROUP_MEMBER:
if (builder instanceof GroupFiqlSearchConditionBuilder) {
switch (clause.getComparator()) {
case EQUALS:
condition = ((GroupFiqlSearchConditionBuilder) builder).withMembers(value);
break;
case NOT_EQUALS:
condition = ((GroupFiqlSearchConditionBuilder) builder).withoutMembers(value);
break;
default:
}
}
break;
case GROUP_MEMBERSHIP:
if (StringUtils.isNotBlank(clause.getProperty())) {
String groupKey = clause.getProperty();
if (builder instanceof final UserFiqlSearchConditionBuilder conditionBuilder) {
condition = clause.getComparator() == SearchClause.Comparator.EQUALS
? conditionBuilder.inGroups(groupKey)
: conditionBuilder.notInGroups(groupKey);
} else {
condition = clause.getComparator() == SearchClause.Comparator.EQUALS
? ((AnyObjectFiqlSearchConditionBuilder) builder).inGroups(groupKey)
: ((AnyObjectFiqlSearchConditionBuilder) builder).notInGroups(groupKey);
}
}
break;
case AUX_CLASS:
if (StringUtils.isNotBlank(clause.getProperty())) {
condition = clause.getComparator() == SearchClause.Comparator.EQUALS
? builder.hasAuxClasses(clause.getProperty())
: builder.hasNotAuxClasses(clause.getProperty());
}
break;
case RESOURCE:
if (StringUtils.isNotBlank(clause.getProperty())) {
condition = clause.getComparator() == SearchClause.Comparator.EQUALS
? builder.hasResources(clause.getProperty())
: builder.hasNotResources(clause.getProperty());
}
break;
case ATTRIBUTE:
if (StringUtils.isNotBlank(clause.getProperty())) {
boolean isLong = false;
boolean isDouble = false;
boolean isBoolean = false;
if (availableSchemaTypes.get(clause.getProperty()) != null) {
switch (availableSchemaTypes.get(clause.getProperty()).getType()) {
case Long:
isLong = true;
break;
case Double:
isDouble = true;
break;
case Boolean:
isBoolean = true;
break;
default:
}
}
SyncopeProperty<?> property = builder.is(clause.getProperty());
switch (clause.getComparator()) {
case IS_NULL:
condition = builder.isNull(clause.getProperty());
break;
case IS_NOT_NULL:
condition = builder.isNotNull(clause.getProperty());
break;
case LESS_THAN:
condition = isLong
? property.lessThan(NumberUtils.toLong(value))
: isDouble
? property.lessThan(NumberUtils.toDouble(value))
: property.lexicalBefore(value);
break;
case LESS_OR_EQUALS:
condition = isLong
? property.lessOrEqualTo(NumberUtils.toLong(value))
: isDouble
? property.lessOrEqualTo(NumberUtils.toDouble(value))
: property.lexicalNotAfter(value);
break;
case GREATER_THAN:
condition = isLong
? property.greaterThan(NumberUtils.toLong(value))
: isDouble
? property.greaterThan(NumberUtils.toDouble(value))
: property.lexicalAfter(value);
break;
case GREATER_OR_EQUALS:
condition = isLong
? property.greaterOrEqualTo(NumberUtils.toLong(value))
: isDouble
? property.greaterOrEqualTo(NumberUtils.toDouble(value))
: property.lexicalNotBefore(value);
break;
case NOT_EQUALS:
condition = isLong
? property.notEqualTo(NumberUtils.toLong(value))
: isDouble
? property.notEqualTo(NumberUtils.toDouble(value))
: isBoolean
? property.notEqualTo(BooleanUtils.toStringTrueFalse(
BooleanUtils.toBoolean(value)))
: property.notEqualTolIgnoreCase(value);
break;
case EQUALS:
condition = isLong
? property.equalTo(NumberUtils.toLong(value))
: isDouble
? property.equalTo(NumberUtils.toDouble(value))
: isBoolean
? property.equalTo(BooleanUtils.toStringTrueFalse(
BooleanUtils.toBoolean(value)))
: property.equalToIgnoreCase(value);
break;
default:
condition = property.equalToIgnoreCase(value);
break;
}
}
break;
case ROLE_MEMBERSHIP:
if (StringUtils.isNotBlank(clause.getProperty())
&& builder instanceof UserFiqlSearchConditionBuilder) {
switch (clause.getComparator()) {
case EQUALS:
condition = ((UserFiqlSearchConditionBuilder) builder).
inRoles(clause.getProperty());
break;
case NOT_EQUALS:
condition = ((UserFiqlSearchConditionBuilder) builder).
notInRoles(clause.getProperty());
break;
default:
break;
}
}
break;
case RELATIONSHIP:
if (StringUtils.isNotBlank(clause.getProperty())) {
if (builder instanceof UserFiqlSearchConditionBuilder ubuilder) {
switch (clause.getComparator()) {
case IS_NOT_NULL:
condition = ubuilder.inRelationshipTypes(clause.getProperty());
break;
case IS_NULL:
condition = ubuilder.notInRelationshipTypes(clause.getProperty());
break;
case EQUALS:
condition = ubuilder.inRelationships(value);
break;
case NOT_EQUALS:
condition = ubuilder.notInRelationships(value);
break;
default:
break;
}
} else {
switch (clause.getComparator()) {
case IS_NOT_NULL:
condition = ((AnyObjectFiqlSearchConditionBuilder) builder).
inRelationshipTypes(clause.getProperty());
break;
case IS_NULL:
condition = ((AnyObjectFiqlSearchConditionBuilder) builder).
notInRelationshipTypes(clause.getProperty());
break;
case EQUALS:
condition = ((AnyObjectFiqlSearchConditionBuilder) builder).
inRelationships(value);
break;
case NOT_EQUALS:
condition = ((AnyObjectFiqlSearchConditionBuilder) builder).
notInRelationships(value);
break;
default:
break;
}
}
}
break;
case CUSTOM:
condition = customCondition.apply(clause);
break;
default:
break;
}
}
if (notTheFirst) {
if (clause.getOperator() == SearchClause.Operator.AND) {
condition = builder.and(condition, prevCondition);
}
if (clause.getOperator() == SearchClause.Operator.OR) {
condition = builder.or(condition, prevCondition);
}
}
notTheFirst = true;
}
String fiql = condition == null ? null : condition.query();
LOG.debug("Generated FIQL: {}", fiql);
return fiql;
}