I am trying to write RSQL Parser which checks if the RSQL is logically correct. while the RSQL Java library checks whether the RSQL expression is grammatically correct, it doesn't check if the expression is logically correct.
One example of logically incorrect expressions would employee.name > 10
as the name is of String type, users should not be able to use >, <, >=, <=
Now to write this logic I am using a factory pattern as below:
public interface FieldValidator {
public boolean isValidExpression(ComparisonNode comparisonNode);
}
public class NameFieldValidator implements FieldValidator {
public Set<ComparisonOperator> supportedOperators = Set.of(EQUALS, NOT_EQUALS, IN, NOT_IN);
public boolean isValidExpression(ComparisonNode comparisonNode) {
ComparsionOperator operator = comparisonNode.getOperator();
if(!supportedOperators.contains(operator)) {
return false;
}
// other rules
}
}
Then I create a factory using FieldValidator
implementations and call factory implementation based on the i/p field.
But the problem I am facing here is that I have around 40 fields in my data model and might end up creating 40 implementations here.
Am I over-engineering here? is this not a good use case for a factory pattern? any other design that I should explore?