jstastny-cz commented on code in PR #2328:
URL:
https://github.com/apache/incubator-kie-kogito-apps/pull/2328#discussion_r3234140452
##########
data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/query/GraphQLQueryMapper.java:
##########
@@ -82,9 +83,9 @@ public GraphQLQueryParser apply(GraphQLInputObjectType type) {
parser.mapAttribute(field.getName(),
mapEnumArgument(field.getName()));
} else if (isListOfType(field.getType(), type.getName())) {
parser.mapAttribute(field.getName(),
mapRecursiveListArgument(field.getName(), parser));
- } else if (((GraphQLNamedType)
field.getType()).getName().equals(type.getName())) {
+ } else if (field.getType() instanceof GraphQLNamedType &&
((GraphQLNamedType) field.getType()).getName().equals(type.getName())) {
parser.mapAttribute(field.getName(),
mapRecursiveArgument(field.getName(), parser));
- } else {
+ } else if (field.getType() instanceof GraphQLNamedType) {
String name = ((GraphQLNamedType)
field.getType()).getName();
Review Comment:
```suggestion
} else if (field.getType() instanceof GraphQLNamedType
namedType) {
String name = namedType.getName();
```
##########
data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/query/GraphQLQueryMapper.java:
##########
@@ -82,9 +83,9 @@ public GraphQLQueryParser apply(GraphQLInputObjectType type) {
parser.mapAttribute(field.getName(),
mapEnumArgument(field.getName()));
} else if (isListOfType(field.getType(), type.getName())) {
parser.mapAttribute(field.getName(),
mapRecursiveListArgument(field.getName(), parser));
- } else if (((GraphQLNamedType)
field.getType()).getName().equals(type.getName())) {
+ } else if (field.getType() instanceof GraphQLNamedType &&
((GraphQLNamedType) field.getType()).getName().equals(type.getName())) {
Review Comment:
wouldn't this work too?
```suggestion
} else if (field.getType() instanceof GraphQLNamedType
namedType && namedType.getName().equals(type.getName())) {
```
##########
data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/query/GraphQLQueryMapper.java:
##########
@@ -116,7 +117,13 @@ public GraphQLQueryParser apply(GraphQLInputObjectType
type) {
break;
default:
if (field.getType() instanceof
GraphQLInputObjectType) {
- parser.mapAttribute(field.getName(),
mapSubEntityArgument(field.getName(), new
GraphQLQueryMapper().apply((GraphQLInputObjectType) field.getType())));
+ GraphQLInputObjectType inputType =
(GraphQLInputObjectType) field.getType();
Review Comment:
also here we could use pattern matching
##########
data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/query/GraphQLQueryMapper.java:
##########
@@ -229,6 +236,161 @@ private Function<Object, Stream<AttributeFilter<?>>>
mapSubEntityArgument(String
});
}
+ private Function<Object, Stream<AttributeFilter<?>>>
mapArrayArgument(String attribute, GraphQLInputObjectType arrayArgType) {
+ return argument -> {
+ Map<String, Object> argMap = (Map<String, Object>) argument;
+
+ // Get the element type from the "contains" field
+ GraphQLInputType containsFieldType =
arrayArgType.getField("contains") != null ?
arrayArgType.getField("contains").getType() : null;
+
+ if (containsFieldType == null) {
+ LOGGER.warn("Array argument type {} does not have a 'contains'
field", arrayArgType.getName());
+ return Stream.empty();
+ }
+
+ // Unwrap the element type and get the parser for it
+ GraphQLType unwrappedType = unwrapNonNull(containsFieldType);
+ if (!(unwrappedType instanceof GraphQLInputObjectType)) {
+ LOGGER.warn("Contains field type is not an input object type:
{}", simplePrint(unwrappedType));
+ return Stream.empty();
+ }
+
+ GraphQLInputObjectType elementType = (GraphQLInputObjectType)
unwrappedType;
+ GraphQLQueryParser elementParser = new
GraphQLQueryMapper().apply(elementType);
+
+ // Separate array operations from backward-compatible fields
+ Map<String, Object> backwardCompatFields = new
java.util.HashMap<>();
+ List<Stream<AttributeFilter<?>>> arrayOpStreams = new
java.util.ArrayList<>();
+
+ for (Map.Entry<String, Object> entry : argMap.entrySet()) {
+ String operation = entry.getKey();
+ Object value = entry.getValue();
Review Comment:
we should use as other methods:
```
FilterCondition condition =
FilterCondition.fromLabel(entry.getKey());
if (entry.getValue() == null) {
return null;
}
switch (condition) {
case IN:
return filterValueList(entry.getValue(), value ->
in(attribute, value));
case EQUAL:
return equalTo(attribute, entry.getValue().toString());
case IS_NULL:
return Boolean.TRUE.equals(entry.getValue()) ?
isNull(attribute) : notNull(attribute);
default:
return null;
}
```
right? instead of string values.
##########
data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/JPAQuery.java:
##########
@@ -156,17 +238,221 @@ protected final Predicate
buildPredicateFunction(AttributeFilter filter, Root<E>
return builder
.lessThanOrEqualTo(getAttributePath(root,
filter.getAttribute()), (Comparable) filter.getValue());
case OR:
- return builder.or(getRecursivePredicate(filter, root,
builder).toArray(new Predicate[] {}));
+ return builder.or(getRecursivePredicate(filter, root, builder,
criteriaQuery).toArray(new Predicate[] {}));
case AND:
- return builder.and(getRecursivePredicate(filter, root,
builder).toArray(new Predicate[] {}));
+ return builder.and(getRecursivePredicate(filter, root,
builder, criteriaQuery).toArray(new Predicate[] {}));
case NOT:
- return builder.not(filterPredicateFunction(root,
builder).apply((AttributeFilter<?>) filter.getValue()));
+ AttributeFilter<?> innerFilter = (AttributeFilter<?>)
filter.getValue();
+ // Check if this is a collection operation that needs special
handling
+ // Collection operations have attributes like "nodes.name" or
use CONTAINS/CONTAINS_ALL/CONTAINS_ANY
+ if (isCollectionNotOperation(innerFilter)) {
+ return buildCollectionNotPredicate(innerFilter, root,
builder, criteriaQuery);
+ }
+ return builder.not(filterPredicateFunction(root, builder,
criteriaQuery).apply(innerFilter));
default:
return null;
}
}
+ /**
+ * Checks if the filter is a collection operation (CONTAINS, CONTAINS_ALL,
CONTAINS_ANY)
+ * or contains collection attributes that require special NOT handling
with subqueries.
+ */
+ private boolean isCollectionNotOperation(AttributeFilter<?> filter) {
+ switch (filter.getCondition()) {
+ case CONTAINS:
+ case CONTAINS_ALL:
+ case CONTAINS_ANY:
+ return true;
Review Comment:
```suggestion
switch (filter.getCondition()) {
case CONTAINS, CONTAINS_ALL, CONTAINS_ANY ->
return true;
```
Would that work here?
##########
data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/query/GraphQLQueryMapper.java:
##########
@@ -229,6 +236,161 @@ private Function<Object, Stream<AttributeFilter<?>>>
mapSubEntityArgument(String
});
}
+ private Function<Object, Stream<AttributeFilter<?>>>
mapArrayArgument(String attribute, GraphQLInputObjectType arrayArgType) {
+ return argument -> {
+ Map<String, Object> argMap = (Map<String, Object>) argument;
+
+ // Get the element type from the "contains" field
Review Comment:
what if there's no contains field? Why do we abort, the switch below has
also other operators covered, shouldn't we return empty only in the default
branch of that switch?
##########
data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/query/GraphQLInputObjectTypeMapper.java:
##########
@@ -108,7 +112,20 @@ private GraphQLInputType
getInputTypeByField(GraphQLFieldDefinition field) {
return getInputObjectType("BooleanArgument");
case "DateTime":
return getInputObjectType("DateArgument");
+ case "StringArray":
+ return getInputObjectType("StringArrayArgument");
default:
+ // For array fields, try to use ArrayArgument type first
+ if (isArray) {
+ String arrayTypeName = name + "ArrayArgument";
Review Comment:
Seein ArrayArgument literal also further, this would deserve a constant
somewhere.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]