http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/HapiMessage.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/HapiMessage.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/HapiMessage.java index ddd28b2..74a8f6c 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/HapiMessage.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/HapiMessage.java @@ -32,63 +32,64 @@ import ca.uhn.hl7v2.model.Segment; import ca.uhn.hl7v2.model.Structure; public class HapiMessage implements HL7Message { - private final Message message; - private final List<HL7Segment> allSegments; - private final Map<String, List<HL7Segment>> segmentMap; - - public HapiMessage(final Message message) throws HL7Exception { - this.message = message; - - allSegments = new ArrayList<>(); - populateSegments(message, allSegments); - - segmentMap = new HashMap<>(); - for ( final HL7Segment segment : allSegments ) { - final String segmentName = segment.getName(); - List<HL7Segment> segmentList = segmentMap.get(segmentName); - if ( segmentList == null ) { - segmentList = new ArrayList<>(); - segmentMap.put(segmentName, segmentList); - } - - segmentList.add(segment); - } - } - - private void populateSegments(final Group group, final List<HL7Segment> segments) throws HL7Exception { - for ( final String structureName : group.getNames() ) { - final Structure[] structures = group.getAll(structureName); - if ( group.isGroup(structureName) ) { - for ( final Structure structure : structures ) { - populateSegments((Group) structure, segments); - } - } else { - for ( final Structure structure : structures ) { - final Segment segment = (Segment) structure; - final HapiSegment hapiSegment = new HapiSegment(segment); - segments.add(hapiSegment); - } - } - } - } - - @Override - public List<HL7Segment> getSegments() { - return Collections.unmodifiableList(allSegments); - } - @Override - public List<HL7Segment> getSegments(final String segmentType) { - final List<HL7Segment> segments = segmentMap.get(segmentType); - if ( segments == null ) { - return Collections.emptyList(); - } - - return Collections.unmodifiableList(segments); - } + private final Message message; + private final List<HL7Segment> allSegments; + private final Map<String, List<HL7Segment>> segmentMap; - @Override - public String toString() { - return message.toString(); - } + public HapiMessage(final Message message) throws HL7Exception { + this.message = message; + + allSegments = new ArrayList<>(); + populateSegments(message, allSegments); + + segmentMap = new HashMap<>(); + for (final HL7Segment segment : allSegments) { + final String segmentName = segment.getName(); + List<HL7Segment> segmentList = segmentMap.get(segmentName); + if (segmentList == null) { + segmentList = new ArrayList<>(); + segmentMap.put(segmentName, segmentList); + } + + segmentList.add(segment); + } + } + + private void populateSegments(final Group group, final List<HL7Segment> segments) throws HL7Exception { + for (final String structureName : group.getNames()) { + final Structure[] structures = group.getAll(structureName); + if (group.isGroup(structureName)) { + for (final Structure structure : structures) { + populateSegments((Group) structure, segments); + } + } else { + for (final Structure structure : structures) { + final Segment segment = (Segment) structure; + final HapiSegment hapiSegment = new HapiSegment(segment); + segments.add(hapiSegment); + } + } + } + } + + @Override + public List<HL7Segment> getSegments() { + return Collections.unmodifiableList(allSegments); + } + + @Override + public List<HL7Segment> getSegments(final String segmentType) { + final List<HL7Segment> segments = segmentMap.get(segmentType); + if (segments == null) { + return Collections.emptyList(); + } + + return Collections.unmodifiableList(segments); + } + + @Override + public String toString() { + return message.toString(); + } }
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/HapiSegment.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/HapiSegment.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/HapiSegment.java index d50afdb..20e646c 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/HapiSegment.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/HapiSegment.java @@ -28,42 +28,42 @@ import ca.uhn.hl7v2.model.Segment; import ca.uhn.hl7v2.model.Type; public class HapiSegment implements HL7Segment { - private final Segment segment; - private final List<HL7Field> fields; - - public HapiSegment(final Segment segment) throws HL7Exception { - this.segment = segment; - - final List<HL7Field> fieldList = new ArrayList<>(); - for (int i=1; i <= segment.numFields(); i++) { - final Type[] types = segment.getField(i); - if ( types == null || types.length == 0 ) { - fieldList.add(new EmptyField()); - continue; - } - - for ( final Type type : types ) { - fieldList.add(new HapiField(type)); - } - } - - this.fields = Collections.unmodifiableList(fieldList); - } - - - @Override - public String getName() { - return segment.getName(); - } + private final Segment segment; + private final List<HL7Field> fields; - @Override - public List<HL7Field> getFields() { - return fields; - } + public HapiSegment(final Segment segment) throws HL7Exception { + this.segment = segment; - @Override - public String toString() { - return segment.toString(); - } + final List<HL7Field> fieldList = new ArrayList<>(); + for (int i = 1; i <= segment.numFields(); i++) { + final Type[] types = segment.getField(i); + + if (types == null || types.length == 0) { + fieldList.add(new EmptyField()); + continue; + } + + for (final Type type : types) { + fieldList.add(new HapiField(type)); + } + } + + this.fields = Collections.unmodifiableList(fieldList); + } + + @Override + public String getName() { + return segment.getName(); + } + + @Override + public List<HL7Field> getFields() { + return fields; + } + + @Override + public String toString() { + return segment.toString(); + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/SingleValueField.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/SingleValueField.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/SingleValueField.java index ed99077..b8a6351 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/SingleValueField.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/hapi/SingleValueField.java @@ -23,20 +23,21 @@ import org.apache.nifi.hl7.model.HL7Component; import org.apache.nifi.hl7.model.HL7Field; public class SingleValueField implements HL7Field { - private final String value; - - public SingleValueField(final String value) { - this.value = value; - } - - @Override - public String getValue() { - return value; - } - - @Override - public List<HL7Component> getComponents() { - return Collections.emptyList(); - } + + private final String value; + + public SingleValueField(final String value) { + this.value = value; + } + + @Override + public String getValue() { + return value; + } + + @Override + public List<HL7Component> getComponents() { + return Collections.emptyList(); + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/io/HL7Reader.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/io/HL7Reader.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/io/HL7Reader.java index e7b31a4..4d2f276 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/io/HL7Reader.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/io/HL7Reader.java @@ -22,6 +22,6 @@ import org.apache.nifi.hl7.model.HL7Message; public interface HL7Reader { - HL7Message nextMessage() throws IOException; - + HL7Message nextMessage() throws IOException; + } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/io/exception/InvalidHL7Exception.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/io/exception/InvalidHL7Exception.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/io/exception/InvalidHL7Exception.java index 669f40c..c0c74f9 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/io/exception/InvalidHL7Exception.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/io/exception/InvalidHL7Exception.java @@ -19,22 +19,23 @@ package org.apache.nifi.hl7.io.exception; import java.io.IOException; public class InvalidHL7Exception extends IOException { - private static final long serialVersionUID = -5675416667224562441L; - public InvalidHL7Exception() { - super(); - } + private static final long serialVersionUID = -5675416667224562441L; - public InvalidHL7Exception(String message, Throwable cause) { - super(message, cause); - } + public InvalidHL7Exception() { + super(); + } - public InvalidHL7Exception(String message) { - super(message); - } + public InvalidHL7Exception(String message, Throwable cause) { + super(message, cause); + } + + public InvalidHL7Exception(String message) { + super(message); + } + + public InvalidHL7Exception(Throwable cause) { + super(cause); + } - public InvalidHL7Exception(Throwable cause) { - super(cause); - } - } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Component.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Component.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Component.java index cf35504..d8c1495 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Component.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Component.java @@ -19,6 +19,8 @@ package org.apache.nifi.hl7.model; import java.util.List; public interface HL7Component { - String getValue(); - List<HL7Component> getComponents(); + + String getValue(); + + List<HL7Component> getComponents(); } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Field.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Field.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Field.java index 4086e58..ff58d96 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Field.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Field.java @@ -16,6 +16,5 @@ */ package org.apache.nifi.hl7.model; - public interface HL7Field extends HL7Component { } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Message.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Message.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Message.java index dd9c2a9..dc68c2b 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Message.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Message.java @@ -20,8 +20,8 @@ import java.util.List; public interface HL7Message { - List<HL7Segment> getSegments(); - - List<HL7Segment> getSegments(String segmentType); - + List<HL7Segment> getSegments(); + + List<HL7Segment> getSegments(String segmentType); + } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Segment.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Segment.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Segment.java index de5aaa1..d5d67ae 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Segment.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/model/HL7Segment.java @@ -20,8 +20,8 @@ import java.util.List; public interface HL7Segment { - String getName(); - - List<HL7Field> getFields(); - + String getName(); + + List<HL7Field> getFields(); + } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/Declaration.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/Declaration.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/Declaration.java index 0903cc8..94998e7 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/Declaration.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/Declaration.java @@ -20,10 +20,10 @@ import org.apache.nifi.hl7.model.HL7Message; public interface Declaration { - String getAlias(); - - boolean isRequired(); - - Object getDeclaredValue(HL7Message message); - + String getAlias(); + + boolean isRequired(); + + Object getDeclaredValue(HL7Message message); + } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/HL7Query.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/HL7Query.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/HL7Query.java index a036106..3734b4f 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/HL7Query.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/HL7Query.java @@ -16,8 +16,6 @@ */ package org.apache.nifi.hl7.query; -import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.*; - import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -58,196 +56,211 @@ import org.apache.nifi.hl7.query.result.StandardQueryResult; import org.apache.nifi.hl7.query.antlr.HL7QueryLexer; import org.apache.nifi.hl7.query.antlr.HL7QueryParser; - +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.AND; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.DECLARE; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.DOT; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.EQUALS; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.GE; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.GT; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.IDENTIFIER; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.IS_NULL; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.LE; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.LT; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.MESSAGE; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.NOT; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.NOT_EQUALS; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.NOT_NULL; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.NUMBER; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.OR; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.REQUIRED; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.SEGMENT_NAME; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.SELECT; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.STRING_LITERAL; +import static org.apache.nifi.hl7.query.antlr.HL7QueryParser.WHERE; public class HL7Query { - private final Tree tree; - private final String query; - private final Set<Declaration> declarations = new HashSet<>(); - - private final List<Selection> selections; - private final BooleanEvaluator whereEvaluator; - - private HL7Query(final Tree tree, final String query) { - this.tree = tree; - this.query = query; - - List<Selection> select = null; - BooleanEvaluator where = null; - for (int i=0; i < tree.getChildCount(); i++) { - final Tree child = tree.getChild(i); - - switch (child.getType()) { - case DECLARE: - processDeclare(child); - break; - case SELECT: - select = processSelect(child); - break; - case WHERE: - where = processWhere(child); - break; - default: - throw new HL7QueryParsingException("Found unexpected clause at root level: " + tree.getText()); - } - } - - this.whereEvaluator = where; - this.selections = select; - } - - private void processDeclare(final Tree declare) { - for (int i=0; i < declare.getChildCount(); i++) { - final Tree declarationTree = declare.getChild(i); - - final String identifier = declarationTree.getChild(0).getText(); - final Tree requiredOrOptionalTree = declarationTree.getChild(1); - final boolean required = requiredOrOptionalTree.getType() == REQUIRED; - - final String segmentName = declarationTree.getChild(2).getText(); - - final Declaration declaration = new Declaration() { - @Override - public String getAlias() { - return identifier; - } - - @Override - public boolean isRequired() { - return required; - } - - @Override - public Object getDeclaredValue(final HL7Message message) { - if ( message == null ) { - return null; - } - - return message.getSegments(segmentName); - } - }; - - declarations.add(declaration); - } - } - - private List<Selection> processSelect(final Tree select) { - final List<Selection> selections = new ArrayList<>(); - - for (int i=0; i < select.getChildCount(); i++) { - final Tree selectable = select.getChild(i); - - final String alias = getSelectedName(selectable); - final Evaluator<?> selectionEvaluator = buildReferenceEvaluator(selectable); - final Selection selection = new Selection(selectionEvaluator, alias); - selections.add(selection); - } - - return selections; - } - - - private String getSelectedName(final Tree selectable) { - if ( selectable.getChildCount() == 0 ) { - return selectable.getText(); - } else if (selectable.getType() == DOT ) { - return getSelectedName(selectable.getChild(0)) + "." + getSelectedName(selectable.getChild(1)); - } else { - return selectable.getChild(selectable.getChildCount() - 1).getText(); - } - } - - - private BooleanEvaluator processWhere(final Tree where) { - return buildBooleanEvaluator(where.getChild(0)); - } - - - private Evaluator<?> buildReferenceEvaluator(final Tree tree) { - switch (tree.getType()) { - case MESSAGE: - return new MessageEvaluator(); - case SEGMENT_NAME: - return new SegmentEvaluator(new StringLiteralEvaluator(tree.getText())); - case IDENTIFIER: - return new DeclaredReferenceEvaluator(new StringLiteralEvaluator(tree.getText())); - case DOT: - final Tree firstChild = tree.getChild(0); - final Tree secondChild = tree.getChild(1); - return new DotEvaluator(buildReferenceEvaluator(firstChild), buildIntegerEvaluator(secondChild)); - case STRING_LITERAL: - return new StringLiteralEvaluator(tree.getText()); - case NUMBER: - return new IntegerLiteralEvaluator(Integer.parseInt(tree.getText())); - default: - throw new HL7QueryParsingException("Failed to build evaluator for " + tree.getText()); - } - } - - - private IntegerEvaluator buildIntegerEvaluator(final Tree tree) { - switch (tree.getType()) { - case NUMBER: - return new IntegerLiteralEvaluator(Integer.parseInt(tree.getText())); - default: - throw new HL7QueryParsingException("Failed to build Integer Evaluator for " + tree.getText()); - } - } - - - private BooleanEvaluator buildBooleanEvaluator(final Tree tree) { - // TODO: add Date comparisons - // LT/GT/GE/GE should allow for dates based on Field's Type - // BETWEEN - // DATE('2015/01/01') - // DATE('2015/01/01 12:00:00') - // DATE('24 HOURS AGO') - // DATE('YESTERDAY') - - switch (tree.getType()) { - case EQUALS: - return new EqualsEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); - case NOT_EQUALS: - return new NotEqualsEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); - case GT: - return new GreaterThanEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); - case LT: - return new LessThanEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); - case GE: - return new GreaterThanOrEqualEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); - case LE: - return new LessThanOrEqualEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); - case NOT: - return new NotEvaluator(buildBooleanEvaluator(tree.getChild(0))); - case AND: - return new AndEvaluator(buildBooleanEvaluator(tree.getChild(0)), buildBooleanEvaluator(tree.getChild(1))); - case OR: - return new OrEvaluator(buildBooleanEvaluator(tree.getChild(0)), buildBooleanEvaluator(tree.getChild(1))); - case IS_NULL: - return new IsNullEvaluator(buildReferenceEvaluator(tree.getChild(0))); - case NOT_NULL: - return new NotNullEvaluator(buildReferenceEvaluator(tree.getChild(0))); - default: - throw new HL7QueryParsingException("Cannot build boolean evaluator for '" + tree.getText() + "'"); - } - } - - - Tree getTree() { - return tree; - } - - public String getQuery() { - return query; - } - - @Override - public String toString() { - return "HL7Query[" + query + "]"; - } - - public static HL7Query compile(final String query) { - try { + + private final Tree tree; + private final String query; + private final Set<Declaration> declarations = new HashSet<>(); + + private final List<Selection> selections; + private final BooleanEvaluator whereEvaluator; + + private HL7Query(final Tree tree, final String query) { + this.tree = tree; + this.query = query; + + List<Selection> select = null; + BooleanEvaluator where = null; + for (int i = 0; i < tree.getChildCount(); i++) { + final Tree child = tree.getChild(i); + + switch (child.getType()) { + case DECLARE: + processDeclare(child); + break; + case SELECT: + select = processSelect(child); + break; + case WHERE: + where = processWhere(child); + break; + default: + throw new HL7QueryParsingException("Found unexpected clause at root level: " + tree.getText()); + } + } + + this.whereEvaluator = where; + this.selections = select; + } + + private void processDeclare(final Tree declare) { + for (int i = 0; i < declare.getChildCount(); i++) { + final Tree declarationTree = declare.getChild(i); + + final String identifier = declarationTree.getChild(0).getText(); + final Tree requiredOrOptionalTree = declarationTree.getChild(1); + final boolean required = requiredOrOptionalTree.getType() == REQUIRED; + + final String segmentName = declarationTree.getChild(2).getText(); + + final Declaration declaration = new Declaration() { + @Override + public String getAlias() { + return identifier; + } + + @Override + public boolean isRequired() { + return required; + } + + @Override + public Object getDeclaredValue(final HL7Message message) { + if (message == null) { + return null; + } + + return message.getSegments(segmentName); + } + }; + + declarations.add(declaration); + } + } + + private List<Selection> processSelect(final Tree select) { + final List<Selection> selections = new ArrayList<>(); + + for (int i = 0; i < select.getChildCount(); i++) { + final Tree selectable = select.getChild(i); + + final String alias = getSelectedName(selectable); + final Evaluator<?> selectionEvaluator = buildReferenceEvaluator(selectable); + final Selection selection = new Selection(selectionEvaluator, alias); + selections.add(selection); + } + + return selections; + } + + private String getSelectedName(final Tree selectable) { + if (selectable.getChildCount() == 0) { + return selectable.getText(); + } else if (selectable.getType() == DOT) { + return getSelectedName(selectable.getChild(0)) + "." + getSelectedName(selectable.getChild(1)); + } else { + return selectable.getChild(selectable.getChildCount() - 1).getText(); + } + } + + private BooleanEvaluator processWhere(final Tree where) { + return buildBooleanEvaluator(where.getChild(0)); + } + + private Evaluator<?> buildReferenceEvaluator(final Tree tree) { + switch (tree.getType()) { + case MESSAGE: + return new MessageEvaluator(); + case SEGMENT_NAME: + return new SegmentEvaluator(new StringLiteralEvaluator(tree.getText())); + case IDENTIFIER: + return new DeclaredReferenceEvaluator(new StringLiteralEvaluator(tree.getText())); + case DOT: + final Tree firstChild = tree.getChild(0); + final Tree secondChild = tree.getChild(1); + return new DotEvaluator(buildReferenceEvaluator(firstChild), buildIntegerEvaluator(secondChild)); + case STRING_LITERAL: + return new StringLiteralEvaluator(tree.getText()); + case NUMBER: + return new IntegerLiteralEvaluator(Integer.parseInt(tree.getText())); + default: + throw new HL7QueryParsingException("Failed to build evaluator for " + tree.getText()); + } + } + + private IntegerEvaluator buildIntegerEvaluator(final Tree tree) { + switch (tree.getType()) { + case NUMBER: + return new IntegerLiteralEvaluator(Integer.parseInt(tree.getText())); + default: + throw new HL7QueryParsingException("Failed to build Integer Evaluator for " + tree.getText()); + } + } + + private BooleanEvaluator buildBooleanEvaluator(final Tree tree) { + // TODO: add Date comparisons + // LT/GT/GE/GE should allow for dates based on Field's Type + // BETWEEN + // DATE('2015/01/01') + // DATE('2015/01/01 12:00:00') + // DATE('24 HOURS AGO') + // DATE('YESTERDAY') + + switch (tree.getType()) { + case EQUALS: + return new EqualsEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); + case NOT_EQUALS: + return new NotEqualsEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); + case GT: + return new GreaterThanEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); + case LT: + return new LessThanEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); + case GE: + return new GreaterThanOrEqualEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); + case LE: + return new LessThanOrEqualEvaluator(buildReferenceEvaluator(tree.getChild(0)), buildReferenceEvaluator(tree.getChild(1))); + case NOT: + return new NotEvaluator(buildBooleanEvaluator(tree.getChild(0))); + case AND: + return new AndEvaluator(buildBooleanEvaluator(tree.getChild(0)), buildBooleanEvaluator(tree.getChild(1))); + case OR: + return new OrEvaluator(buildBooleanEvaluator(tree.getChild(0)), buildBooleanEvaluator(tree.getChild(1))); + case IS_NULL: + return new IsNullEvaluator(buildReferenceEvaluator(tree.getChild(0))); + case NOT_NULL: + return new NotNullEvaluator(buildReferenceEvaluator(tree.getChild(0))); + default: + throw new HL7QueryParsingException("Cannot build boolean evaluator for '" + tree.getText() + "'"); + } + } + + Tree getTree() { + return tree; + } + + public String getQuery() { + return query; + } + + @Override + public String toString() { + return "HL7Query[" + query + "]"; + } + + public static HL7Query compile(final String query) { + try { final CommonTokenStream lexerTokenStream = createTokenStream(query); final HL7QueryParser parser = new HL7QueryParser(lexerTokenStream); final Tree tree = (Tree) parser.query().getTree(); @@ -258,155 +271,114 @@ public class HL7Query { } catch (final Exception e) { throw new HL7QueryParsingException(e); } - } - - private static CommonTokenStream createTokenStream(final String expression) throws HL7QueryParsingException { + } + + private static CommonTokenStream createTokenStream(final String expression) throws HL7QueryParsingException { final CharStream input = new ANTLRStringStream(expression); final HL7QueryLexer lexer = new HL7QueryLexer(input); return new CommonTokenStream(lexer); } - - public List<Class<?>> getReturnTypes() { - final List<Class<?>> returnTypes = new ArrayList<>(); - - for ( final Selection selection : selections ) { - returnTypes.add( selection.getEvaluator().getType() ); - } - - return returnTypes; - } - - @SuppressWarnings("unchecked") - public QueryResult evaluate(final HL7Message message) { - - int totalIterations = 1; - final LinkedHashMap<String, List<Object>> possibleValueMap = new LinkedHashMap<>(); - for ( final Declaration declaration : declarations ) { - final Object value = declaration.getDeclaredValue(message); - if ( value == null && declaration.isRequired() ) { - return new MissedResult(selections); - } - - final List<Object> possibleValues; - if ( value instanceof List ) { - possibleValues = (List<Object>) value; - } else if ( value instanceof Collection ) { - possibleValues = new ArrayList<Object>((Collection<Object>) value); - } else { - possibleValues = new ArrayList<>(1); - possibleValues.add(value); - } - - if ( possibleValues.isEmpty() ) { - return new MissedResult(selections); - } - - possibleValueMap.put(declaration.getAlias(), possibleValues); - totalIterations *= possibleValues.size(); - } - - final Set<Map<String, Object>> resultSet = new HashSet<>(); - for (int i=0; i < totalIterations; i++) { - final Map<String, Object> aliasValues = assignAliases(possibleValueMap, i); - - aliasValues.put(Evaluator.MESSAGE_KEY, message); - if (whereEvaluator == null || Boolean.TRUE.equals(whereEvaluator.evaluate(aliasValues))) { - final Map<String, Object> resultMap = new HashMap<>(); - - for ( final Selection selection : selections ) { - final Object value = selection.getEvaluator().evaluate(aliasValues); - resultMap.put(selection.getName(), value); - } - - resultSet.add(resultMap); - } - } - -// for ( final Declaration declaration : declarations ) { -// final Object value = declaration.getDeclaredValue(message); -// if ( value == null && declaration.isRequired() ) { -// return new MissedResult(selections); -// } -// objectMap.put(declaration.getAlias(), value); -// } -// -// if (whereEvaluator == null || Boolean.TRUE.equals(whereEvaluator.evaluate(objectMap))) { -// for ( final Selection selection : selections ) { -// final Object value = selection.getEvaluator().evaluate(objectMap); -// resultMap.put(selection.getName(), value); -// } -// } else { -// return new MissedResult(selections); -// } - - return new StandardQueryResult(selections, resultSet); - } - - - // assigns one of the possible values to each alias, based on which iteration this is. - // require LinkedHashMap just to be very clear and explicit that the order of the Map MUST be guaranteed - // between multiple invocations of this method. - // package protected for testing visibility -// static Map<String, Object> assignAliases(final LinkedHashMap<String, List<Object>> possibleValues, final int iteration) { -// final Map<String, Object> aliasMap = new HashMap<>(); -// -// int aliasIndex = possibleValues.size() - 1; -// for ( final Map.Entry<String, List<Object>> entry : possibleValues.entrySet() ) { -// final String alias = entry.getKey(); -// final List<Object> validValues = entry.getValue(); -// -// final int validValueIndex; -// if (aliasIndex > 0) { -// validValueIndex = iteration / aliasIndex; -// } else { -// validValueIndex = iteration; -// } -// -// final Object obj = validValues.get(validValueIndex % validValues.size()); -// aliasMap.put(alias, obj); -// -// aliasIndex--; -// } -// -// return aliasMap; -// } -// - - static Map<String, Object> assignAliases(final LinkedHashMap<String, List<Object>> possibleValues, final int iteration) { - final Map<String, Object> aliasMap = new HashMap<>(); - - int divisor = 1; - for ( final Map.Entry<String, List<Object>> entry : possibleValues.entrySet() ) { - final String alias = entry.getKey(); - final List<Object> validValues = entry.getValue(); - - final int idx = (iteration / divisor) % validValues.size(); - final Object obj = validValues.get(idx); - aliasMap.put(alias, obj); - - divisor *= validValues.size(); - } - - return aliasMap; - } - - public String toTreeString() { - final StringBuilder sb = new StringBuilder(); - toTreeString(tree, sb, 0); - return sb.toString(); - } - - private void toTreeString(final Tree tree, final StringBuilder sb, final int indentLevel) { - final String nodeName = tree.getText(); - for (int i=0; i < indentLevel; i++) { - sb.append(" "); - } - sb.append(nodeName); - sb.append("\n"); - - for (int i=0; i < tree.getChildCount(); i++) { - final Tree child = tree.getChild(i); - toTreeString(child, sb, indentLevel + 2); - } - } + + public List<Class<?>> getReturnTypes() { + final List<Class<?>> returnTypes = new ArrayList<>(); + + for (final Selection selection : selections) { + returnTypes.add(selection.getEvaluator().getType()); + } + + return returnTypes; + } + + @SuppressWarnings("unchecked") + public QueryResult evaluate(final HL7Message message) { + + int totalIterations = 1; + final LinkedHashMap<String, List<Object>> possibleValueMap = new LinkedHashMap<>(); + for (final Declaration declaration : declarations) { + final Object value = declaration.getDeclaredValue(message); + if (value == null && declaration.isRequired()) { + return new MissedResult(selections); + } + + final List<Object> possibleValues; + if (value instanceof List) { + possibleValues = (List<Object>) value; + } else if (value instanceof Collection) { + possibleValues = new ArrayList<Object>((Collection<Object>) value); + } else { + possibleValues = new ArrayList<>(1); + possibleValues.add(value); + } + + if (possibleValues.isEmpty()) { + return new MissedResult(selections); + } + + possibleValueMap.put(declaration.getAlias(), possibleValues); + totalIterations *= possibleValues.size(); + } + + final Set<Map<String, Object>> resultSet = new HashSet<>(); + for (int i = 0; i < totalIterations; i++) { + final Map<String, Object> aliasValues = assignAliases(possibleValueMap, i); + + aliasValues.put(Evaluator.MESSAGE_KEY, message); + if (whereEvaluator == null || Boolean.TRUE.equals(whereEvaluator.evaluate(aliasValues))) { + final Map<String, Object> resultMap = new HashMap<>(); + + for (final Selection selection : selections) { + final Object value = selection.getEvaluator().evaluate(aliasValues); + resultMap.put(selection.getName(), value); + } + + resultSet.add(resultMap); + } + } + + return new StandardQueryResult(selections, resultSet); + } + + /** + * assigns one of the possible values to each alias, based on which iteration this is. + * require LinkedHashMap just to be very clear and explicit that the order of the Map MUST be guaranteed + * between multiple invocations of this method. + * package protected for testing visibility + */ + static Map<String, Object> assignAliases(final LinkedHashMap<String, List<Object>> possibleValues, final int iteration) { + final Map<String, Object> aliasMap = new HashMap<>(); + + int divisor = 1; + for (final Map.Entry<String, List<Object>> entry : possibleValues.entrySet()) { + final String alias = entry.getKey(); + final List<Object> validValues = entry.getValue(); + + final int idx = (iteration / divisor) % validValues.size(); + final Object obj = validValues.get(idx); + aliasMap.put(alias, obj); + + divisor *= validValues.size(); + } + + return aliasMap; + } + + public String toTreeString() { + final StringBuilder sb = new StringBuilder(); + toTreeString(tree, sb, 0); + return sb.toString(); + } + + private void toTreeString(final Tree tree, final StringBuilder sb, final int indentLevel) { + final String nodeName = tree.getText(); + for (int i = 0; i < indentLevel; i++) { + sb.append(" "); + } + sb.append(nodeName); + sb.append("\n"); + + for (int i = 0; i < tree.getChildCount(); i++) { + final Tree child = tree.getChild(i); + toTreeString(child, sb, indentLevel + 2); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/QueryResult.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/QueryResult.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/QueryResult.java index b198bc7..033ac0a 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/QueryResult.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/QueryResult.java @@ -19,11 +19,12 @@ package org.apache.nifi.hl7.query; import java.util.List; public interface QueryResult { - boolean isMatch(); - - List<String> getLabels(); - - int getHitCount(); - - ResultHit nextHit(); + + boolean isMatch(); + + List<String> getLabels(); + + int getHitCount(); + + ResultHit nextHit(); } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/ResultHit.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/ResultHit.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/ResultHit.java index ee97e5d..9eb1d8f 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/ResultHit.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/ResultHit.java @@ -19,7 +19,8 @@ package org.apache.nifi.hl7.query; import java.util.Map; public interface ResultHit { - Object getValue(String label); - - Map<String, Object> getSelectedValues(); + + Object getValue(String label); + + Map<String, Object> getSelectedValues(); } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/Selection.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/Selection.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/Selection.java index 36a181f..7b5b7b3 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/Selection.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/Selection.java @@ -19,19 +19,20 @@ package org.apache.nifi.hl7.query; import org.apache.nifi.hl7.query.evaluator.Evaluator; public class Selection { - private final Evaluator<?> evaluator; - private final String name; - - public Selection(final Evaluator<?> evaluator, final String name) { - this.evaluator = evaluator; - this.name = name; - } - - public String getName() { - return name; - } - - public Evaluator<?> getEvaluator() { - return evaluator; - } + + private final Evaluator<?> evaluator; + private final String name; + + public Selection(final Evaluator<?> evaluator, final String name) { + this.evaluator = evaluator; + this.name = name; + } + + public String getName() { + return name; + } + + public Evaluator<?> getEvaluator() { + return evaluator; + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/BooleanEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/BooleanEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/BooleanEvaluator.java index fdd807e..98b077e 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/BooleanEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/BooleanEvaluator.java @@ -18,7 +18,7 @@ package org.apache.nifi.hl7.query.evaluator; public abstract class BooleanEvaluator implements Evaluator<Boolean> { - public Class<? extends Boolean> getType() { - return Boolean.class; - } + public Class<? extends Boolean> getType() { + return Boolean.class; + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/Evaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/Evaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/Evaluator.java index d86c30e..2d1ddc7 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/Evaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/Evaluator.java @@ -19,9 +19,10 @@ package org.apache.nifi.hl7.query.evaluator; import java.util.Map; public interface Evaluator<T> { - public static final String MESSAGE_KEY = "message"; - - T evaluate(Map<String, Object> objectMap); - - Class<? extends T> getType(); + + public static final String MESSAGE_KEY = "message"; + + T evaluate(Map<String, Object> objectMap); + + Class<? extends T> getType(); } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/IntegerEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/IntegerEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/IntegerEvaluator.java index 6afa9ed..ed56d80 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/IntegerEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/IntegerEvaluator.java @@ -16,11 +16,10 @@ */ package org.apache.nifi.hl7.query.evaluator; - public abstract class IntegerEvaluator implements Evaluator<Integer> { - public Class<? extends Integer> getType() { - return Integer.class; - } + public Class<? extends Integer> getType() { + return Integer.class; + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/StringEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/StringEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/StringEvaluator.java index 5f73649..53ab004 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/StringEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/StringEvaluator.java @@ -18,8 +18,8 @@ package org.apache.nifi.hl7.query.evaluator; public abstract class StringEvaluator implements Evaluator<String> { - public Class<? extends String> getType() { - return String.class; - } - + public Class<? extends String> getType() { + return String.class; + } + } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/AbstractComparisonEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/AbstractComparisonEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/AbstractComparisonEvaluator.java index a7fa1b7..45edf64 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/AbstractComparisonEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/AbstractComparisonEvaluator.java @@ -24,83 +24,88 @@ import org.apache.nifi.hl7.query.evaluator.BooleanEvaluator; import org.apache.nifi.hl7.query.evaluator.Evaluator; public abstract class AbstractComparisonEvaluator extends BooleanEvaluator { - private final Evaluator<?> lhs; - private final Evaluator<?> rhs; - - public AbstractComparisonEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { - this.lhs = lhs; - this.rhs = rhs; - } - - public final Boolean evaluate(final Map<String, Object> objectMap) { - final Object lhsValue = lhs.evaluate(objectMap); - if ( lhsValue == null ) { - return false; - } - - final Object rhsValue = rhs.evaluate(objectMap); - if ( rhsValue == null ) { - return false; - } - - return compareRaw(lhsValue, rhsValue); - } - - - private Boolean compareRaw(Object lhsValue, Object rhsValue) { - if ( lhsValue == null || rhsValue == null ) { - return false; - } - - if ( lhsValue instanceof HL7Field ) { - lhsValue = ((HL7Field) lhsValue).getValue(); - } - - if ( rhsValue instanceof HL7Field ) { - rhsValue = ((HL7Field) rhsValue).getValue(); - } - - if ( lhsValue == null || rhsValue == null ) { - return false; - } - - // both are collections, and compare(lhsValue, rhsValue) is false. - // this would be the case, for instance, if we compared field 1 of one segment to - // a field in another segment, and both fields had components. - if ( lhsValue instanceof Collection && rhsValue instanceof Collection ) { - return false; - } - - // if one side is a collection but the other is not, check if any element in that - // collection compares to the other element in a way that satisfies the condition. - // this would happen, for instance, if we check Segment1.Field5 = 'X' and field 5 repeats - // with a value "A~B~C~X~Y~Z"; in this case we do want to consider Field 5 = X as true. - if ( lhsValue instanceof Collection ) { - for ( final Object lhsObject : (Collection<?>) lhsValue ) { - if ( compareRaw(lhsObject, rhsValue) ) { - return true; - } - } - - return false; - } - - if ( rhsValue instanceof Collection ) { - for ( final Object rhsObject : (Collection<?>) rhsValue ) { - if ( compareRaw(rhsObject, lhsValue) ) { - return true; - } - } - - return false; - } - - if ( lhsValue != null && rhsValue != null && compare(lhsValue, rhsValue) ) { - return true; - } - - return false; - } - - protected abstract boolean compare(Object lhs, Object rhs); + + private final Evaluator<?> lhs; + private final Evaluator<?> rhs; + + public AbstractComparisonEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { + this.lhs = lhs; + this.rhs = rhs; + } + + @Override + public final Boolean evaluate(final Map<String, Object> objectMap) { + final Object lhsValue = lhs.evaluate(objectMap); + if (lhsValue == null) { + return false; + } + + final Object rhsValue = rhs.evaluate(objectMap); + if (rhsValue == null) { + return false; + } + + return compareRaw(lhsValue, rhsValue); + } + + private Boolean compareRaw(Object lhsValue, Object rhsValue) { + if (lhsValue == null || rhsValue == null) { + return false; + } + + if (lhsValue instanceof HL7Field) { + lhsValue = ((HL7Field) lhsValue).getValue(); + } + + if (rhsValue instanceof HL7Field) { + rhsValue = ((HL7Field) rhsValue).getValue(); + } + + if (lhsValue == null || rhsValue == null) { + return false; + } + + /** + * both are collections, and compare(lhsValue, rhsValue) is false. + * this would be the case, for instance, if we compared field 1 of one segment to + * a field in another segment, and both fields had components. + */ + if (lhsValue instanceof Collection && rhsValue instanceof Collection) { + return false; + } + + /** + * if one side is a collection but the other is not, check if any element in that + * collection compares to the other element in a way that satisfies the condition. + * this would happen, for instance, if we check Segment1.Field5 = 'X' and field 5 repeats + * with a value "A~B~C~X~Y~Z"; in this case we do want to consider Field 5 = X as true. + */ + if (lhsValue instanceof Collection) { + for (final Object lhsObject : (Collection<?>) lhsValue) { + if (compareRaw(lhsObject, rhsValue)) { + return true; + } + } + + return false; + } + + if (rhsValue instanceof Collection) { + for (final Object rhsObject : (Collection<?>) rhsValue) { + if (compareRaw(rhsObject, lhsValue)) { + return true; + } + } + + return false; + } + + if (lhsValue != null && rhsValue != null && compare(lhsValue, rhsValue)) { + return true; + } + + return false; + } + + protected abstract boolean compare(Object lhs, Object rhs); } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/AbstractNumericComparison.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/AbstractNumericComparison.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/AbstractNumericComparison.java index 2529c49..d74e9cf 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/AbstractNumericComparison.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/AbstractNumericComparison.java @@ -21,47 +21,48 @@ import java.util.regex.Pattern; import org.apache.nifi.hl7.query.evaluator.Evaluator; public abstract class AbstractNumericComparison extends AbstractComparisonEvaluator { - private static final Pattern NUMERIC_PATTERN = Pattern.compile("\\d+(\\.\\d+)?"); - - public AbstractNumericComparison(final Evaluator<?> lhs, final Evaluator<?> rhs) { - super(lhs, rhs); - } - - @Override - protected final boolean compare(final Object lhs, final Object rhs) { - final Double lhsDouble = toDouble(lhs); - if ( lhsDouble == null ) { - return false; - } - - final Double rhsDouble = toDouble(rhs); - if ( rhsDouble == null ) { - return false; - } - - return compareNumbers(lhsDouble, rhsDouble); - } - private Double toDouble(final Object value) { - if ( value == null ) { - return null; - } - - if ( value instanceof Double ) { - return (Double) value; - } - if ( value instanceof Number ) { - return ((Number) value).doubleValue(); - } - - if ( value instanceof String ) { - if ( NUMERIC_PATTERN.matcher((String) value).matches() ) { - return Double.parseDouble((String) value); - } - } - - return null; - } - - protected abstract boolean compareNumbers(final Double lhs, final Double rhs); + private static final Pattern NUMERIC_PATTERN = Pattern.compile("\\d+(\\.\\d+)?"); + + public AbstractNumericComparison(final Evaluator<?> lhs, final Evaluator<?> rhs) { + super(lhs, rhs); + } + + @Override + protected final boolean compare(final Object lhs, final Object rhs) { + final Double lhsDouble = toDouble(lhs); + if (lhsDouble == null) { + return false; + } + + final Double rhsDouble = toDouble(rhs); + if (rhsDouble == null) { + return false; + } + + return compareNumbers(lhsDouble, rhsDouble); + } + + private Double toDouble(final Object value) { + if (value == null) { + return null; + } + + if (value instanceof Double) { + return (Double) value; + } + if (value instanceof Number) { + return ((Number) value).doubleValue(); + } + + if (value instanceof String) { + if (NUMERIC_PATTERN.matcher((String) value).matches()) { + return Double.parseDouble((String) value); + } + } + + return null; + } + + protected abstract boolean compareNumbers(final Double lhs, final Double rhs); } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/EqualsEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/EqualsEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/EqualsEvaluator.java index 7ee2f87..fa6c57b 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/EqualsEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/EqualsEvaluator.java @@ -20,13 +20,13 @@ import org.apache.nifi.hl7.query.evaluator.Evaluator; public class EqualsEvaluator extends AbstractComparisonEvaluator { - public EqualsEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { - super(lhs, rhs); - } - - @Override - protected boolean compare(final Object lhs, final Object rhs) { - return lhs != null && rhs != null && ((lhs == rhs) || (lhs.equals(rhs)) || lhs.toString().equals(rhs.toString())); - } + public EqualsEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { + super(lhs, rhs); + } + + @Override + protected boolean compare(final Object lhs, final Object rhs) { + return lhs != null && rhs != null && ((lhs == rhs) || (lhs.equals(rhs)) || lhs.toString().equals(rhs.toString())); + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/GreaterThanEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/GreaterThanEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/GreaterThanEvaluator.java index bf8596e..cfef7b5 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/GreaterThanEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/GreaterThanEvaluator.java @@ -18,17 +18,15 @@ package org.apache.nifi.hl7.query.evaluator.comparison; import org.apache.nifi.hl7.query.evaluator.Evaluator; - public class GreaterThanEvaluator extends AbstractNumericComparison { - public GreaterThanEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { - super(lhs, rhs); - } + public GreaterThanEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { + super(lhs, rhs); + } - @Override - protected boolean compareNumbers(final Double lhs, final Double rhs) { - return lhs > rhs; - } + @Override + protected boolean compareNumbers(final Double lhs, final Double rhs) { + return lhs > rhs; + } - } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/GreaterThanOrEqualEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/GreaterThanOrEqualEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/GreaterThanOrEqualEvaluator.java index 69115a3..d9da6f7 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/GreaterThanOrEqualEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/GreaterThanOrEqualEvaluator.java @@ -18,17 +18,15 @@ package org.apache.nifi.hl7.query.evaluator.comparison; import org.apache.nifi.hl7.query.evaluator.Evaluator; - public class GreaterThanOrEqualEvaluator extends AbstractNumericComparison { - public GreaterThanOrEqualEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { - super(lhs, rhs); - } + public GreaterThanOrEqualEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { + super(lhs, rhs); + } - @Override - protected boolean compareNumbers(final Double lhs, final Double rhs) { - return lhs >= rhs; - } + @Override + protected boolean compareNumbers(final Double lhs, final Double rhs) { + return lhs >= rhs; + } - } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/IsNullEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/IsNullEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/IsNullEvaluator.java index 69d481e..0f16dd9 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/IsNullEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/IsNullEvaluator.java @@ -24,46 +24,47 @@ import org.apache.nifi.hl7.query.evaluator.BooleanEvaluator; import org.apache.nifi.hl7.query.evaluator.Evaluator; public class IsNullEvaluator extends BooleanEvaluator { - private final Evaluator<?> subjectEvaluator; - - public IsNullEvaluator(final Evaluator<?> subjectEvaluator) { - this.subjectEvaluator = subjectEvaluator; - } - - @Override - public Boolean evaluate(final Map<String, Object> objectMap) { - Object subjectValue = subjectEvaluator.evaluate(objectMap); - if ( subjectValue == null ) { - return true; - } - - return isNull(subjectValue); - } - private boolean isNull(Object subjectValue) { - if ( subjectValue == null ) { - return true; - } - - if ( subjectValue instanceof HL7Component ) { - subjectValue = ((HL7Component) subjectValue).getValue(); - } - - if ( subjectValue instanceof Collection ) { - final Collection<?> collection = (Collection<?>) subjectValue; - if ( collection.isEmpty() ) { - return true; - } - - for ( final Object obj : collection ) { - if ( !isNull(obj) ) { - return false; - } - } - - return true; - } - - return subjectValue == null; - } + private final Evaluator<?> subjectEvaluator; + + public IsNullEvaluator(final Evaluator<?> subjectEvaluator) { + this.subjectEvaluator = subjectEvaluator; + } + + @Override + public Boolean evaluate(final Map<String, Object> objectMap) { + Object subjectValue = subjectEvaluator.evaluate(objectMap); + if (subjectValue == null) { + return true; + } + + return isNull(subjectValue); + } + + private boolean isNull(Object subjectValue) { + if (subjectValue == null) { + return true; + } + + if (subjectValue instanceof HL7Component) { + subjectValue = ((HL7Component) subjectValue).getValue(); + } + + if (subjectValue instanceof Collection) { + final Collection<?> collection = (Collection<?>) subjectValue; + if (collection.isEmpty()) { + return true; + } + + for (final Object obj : collection) { + if (!isNull(obj)) { + return false; + } + } + + return true; + } + + return subjectValue == null; + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/LessThanEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/LessThanEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/LessThanEvaluator.java index 891d5e4..2805860 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/LessThanEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/LessThanEvaluator.java @@ -19,13 +19,14 @@ package org.apache.nifi.hl7.query.evaluator.comparison; import org.apache.nifi.hl7.query.evaluator.Evaluator; public class LessThanEvaluator extends AbstractNumericComparison { - public LessThanEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { - super(lhs, rhs); - } - @Override - protected boolean compareNumbers(final Double lhs, final Double rhs) { - return lhs < rhs; - } + public LessThanEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { + super(lhs, rhs); + } + + @Override + protected boolean compareNumbers(final Double lhs, final Double rhs) { + return lhs < rhs; + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/LessThanOrEqualEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/LessThanOrEqualEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/LessThanOrEqualEvaluator.java index c6fb097..e7eb156 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/LessThanOrEqualEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/LessThanOrEqualEvaluator.java @@ -19,13 +19,14 @@ package org.apache.nifi.hl7.query.evaluator.comparison; import org.apache.nifi.hl7.query.evaluator.Evaluator; public class LessThanOrEqualEvaluator extends AbstractNumericComparison { - public LessThanOrEqualEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { - super(lhs, rhs); - } - @Override - protected boolean compareNumbers(final Double lhs, final Double rhs) { - return lhs <= rhs; - } + public LessThanOrEqualEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { + super(lhs, rhs); + } + + @Override + protected boolean compareNumbers(final Double lhs, final Double rhs) { + return lhs <= rhs; + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotEqualsEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotEqualsEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotEqualsEvaluator.java index b7c1ce2..98715ff 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotEqualsEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotEqualsEvaluator.java @@ -19,14 +19,14 @@ package org.apache.nifi.hl7.query.evaluator.comparison; import org.apache.nifi.hl7.query.evaluator.Evaluator; public class NotEqualsEvaluator extends AbstractComparisonEvaluator { - - public NotEqualsEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { - super(lhs, rhs); - } - @Override - protected boolean compare(final Object lhs, final Object rhs) { - return lhs != null && rhs != null && lhs != rhs && !lhs.equals(rhs) && !lhs.toString().equals(rhs.toString()); - } + public NotEqualsEvaluator(final Evaluator<?> lhs, final Evaluator<?> rhs) { + super(lhs, rhs); + } + + @Override + protected boolean compare(final Object lhs, final Object rhs) { + return lhs != null && rhs != null && lhs != rhs && !lhs.equals(rhs) && !lhs.toString().equals(rhs.toString()); + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotEvaluator.java index 58888d9..3343c1c 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotEvaluator.java @@ -21,16 +21,17 @@ import java.util.Map; import org.apache.nifi.hl7.query.evaluator.BooleanEvaluator; public class NotEvaluator extends BooleanEvaluator { - private final BooleanEvaluator subjectEvaluator; - - public NotEvaluator(final BooleanEvaluator subjectEvaluator) { - this.subjectEvaluator = subjectEvaluator; - } - - @Override - public Boolean evaluate(final Map<String, Object> objectMap) { - final Boolean subjectValue = subjectEvaluator.evaluate(objectMap); - return (subjectValue == null || Boolean.TRUE.equals(subjectValue)); - } + + private final BooleanEvaluator subjectEvaluator; + + public NotEvaluator(final BooleanEvaluator subjectEvaluator) { + this.subjectEvaluator = subjectEvaluator; + } + + @Override + public Boolean evaluate(final Map<String, Object> objectMap) { + final Boolean subjectValue = subjectEvaluator.evaluate(objectMap); + return (subjectValue == null || Boolean.TRUE.equals(subjectValue)); + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotNullEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotNullEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotNullEvaluator.java index a764fef..80d6c45 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotNullEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/comparison/NotNullEvaluator.java @@ -24,42 +24,43 @@ import org.apache.nifi.hl7.query.evaluator.BooleanEvaluator; import org.apache.nifi.hl7.query.evaluator.Evaluator; public class NotNullEvaluator extends BooleanEvaluator { - private final Evaluator<?> subjectEvaluator; - - public NotNullEvaluator(final Evaluator<?> subjectEvaluator) { - this.subjectEvaluator = subjectEvaluator; - } - - @Override - public Boolean evaluate(final Map<String, Object> objectMap) { - Object subjectValue = subjectEvaluator.evaluate(objectMap); - if ( subjectValue == null ) { - return false; - } - - return isNotNull(subjectValue); - } - private boolean isNotNull(Object subjectValue) { - if ( subjectValue instanceof HL7Component ) { - subjectValue = ((HL7Component) subjectValue).getValue(); - } - - if ( subjectValue instanceof Collection ) { - final Collection<?> collection = (Collection<?>) subjectValue; - if ( collection.isEmpty() ) { - return false; - } - - for ( final Object obj : collection ) { - if ( isNotNull(obj) ) { - return true; - } - } - - return false; - } - - return subjectValue != null; - } + private final Evaluator<?> subjectEvaluator; + + public NotNullEvaluator(final Evaluator<?> subjectEvaluator) { + this.subjectEvaluator = subjectEvaluator; + } + + @Override + public Boolean evaluate(final Map<String, Object> objectMap) { + Object subjectValue = subjectEvaluator.evaluate(objectMap); + if (subjectValue == null) { + return false; + } + + return isNotNull(subjectValue); + } + + private boolean isNotNull(Object subjectValue) { + if (subjectValue instanceof HL7Component) { + subjectValue = ((HL7Component) subjectValue).getValue(); + } + + if (subjectValue instanceof Collection) { + final Collection<?> collection = (Collection<?>) subjectValue; + if (collection.isEmpty()) { + return false; + } + + for (final Object obj : collection) { + if (isNotNull(obj)) { + return true; + } + } + + return false; + } + + return subjectValue != null; + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/literal/IntegerLiteralEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/literal/IntegerLiteralEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/literal/IntegerLiteralEvaluator.java index c6ff6e4..dfceee4 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/literal/IntegerLiteralEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/literal/IntegerLiteralEvaluator.java @@ -21,16 +21,16 @@ import java.util.Map; import org.apache.nifi.hl7.query.evaluator.IntegerEvaluator; public class IntegerLiteralEvaluator extends IntegerEvaluator { - private final Integer value; - - public IntegerLiteralEvaluator(final Integer value) { - this.value = value; - } - - - @Override - public Integer evaluate(final Map<String, Object> objectMap) { - return value; - } + + private final Integer value; + + public IntegerLiteralEvaluator(final Integer value) { + this.value = value; + } + + @Override + public Integer evaluate(final Map<String, Object> objectMap) { + return value; + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/literal/StringLiteralEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/literal/StringLiteralEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/literal/StringLiteralEvaluator.java index 3b29611..278ac1d 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/literal/StringLiteralEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/literal/StringLiteralEvaluator.java @@ -21,15 +21,16 @@ import java.util.Map; import org.apache.nifi.hl7.query.evaluator.StringEvaluator; public class StringLiteralEvaluator extends StringEvaluator { - private final String value; - - public StringLiteralEvaluator(final String value) { - this.value = value; - } - - @Override - public String evaluate(final Map<String, Object> objectMap) { - return value; - } + + private final String value; + + public StringLiteralEvaluator(final String value) { + this.value = value; + } + + @Override + public String evaluate(final Map<String, Object> objectMap) { + return value; + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/logic/AndEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/logic/AndEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/logic/AndEvaluator.java index 21f596e..989cee4 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/logic/AndEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/logic/AndEvaluator.java @@ -21,23 +21,24 @@ import java.util.Map; import org.apache.nifi.hl7.query.evaluator.BooleanEvaluator; public class AndEvaluator extends BooleanEvaluator { - private final BooleanEvaluator lhs; - private final BooleanEvaluator rhs; - - public AndEvaluator(final BooleanEvaluator lhs, final BooleanEvaluator rhs) { - this.lhs = lhs; - this.rhs = rhs; - } - - @Override - public Boolean evaluate(final Map<String, Object> objectMap) { - final Boolean lhsValue = lhs.evaluate(objectMap); - if ( lhsValue == null || Boolean.FALSE.equals(lhsValue) ) { - return false; - } - - final Boolean rhsValue = rhs.evaluate(objectMap); - return (rhsValue != null && Boolean.TRUE.equals(rhsValue)); - } + + private final BooleanEvaluator lhs; + private final BooleanEvaluator rhs; + + public AndEvaluator(final BooleanEvaluator lhs, final BooleanEvaluator rhs) { + this.lhs = lhs; + this.rhs = rhs; + } + + @Override + public Boolean evaluate(final Map<String, Object> objectMap) { + final Boolean lhsValue = lhs.evaluate(objectMap); + if (lhsValue == null || Boolean.FALSE.equals(lhsValue)) { + return false; + } + + final Boolean rhsValue = rhs.evaluate(objectMap); + return (rhsValue != null && Boolean.TRUE.equals(rhsValue)); + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/logic/OrEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/logic/OrEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/logic/OrEvaluator.java index d090946..e86daad 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/logic/OrEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/logic/OrEvaluator.java @@ -21,23 +21,24 @@ import java.util.Map; import org.apache.nifi.hl7.query.evaluator.BooleanEvaluator; public class OrEvaluator extends BooleanEvaluator { - private final BooleanEvaluator lhs; - private final BooleanEvaluator rhs; - - public OrEvaluator(final BooleanEvaluator lhs, final BooleanEvaluator rhs) { - this.lhs = lhs; - this.rhs = rhs; - } - - @Override - public Boolean evaluate(final Map<String, Object> objectMap) { - final Boolean lhsValue = lhs.evaluate(objectMap); - if ( lhsValue != null && Boolean.TRUE.equals(lhsValue) ) { - return true; - } - - final Boolean rhsValue = rhs.evaluate(objectMap); - return (rhsValue != null && Boolean.TRUE.equals(rhsValue)); - } + + private final BooleanEvaluator lhs; + private final BooleanEvaluator rhs; + + public OrEvaluator(final BooleanEvaluator lhs, final BooleanEvaluator rhs) { + this.lhs = lhs; + this.rhs = rhs; + } + + @Override + public Boolean evaluate(final Map<String, Object> objectMap) { + final Boolean lhsValue = lhs.evaluate(objectMap); + if (lhsValue != null && Boolean.TRUE.equals(lhsValue)) { + return true; + } + + final Boolean rhsValue = rhs.evaluate(objectMap); + return (rhsValue != null && Boolean.TRUE.equals(rhsValue)); + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/message/DeclaredReferenceEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/message/DeclaredReferenceEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/message/DeclaredReferenceEvaluator.java index 6afb8d7..bb3f203 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/message/DeclaredReferenceEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/message/DeclaredReferenceEvaluator.java @@ -22,21 +22,22 @@ import org.apache.nifi.hl7.query.evaluator.Evaluator; import org.apache.nifi.hl7.query.evaluator.StringEvaluator; public class DeclaredReferenceEvaluator implements Evaluator<Object> { - private final StringEvaluator referenceNameEvaluator; - - public DeclaredReferenceEvaluator(final StringEvaluator referenceNameEvaluator) { - this.referenceNameEvaluator = referenceNameEvaluator; - } - - @Override - public Object evaluate(final Map<String, Object> objectMap) { - final String referenceName = referenceNameEvaluator.evaluate(objectMap); - return objectMap.get(referenceName); - } - - @Override - public Class<? extends Object> getType() { - return Object.class; - } + + private final StringEvaluator referenceNameEvaluator; + + public DeclaredReferenceEvaluator(final StringEvaluator referenceNameEvaluator) { + this.referenceNameEvaluator = referenceNameEvaluator; + } + + @Override + public Object evaluate(final Map<String, Object> objectMap) { + final String referenceName = referenceNameEvaluator.evaluate(objectMap); + return objectMap.get(referenceName); + } + + @Override + public Class<? extends Object> getType() { + return Object.class; + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/9faaef8c/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/message/DotEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/message/DotEvaluator.java b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/message/DotEvaluator.java index c5fbf41..238b540 100644 --- a/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/message/DotEvaluator.java +++ b/nifi/nifi-commons/nifi-hl7-query-language/src/main/java/org/apache/nifi/hl7/query/evaluator/message/DotEvaluator.java @@ -28,61 +28,62 @@ import org.apache.nifi.hl7.query.evaluator.Evaluator; import org.apache.nifi.hl7.query.evaluator.IntegerEvaluator; public class DotEvaluator implements Evaluator<Object> { - private final Evaluator<?> lhs; - private final IntegerEvaluator rhs; - - public DotEvaluator(final Evaluator<?> lhs, final IntegerEvaluator rhs) { - this.lhs = lhs; - this.rhs = rhs; - } - - @Override - public Object evaluate(final Map<String, Object> objectMap) { - final Object lhsValue = this.lhs.evaluate(objectMap); - final Integer rhsValue = this.rhs.evaluate(objectMap); - - if ( lhsValue == null || rhsValue == null ) { - return null; - } - - final List<Object> results = new ArrayList<>(); - if ( lhsValue instanceof Collection ) { - final Collection<?> lhsCollection = (Collection<?>) lhsValue; - for ( final Object obj : lhsCollection ) { - final Object val = getValue(obj, rhsValue); - results.add(val); - } - } else { - final Object val = getValue(lhsValue, rhsValue); - return val; - } - - return results; - } - - private Object getValue(final Object lhsValue, final int rhsValue) { - final List<?> list; - if ( lhsValue instanceof HL7Message ) { - list = ((HL7Message) lhsValue).getSegments(); - } else if ( lhsValue instanceof HL7Segment ) { - list = ((HL7Segment) lhsValue).getFields(); - } else if ( lhsValue instanceof HL7Component ) { - list = ((HL7Component) lhsValue).getComponents(); - } else { - return null; - } - - if ( rhsValue > list.size() ) { - return null; - } - - // convert from 0-based to 1-based - return list.get(rhsValue - 1); - } - @Override - public Class<? extends Object> getType() { - return Object.class; - } + private final Evaluator<?> lhs; + private final IntegerEvaluator rhs; + + public DotEvaluator(final Evaluator<?> lhs, final IntegerEvaluator rhs) { + this.lhs = lhs; + this.rhs = rhs; + } + + @Override + public Object evaluate(final Map<String, Object> objectMap) { + final Object lhsValue = this.lhs.evaluate(objectMap); + final Integer rhsValue = this.rhs.evaluate(objectMap); + + if (lhsValue == null || rhsValue == null) { + return null; + } + + final List<Object> results = new ArrayList<>(); + if (lhsValue instanceof Collection) { + final Collection<?> lhsCollection = (Collection<?>) lhsValue; + for (final Object obj : lhsCollection) { + final Object val = getValue(obj, rhsValue); + results.add(val); + } + } else { + final Object val = getValue(lhsValue, rhsValue); + return val; + } + + return results; + } + + private Object getValue(final Object lhsValue, final int rhsValue) { + final List<?> list; + if (lhsValue instanceof HL7Message) { + list = ((HL7Message) lhsValue).getSegments(); + } else if (lhsValue instanceof HL7Segment) { + list = ((HL7Segment) lhsValue).getFields(); + } else if (lhsValue instanceof HL7Component) { + list = ((HL7Component) lhsValue).getComponents(); + } else { + return null; + } + + if (rhsValue > list.size()) { + return null; + } + + // convert from 0-based to 1-based + return list.get(rhsValue - 1); + } + + @Override + public Class<? extends Object> getType() { + return Object.class; + } }
