[#2429] Add completeness property for software modules (#2765)

* add `min artifacts` requirement on the Software Module Type level for Software Module completeness
* removed `complete` Distribution Set property from DB - calculated runtime
* Distribution Set and Software Module completeness is calcualted on demand in memory (TODO: implement cache)
* locking of Software Module now requires the software module to be `completed`
* removed 'complete' search field for DistributionSet type. Still keep (DEPRECATED) limited support for search with 'complete' -
  only on the first level of expression and with AND. I.e. complete==true, complete==false and id=in=(1, 3) is suppoted,
  while complete==false or id=in=(1, 3) and id=in(1, 3) and (type==os and complete==true) are not

Signed-off-by: Avgustin Marinov <Avgustin.Marinov@bosch.com>
This commit is contained in:
Avgustin Marinov
2025-10-22 09:57:45 +03:00
committed by GitHub
parent f1c3d0175e
commit e154e1b18a
32 changed files with 377 additions and 155 deletions

View File

@@ -154,6 +154,10 @@ public class QLSupport implements ApplicationListener<ContextRefreshedEvent> {
this.virtualPropertyResolver = virtualPropertyResolver;
}
public <A extends Enum<A> & QueryField> Node parse(final String query, final Class<A> queryFieldType) {
return parser.parse(ignoreCase || caseInsensitiveDB ? query.toLowerCase() : query, queryFieldType);
}
/**
* Builds a JPA {@link Specification} which corresponds with the given RSQL query. The specification can be used to filter for JPA entities
* with the given RSQL query.
@@ -168,16 +172,20 @@ public class QLSupport implements ApplicationListener<ContextRefreshedEvent> {
public <A extends Enum<A> & QueryField, T> Specification<T> buildSpec(final String query, final Class<A> queryFieldType) {
if (specBuilder == SpecBuilder.G3) {
return new SpecificationBuilder<T>(ignoreCase && !caseInsensitiveDB , database)
.specification(parseAndTransform(query, queryFieldType, ignoreCase || caseInsensitiveDB));
.specification(transform(parse(query, queryFieldType), queryFieldType));
} else {
return new SpecificationBuilderLegacy<A, T>(queryFieldType, virtualPropertyResolver, database).specification(query);
}
}
public <A extends Enum<A> & QueryField, T> Specification<T> buildSpec(final Node query, final Class<A> queryFieldType) {
return new SpecificationBuilder<T>(ignoreCase && !caseInsensitiveDB , database)
.specification(transform(query, queryFieldType));
}
@SuppressWarnings("java:S1117") // it is again ignoreCase
public <A extends Enum<A> & QueryField> EntityMatcher entityMatcher(final String query, final Class<A> queryFieldType) {
final boolean ignoreCase = this.ignoreCase || caseInsensitiveDB; // sync with DB and case sensitivity requirements
return EntityMatcher.of(parseAndTransform(query, queryFieldType, ignoreCase), ignoreCase);
return EntityMatcher.of(transform(parse(query, queryFieldType), queryFieldType), ignoreCase || caseInsensitiveDB);
}
/**
@@ -195,9 +203,7 @@ public class QLSupport implements ApplicationListener<ContextRefreshedEvent> {
buildSpec(query, queryFieldType).toPredicate(criteriaQuery.from((Class) jpaType), criteriaQuery, criteriaBuilder);
}
private <A extends Enum<A> & QueryField> Node parseAndTransform(
final String query, final Class<A> queryFieldType, final boolean ignoreCase) {
Node node = parser.parse(ignoreCase ? query.toLowerCase() : query, queryFieldType);
private <A extends Enum<A> & QueryField> Node transform(Node node, final Class<A> queryFieldType) {
for (final NodeTransformer transformer : nodeTransformers) {
node = transformer.transform(node, queryFieldType);
}