Refactor RSQL serach fields related classes (2) (#1835)

Signed-off-by: Marinov Avgustin <Avgustin.Marinov@bosch.com>
This commit is contained in:
Avgustin Marinov
2024-09-09 17:44:01 +03:00
committed by GitHub
parent 072809be6c
commit 368c18ed5e
2 changed files with 13 additions and 17 deletions

View File

@@ -25,10 +25,10 @@ import cz.jirutka.rsql.parser.ast.ComparisonNode;
@Slf4j @Slf4j
public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> { public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> {
private final Class<A> fieldNameProvider; private final Class<A> rsqlQueryFieldType;
@Value @Value
public class RsqlField { protected class RsqlField {
A enumValue; A enumValue;
String[] subAttributes; String[] subAttributes;
@@ -39,22 +39,22 @@ public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> {
} }
} }
protected AbstractRSQLVisitor(final Class<A> fieldNameProvider) { protected AbstractRSQLVisitor(final Class<A> rsqlQueryFieldType) {
this.fieldNameProvider = fieldNameProvider; this.rsqlQueryFieldType = rsqlQueryFieldType;
} }
protected RsqlField getRsqlField(final ComparisonNode node) { protected RsqlField getRsqlField(final ComparisonNode node) {
final String[] graph = node.getSelector().split(RsqlQueryField.SUB_ATTRIBUTE_SPLIT_REGEX); final String[] graph = node.getSelector().split(RsqlQueryField.SUB_ATTRIBUTE_SPLIT_REGEX);
final String enumName = graph.length == 0 ? node.getSelector() : graph[0]; final String enumName = graph.length == 0 ? node.getSelector() : graph[0];
log.debug("get field identifier by name {} of enum type {}", enumName, fieldNameProvider); log.debug("get field identifier by name {} of enum type {}", enumName, rsqlQueryFieldType);
try { try {
final A enumValue = Enum.valueOf(fieldNameProvider, enumName.toUpperCase()); final A enumValue = Enum.valueOf(rsqlQueryFieldType, enumName.toUpperCase());
final String[] subAttributes = enumValue.getSubAttributes(node.getSelector()); final String[] subAttributes = enumValue.getSubAttributes(node.getSelector());
// validate // validate
if (enumValue.isMap()) { if (enumValue.isMap()) {
// enum.key // <enum>.<key>
if (subAttributes.length != 2) { if (subAttributes.length != 2) {
throw new RSQLParameterUnsupportedFieldException( throw new RSQLParameterUnsupportedFieldException(
"The syntax of the given map search parameter field {" + node.getSelector() + "} is wrong. Syntax is: <enum name>.<key name>"); "The syntax of the given map search parameter field {" + node.getSelector() + "} is wrong. Syntax is: <enum name>.<key name>");
@@ -92,8 +92,7 @@ public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> {
* @return Exception with prepared message extracted from the comparison node. * @return Exception with prepared message extracted from the comparison node.
*/ */
private RSQLParameterUnsupportedFieldException createRSQLParameterUnsupportedException( private RSQLParameterUnsupportedFieldException createRSQLParameterUnsupportedException(
@NotNull final ComparisonNode node, @NotNull final ComparisonNode node, final Exception rootException) {
final Exception rootException) {
return new RSQLParameterUnsupportedFieldException(String.format( return new RSQLParameterUnsupportedFieldException(String.format(
"The given search parameter field {%s} does not exist, must be one of the following fields %s", "The given search parameter field {%s} does not exist, must be one of the following fields %s",
node.getSelector(), getExpectedFieldList()), rootException); node.getSelector(), getExpectedFieldList()), rootException);
@@ -106,7 +105,7 @@ public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> {
} }
private List<String> getExpectedFieldList() { private List<String> getExpectedFieldList() {
final List<String> expectedFieldList = Arrays.stream(fieldNameProvider.getEnumConstants()) final List<String> expectedFieldList = Arrays.stream(rsqlQueryFieldType.getEnumConstants())
.filter(enumField -> enumField.getSubEntityAttributes().isEmpty()).map(enumField -> { .filter(enumField -> enumField.getSubEntityAttributes().isEmpty()).map(enumField -> {
final String enumFieldName = enumField.name().toLowerCase(); final String enumFieldName = enumField.name().toLowerCase();
if (enumField.isMap()) { if (enumField.isMap()) {
@@ -116,7 +115,7 @@ public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> {
} }
}).collect(Collectors.toList()); }).collect(Collectors.toList());
final List<String> expectedSubFieldList = Arrays.stream(fieldNameProvider.getEnumConstants()) final List<String> expectedSubFieldList = Arrays.stream(rsqlQueryFieldType.getEnumConstants())
.filter(enumField -> !enumField.getSubEntityAttributes().isEmpty()).flatMap(enumField -> { .filter(enumField -> !enumField.getSubEntityAttributes().isEmpty()).flatMap(enumField -> {
final List<String> subEntity = enumField final List<String> subEntity = enumField
.getSubEntityAttributes().stream().map(fieldName -> enumField.name().toLowerCase() .getSubEntityAttributes().stream().map(fieldName -> enumField.name().toLowerCase()

View File

@@ -21,8 +21,7 @@ import cz.jirutka.rsql.parser.ast.RSQLVisitor;
* {@link RSQLVisitor} implementation which validates the nodes (fields) based * {@link RSQLVisitor} implementation which validates the nodes (fields) based
* on a given {@link RsqlQueryField} for a given entity type. * on a given {@link RsqlQueryField} for a given entity type.
* *
* @param <A> * @param <A> The type the {@link RsqlQueryField} refers to.
* The type the {@link RsqlQueryField} refers to.
*/ */
public class FieldValidationRsqlVisitor<A extends Enum<A> & RsqlQueryField> extends AbstractRSQLVisitor<A> public class FieldValidationRsqlVisitor<A extends Enum<A> & RsqlQueryField> extends AbstractRSQLVisitor<A>
implements RSQLVisitor<Void, String> { implements RSQLVisitor<Void, String> {
@@ -30,8 +29,7 @@ public class FieldValidationRsqlVisitor<A extends Enum<A> & RsqlQueryField> exte
/** /**
* Constructs the visitor and initializes it. * Constructs the visitor and initializes it.
* *
* @param fieldNameProvider * @param fieldNameProvider The {@link RsqlQueryField} to use for validation.
* The {@link RsqlQueryField} to use for validation.
*/ */
public FieldValidationRsqlVisitor(final Class<A> fieldNameProvider) { public FieldValidationRsqlVisitor(final Class<A> fieldNameProvider) {
super(fieldNameProvider); super(fieldNameProvider);
@@ -58,5 +56,4 @@ public class FieldValidationRsqlVisitor<A extends Enum<A> & RsqlQueryField> exte
node.getChildren().forEach(child -> child.accept(this, param)); node.getChildren().forEach(child -> child.accept(this, param));
return null; return null;
} }
}
}