diff --git a/redis-om-spring/src/main/java/com/redis/om/spring/indexing/RediSearchIndexer.java b/redis-om-spring/src/main/java/com/redis/om/spring/indexing/RediSearchIndexer.java index d01be037..7e6237c4 100644 --- a/redis-om-spring/src/main/java/com/redis/om/spring/indexing/RediSearchIndexer.java +++ b/redis-om-spring/src/main/java/com/redis/om/spring/indexing/RediSearchIndexer.java @@ -1148,8 +1148,9 @@ private Optional getDocumentScoreField(List all private boolean isAnnotationPreset(java.lang.reflect.Field idField, List fields) { return (!idField.isAnnotationPresent(Indexed.class) && !idField.isAnnotationPresent(Searchable.class) && !idField - .isAnnotationPresent(TagIndexed.class) && !idField.isAnnotationPresent(TextIndexed.class) && (fields.stream() - .noneMatch(f -> f.getName().equals(idField.getName())))); + .isAnnotationPresent(TagIndexed.class) && !idField.isAnnotationPresent(TextIndexed.class) && !idField + .isAnnotationPresent(NumericIndexed.class) && (fields.stream().noneMatch(f -> f.getName().equals(idField + .getName())))); } private List createIndexedFieldsForIdFields(Class cl, List fields, boolean isDocument) { diff --git a/redis-om-spring/src/main/java/com/redis/om/spring/repository/query/clause/QueryClause.java b/redis-om-spring/src/main/java/com/redis/om/spring/repository/query/clause/QueryClause.java index 14d1f01f..1cdea49e 100644 --- a/redis-om-spring/src/main/java/com/redis/om/spring/repository/query/clause/QueryClause.java +++ b/redis-om-spring/src/main/java/com/redis/om/spring/repository/query/clause/QueryClause.java @@ -173,6 +173,20 @@ public enum QueryClause { NUMERIC_BETWEEN( // QueryClauseTemplate.of(FieldType.NUMERIC, Part.Type.BETWEEN, QueryClause.FIELD_NUMERIC_BETWEEN, 2) // ), + /** + * Numeric field query clause for range matching. + * Matches numeric fields that are equal to any of the specified values. + */ + NUMERIC_IN( // + QueryClauseTemplate.of(FieldType.NUMERIC, Part.Type.IN, QueryClause.FIELD_EQUAL, 1) // + ), + /** + * Numeric field query clause for negated membership testing. + * Matches numeric fields that are not equal to any of the specified values. + */ + NUMERIC_NOT_IN( // + QueryClauseTemplate.of(FieldType.NUMERIC, Part.Type.NOT_IN, QueryClause.FIELD_EQUAL, 1) // + ), /** * Numeric field query clause for "less than" comparisons. * Matches numeric fields whose values are less than the specified value. @@ -569,31 +583,40 @@ public String prepareQuery(String field, Object... params) { if (this == QueryClause.TAG_CONTAINING_ALL) { value = c.stream().map(n -> "@" + field + ":{" + QueryUtils.escape(ObjectUtils.asString(n, converter)) + "}").collect(Collectors.joining(" ")); + prepared = prepared.replace(PARAM_PREFIX + i++, value); } else if (this == QueryClause.NUMERIC_CONTAINING) { value = c.stream().map(n -> "@" + field + ":[" + QueryUtils.escape(ObjectUtils.asString(n, converter)) + " " + QueryUtils.escape(ObjectUtils.asString(n, converter)) + "]").collect(Collectors .joining("|")); + prepared = prepared.replace(PARAM_PREFIX + i++, value); + } else if (this == QueryClause.NUMERIC_IN) { + value = c.stream().map(n -> "@" + field + ":[" + QueryUtils.escape(ObjectUtils.asString(n, + converter)) + " " + QueryUtils.escape(ObjectUtils.asString(n, converter)) + "]").collect(Collectors + .joining("|")); + prepared = value; } else if (this == QueryClause.NUMERIC_CONTAINING_ALL) { value = c.stream().map(n -> "@" + field + ":[" + QueryUtils.escape(ObjectUtils.asString(n, converter)) + " " + QueryUtils.escape(ObjectUtils.asString(n, converter)) + "]").collect(Collectors .joining(" ")); + prepared = prepared.replace(PARAM_PREFIX + i++, value); } else if (this == QueryClause.GEO_CONTAINING) { value = c.stream().map(n -> { Point p = (Point) n; return "@" + field + ":[" + p.getX() + " " + p.getY() + " .000001 ft]"; }).collect(Collectors.joining("|")); + prepared = prepared.replace(PARAM_PREFIX + i++, value); } else if (this == QueryClause.GEO_CONTAINING_ALL) { value = c.stream().map(n -> { Point p = (Point) n; return "@" + field + ":[" + p.getX() + " " + p.getY() + " .000001 ft]"; }).collect(Collectors.joining(" ")); + prepared = prepared.replace(PARAM_PREFIX + i++, value); } else { value = c.stream()// .map(n -> QueryUtils.escape(ObjectUtils.asString(n, converter), false)).collect(Collectors.joining( "|")); + prepared = prepared.replace(PARAM_PREFIX + i++, value); } - - prepared = prepared.replace(PARAM_PREFIX + i++, value); } else { if (clauseTemplate.getIndexType() == FieldType.TEXT) { prepared = prepared.replace(PARAM_PREFIX + i++, param.toString());