Skip to content

Commit

Permalink
MID-9506: Added schema notion to Axiom Query Visitors
Browse files Browse the repository at this point in the history
  • Loading branch information
tonydamage committed Mar 20, 2024
1 parent 5d68e60 commit 48e765d
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,31 @@

import com.evolveum.axiom.lang.antlr.AxiomQueryError;

import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.ItemDefinition;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.xml.namespace.QName;
import java.util.List;
import java.util.Map;

public interface AxiomQueryLangService {

List<AxiomQueryError> validate(@Nullable ItemDefinition definition, String query);
@Deprecated
default List<AxiomQueryError> validate(String query) {
return validate(null, query);
}

Map<String, String> queryCompletion(@Nullable ItemDefinition definition, String query);

@Deprecated
default Map<String, String> queryCompletion(String query) {
return queryCompletion(null, query);
}

List<AxiomQueryError> validate(@Nullable ItemDefinition<?> rootItem, String query);

// FIXME: Return value should be more structured, e.g item definition, filter definition (with help text?)
// type definition?
// Something like suggested text, documentation for suggestion?
Map<String, String> queryCompletion(@Nullable ItemDefinition<?> rootItem, String query);

}
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,13 @@
public class AxiomQueryCompletionVisitor extends AxiomQueryParserBaseVisitor<Object> {
private final SchemaRegistry schemaRegistry;
private ParseTree lastSeparator = null;
private ParseTree lastType = null;
private QName lastType = null;

public AxiomQueryCompletionVisitor(PrismContext prismContext) {
public AxiomQueryCompletionVisitor(ItemDefinition<?> rootDef, PrismContext prismContext) {
schemaRegistry = prismContext.getSchemaRegistry();
if (rootDef != null) {
lastType = rootDef.getTypeName();
}
}

@Override
Expand All @@ -51,11 +54,12 @@ public Object visitErrorNode(ErrorNode node) {

@Override
public Object visitItemComponent(AxiomQueryParser.ItemComponentContext ctx) {

if (schemaRegistry.findTypeDefinitionByType(new QName(ctx.getText())) != null) {
lastType = ctx;
// FIXME: Is this correct? This is actually also executed for item paths
var maybeQName = new QName(ctx.getText());
var maybeType = schemaRegistry.findTypeDefinitionByType(maybeQName);
if (maybeType != null) {
lastType = maybeType.getTypeName();
}

return super.visitItemComponent(ctx);
}

Expand Down Expand Up @@ -187,8 +191,7 @@ private Map<String, String> getFilters(@NotNull String stringItemPath) {
private QName defineObjectType() {
if (lastType == null) {
return new QName("UserType");
} else {
return new QName(lastType.getText());
}
return lastType;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,20 @@ public AxiomQueryLangServiceImpl(PrismContext prismContext) {
this.prismContext = prismContext;
}

public List<AxiomQueryError> validate(@Nullable ItemDefinition definition, String query) {
AxiomQueryValidationVisitor axiomQueryValidationVisitor = new AxiomQueryValidationVisitor(this.prismContext);
public List<AxiomQueryError> validate(@Nullable ItemDefinition<?> rootItem, String query) {
AxiomQueryValidationVisitor axiomQueryValidationVisitor = new AxiomQueryValidationVisitor(rootItem, this.prismContext);
AxiomQuerySource axiomQuerySource = AxiomQuerySource.from(query);
axiomQuerySource.root().accept(axiomQueryValidationVisitor);
axiomQueryValidationVisitor.errorList.addAll(axiomQuerySource.getSyntaxError());
return axiomQueryValidationVisitor.errorList;
}

public Map<String, String> queryCompletion(@Nullable ItemDefinition definition, String query) {
public Map<String, String> queryCompletion(@Nullable ItemDefinition<?> rootItem, String query) {

if (query.isEmpty()) query = " ";

AxiomQuerySource axiomQuerySource = AxiomQuerySource.from(query);
AxiomQueryCompletionVisitor axiomQueryCompletionVisitor = new AxiomQueryCompletionVisitor(this.prismContext);
AxiomQueryCompletionVisitor axiomQueryCompletionVisitor = new AxiomQueryCompletionVisitor(rootItem, this.prismContext);
axiomQueryCompletionVisitor.visit(axiomQuerySource.root());
return axiomQueryCompletionVisitor.generateSuggestion();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.evolveum.midpoint.prism.schema.SchemaRegistry;

import org.antlr.v4.runtime.ParserRuleContext;
import org.jetbrains.annotations.Nullable;

import javax.xml.namespace.QName;
import java.util.ArrayList;
Expand All @@ -24,8 +25,16 @@ public class AxiomQueryValidationVisitor extends AxiomQueryParserBaseVisitor<Obj
private TypeDefinition typeDefinition;
private ItemDefinition<?> itemDefinition;

public AxiomQueryValidationVisitor(PrismContext prismContext) {
public AxiomQueryValidationVisitor(@Nullable ItemDefinition<?> rootItem, PrismContext prismContext) {
schemaRegistry = prismContext.getSchemaRegistry();
if (rootItem != null) {
itemDefinition = rootItem;
}
if (itemDefinition != null && itemDefinition.getTypeName() != null) {


typeDefinition = schemaRegistry.findTypeDefinitionByType(itemDefinition.getTypeName());
}
}

@Override
Expand Down

0 comments on commit 48e765d

Please sign in to comment.