Skip to content

Commit

Permalink
#2192 Adjusted value matcher util and dynamic query builder to handle…
Browse files Browse the repository at this point in the history
… problem when someone unintentionally enters trailing whitespaces
  • Loading branch information
oleh-maikovych committed Feb 26, 2024
1 parent aa677eb commit 2f68814
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,19 @@ public static <T extends AbstractEntity<?>> Builder<T, EntityResultQueryModel<T>
}

public static ConditionModel createStrictSearchByKeyCriteriaModel(final Class<? extends AbstractEntity<?>> entityType, final String searchString) {
ConditionModel keyCriteria = cond().prop(KEY).iLikeWithCast().val(searchString).model();
ConditionModel keyCriteria = cond().prop(KEY).iLikeWithCast().val(searchString.trim()).model();

if (isCompositeEntity((Class<? extends AbstractEntity<?>>) entityType)) {
for (final String propName : keyPaths(entityType)) {
keyCriteria = cond().condition(keyCriteria).or().prop(propName).iLikeWithCast().val(searchString).model();
keyCriteria = cond().condition(keyCriteria).or().prop(propName).iLikeWithCast().val(searchString.trim()).model();
}
}

return keyCriteria;
}

public static ConditionModel createRelaxedSearchByKeyCriteriaModel(final String searchString) {
return cond().prop(KEY).iLikeWithCast().val(searchString).model();
return cond().prop(KEY).iLikeWithCast().val(searchString.trim()).model();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import java.util.Optional;
import java.util.Set;
import java.util.TreeMap;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
Expand Down Expand Up @@ -847,7 +848,7 @@ public static String[] prepCritValuesForStringTypedProp(final String criteria) {
final String[] crits = criteria.split(",");
for (int index = 0; index < crits.length; index++) {
if (!crits[index].contains("*")) {
crits[index] = "*" + crits[index] + "*";
crits[index] = "*" + crits[index].trim() + "*";
}
crits[index] = prepare(crits[index]);
}
Expand All @@ -863,7 +864,7 @@ public static String[] prepCritValuesForStringTypedProp(final String criteria) {
*/
private static String prepCritValuesForSingleStringTypedProp(final String criteria) {
if (!criteria.contains("*")) {
return prepare("*" + criteria + "*");
return prepare("*" + criteria.trim() + "*");
}
return prepare(criteria);
}
Expand All @@ -878,6 +879,16 @@ public static String[] prepCritValuesForEntityTypedProp(final List<String> crite
return prepare(criteria);
}

/**
* Creates new array based on the passed list of string. This method also trims every element of the passed list.
*
* @param criteria
* @return
*/
public static String[] prepExectCritValuesForEntityTypedProp(final List<String> criteria) {
return criteria.stream().map(crit -> crit.trim()).toArray(String[]::new);
}

/**
* Returns <code>true</code> if the <code>type</code> is supported in dynamic criteria, <code>false</code> otherwise.
*
Expand Down Expand Up @@ -1115,7 +1126,7 @@ private static ConditionModel propertyDescriptorLike(final String propertyNameWi
final Map<Boolean, List<String>> searchVals = searchValues.stream().collect(groupingBy(str -> str.contains("*")));
final Set<PropertyDescriptor<AbstractEntity<?>>> matchedPropDescriptors = new LinkedHashSet<>();
concat(
searchVals.getOrDefault(false, emptyList()).stream(),
stream(prepExectCritValuesForEntityTypedProp(searchVals.getOrDefault(false, emptyList()))),
stream(prepCritValuesForEntityTypedProp(searchVals.getOrDefault(true, emptyList())))
).forEach(val -> matchedPropDescriptors.addAll(new PojoValueMatcher<>(allPropertyDescriptors, KEY, allPropertyDescriptors.size()).findMatches(val)));
return matchedPropDescriptors.isEmpty()
Expand Down Expand Up @@ -1144,7 +1155,7 @@ private static ConditionModel propertyLike(final String propertyNameWithKey, fin
} else if (exactAndWildcardSearchVals.containsKey(false) && !exactAndWildcardSearchVals.containsKey(true)) { // only exact search values are present
return cond()
// Condition for exact search values; union entities need ".id" to help EQL.
.prop(propertyNameWithoutKey + (isUnionEntityType(propType) ? ".id" : "")).in().model(select(propType).where().prop(KEY).in().values(exactAndWildcardSearchVals.get(false).toArray()).model()).model();
.prop(propertyNameWithoutKey + (isUnionEntityType(propType) ? ".id" : "")).in().model(select(propType).where().prop(KEY).in().values(prepExectCritValuesForEntityTypedProp(exactAndWildcardSearchVals.get(false))).model()).model();
} else { // only whildcard search values are present
return cond()
// Condition for wildcard search values.
Expand Down

0 comments on commit 2f68814

Please sign in to comment.