Skip to content

Commit

Permalink
Added main Antlr listener
Browse files Browse the repository at this point in the history
  • Loading branch information
cgendreau committed Feb 14, 2024
1 parent d29deb1 commit 918b080
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 72 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package ca.gc.aafc.dina.filter;

import java.util.ArrayList;
import java.util.List;

import com.querydsl.core.types.Ops;

import ca.gc.aafc.dina.filter.simple.SimpleSearchFilterBaseListener;
import ca.gc.aafc.dina.filter.simple.SimpleSearchFilterParser;

public class AntlBasedSimpleSearchFilterListener extends SimpleSearchFilterBaseListener {

private final List<FilterComponent> components = new ArrayList<>();
private final List<String> includes = new ArrayList<>();
private final List<String> sortAttributes = new ArrayList<>();

@Override
public void exitFilter(SimpleSearchFilterParser.FilterContext ctx) {
// more than 1 value means a OR
if (ctx.attributeValue().size() > 1) {
FilterGroup.FilterGroupBuilder fgBuilder =
FilterGroup.builder().conjunction(FilterGroup.Conjunction.OR);

for (var filterValue : ctx.attributeValue()) {
fgBuilder.component(new FilterExpression(ctx.propertyName().getText(),
translateOperator(ctx.comparison().getText()), filterValue.getText()));
}
components.add(fgBuilder.build());
} else if (ctx.attributeValue().size() == 1) {
components.add(new FilterExpression(ctx.propertyName().getText(),
translateOperator(ctx.comparison().getText()), ctx.attributeValue().get(0).getText()));
}
}

public void exitInclude(SimpleSearchFilterParser.IncludeContext ctx) {
for(var attribute : ctx.propertyName()) {
includes.add(attribute.getText());
}
}

@Override
public void exitSort(SimpleSearchFilterParser.SortContext ctx) {
for(var attribute : ctx.sortPropertyName()) {
sortAttributes.add(attribute.getText());
}
}

/**
* Build the FilterComponent object once the filter is parsed.
* @return
*/
public FilterComponent buildFilterComponent() {
if(components.size() == 1) {
return components.get(0);
} else if (components.size() > 1) {
return
FilterGroup.builder().conjunction(FilterGroup.Conjunction.AND)
.components(components).build();
}
return null;
}

public List<String> getInclude() {
return includes;
}

public List<String> getSort() {
return sortAttributes;
}

public Ops translateOperator(String op) {
return switch (op) {
case "EQ" -> Ops.EQ;
case "NEQ" -> Ops.NE;
default -> null;
};
}

}
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
package ca.gc.aafc.dina.filter;

import java.util.ArrayList;
import java.util.List;

import ca.gc.aafc.dina.filter.simple.SimpleSearchFilterLexer;
import ca.gc.aafc.dina.filter.simple.SimpleSearchFilterBaseListener;
import ca.gc.aafc.dina.filter.simple.SimpleSearchFilterParser;

import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import org.junit.jupiter.api.Test;

import com.querydsl.core.types.Ops;
import ca.gc.aafc.dina.filter.simple.SimpleSearchFilterLexer;
import ca.gc.aafc.dina.filter.simple.SimpleSearchFilterParser;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
Expand All @@ -34,74 +28,16 @@ public void onFilterAsString_structureReturned() {
ParseTree tree = parser.simpleFilter();

ParseTreeWalker walker = new ParseTreeWalker();
FilterComponentListener listener= new FilterComponentListener();
AntlBasedSimpleSearchFilterListener listener= new AntlBasedSimpleSearchFilterListener();
walker.walk(listener, tree);


FilterComponent fc = listener.buildFilterComponent();
assertNotNull(fc);
}

public static class FilterComponentListener extends SimpleSearchFilterBaseListener {
private final List<FilterComponent> components = new ArrayList<>();
private final List<String> sortAttributes = new ArrayList<>();

@Override
public void exitSimpleFilter(SimpleSearchFilterParser.SimpleFilterContext ctx) {
System.out.println("exit simple filter");
}

@Override
public void exitExpression(SimpleSearchFilterParser.ExpressionContext ctx) {
System.out.println("exit expression");
}


@Override
public void exitFilter(SimpleSearchFilterParser.FilterContext ctx) {
System.out.println("exit filter");
// more than 1 value means a OR
if (ctx.attributeValue().size() > 1) {
FilterGroup.FilterGroupBuilder fgBuilder =
FilterGroup.builder().conjunction(FilterGroup.Conjunction.OR);

for (var filterValue : ctx.attributeValue()) {
fgBuilder.component(new FilterExpression(ctx.propertyName().getText(),
translateOperator(ctx.comparison().getText()), filterValue.getText()));
}
components.add(fgBuilder.build());
} else if (ctx.attributeValue().size() == 1) {
components.add(new FilterExpression(ctx.propertyName().getText(),
translateOperator(ctx.comparison().getText()), ctx.attributeValue().get(0).getText()));
}
}

@Override
public void exitSort(SimpleSearchFilterParser.SortContext ctx) {
System.out.println("exit sort");
for(var attribute : ctx.sortPropertyName()) {
sortAttributes.add(attribute.getText());
}
}

public FilterComponent buildFilterComponent() {
if(components.size() == 1) {
return components.get(0);
} else if (components.size() > 1) {
return
FilterGroup.builder().conjunction(FilterGroup.Conjunction.AND)
.components(components).build();
}
return null;
}

public Ops translateOperator(String op) {
return switch (op) {
case "EQ" -> Ops.EQ;
case "NEQ" -> Ops.NE;
default -> null;
};
}

assertEquals("position", listener.getSort().get(0));
assertEquals("-name", listener.getSort().get(1));
assertEquals("author.name", listener.getInclude().get(0));
}

}
2 changes: 1 addition & 1 deletion dina-filter/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<parent>
<groupId>io.github.aafc-bicoe</groupId>
<artifactId>dina-base-parent</artifactId>
<version>0.115-SNAPSHOT</version>
<version>0.118-SNAPSHOT</version>
</parent>

<artifactId>dina-filter</artifactId>
Expand Down

0 comments on commit 918b080

Please sign in to comment.