From d2d6ae71cfb98516979b14879e6a6a05f6218317 Mon Sep 17 00:00:00 2001
From: nilslambertz <62618726+nilslambertz@users.noreply.github.com>
Date: Sat, 11 Apr 2026 22:09:43 +0200
Subject: [PATCH 1/4] Reference operators and expression parser
---
lang/expression-parser/model/pom.xml | 31 +++
.../expression_parser/model/FeatureCall.java | 49 ++++
.../model/FeatureInformation.java | 10 +
.../expression_parser/model/FindAny.java | 27 +++
.../expression_parser/model/FlatMap.java | 37 +++
.../neojoin/expression_parser/model/Map.java | 37 +++
.../model/MemberFeatureCall.java | 38 +++
.../model/ReferenceFilter.java | 49 ++++
.../model/ReferenceOperator.java | 25 ++
.../ComparisonOperator.java | 17 ++
.../predicate_expression/ConstantValue.java | 29 +++
lang/expression-parser/parser/pom.xml | 42 ++++
...supportedReferenceExpressionException.java | 18 ++
.../strategy/PatternMatchingStrategy.java | 12 +
.../ManualPatternMatchingStrategy.java | 43 ++++
.../parsers/CollectReferencesParser.java | 38 +++
.../parsers/FeatureCallParser.java | 31 +++
.../parsers/FilterParser.java | 64 +++++
.../parsers/FindAnyParser.java | 55 +++++
.../parsers/FlatMapParser.java | 116 +++++++++
.../parsers/MapParser.java | 108 +++++++++
.../parsers/MemberFeatureCallParser.java | 99 ++++++++
.../parsers/ReferenceOperatorParser.java | 51 ++++
.../utils/BlockExpressionUtils.java | 35 +++
.../utils/CastingUtils.java | 69 ++++++
.../utils/JvmMemberCallUtils.java | 28 +++
.../utils/JvmTypeReferenceUtils.java | 29 +++
.../utils/PredicateExpressionUtils.java | 103 ++++++++
.../fixtures/JvmFieldFixtures.java | 10 +
.../fixtures/JvmFormalParameterFixtures.java | 17 ++
.../fixtures/JvmOperationFixtures.java | 10 +
.../fixtures/JvmTypeFixtures.java | 14 ++
.../fixtures/JvmTypeReferenceFixtures.java | 19 ++
.../fixtures/XBinaryOperationFixtures.java | 21 ++
.../fixtures/XBlockExpressionFixtures.java | 10 +
.../fixtures/XClosureFixtures.java | 10 +
.../fixtures/XFeatureCallFixtures.java | 32 +++
.../fixtures/XMemberFeatureCallFixtures.java | 119 +++++++++
.../fixtures/XNumberLiteralFixtures.java | 16 ++
.../parsers/CollectReferencesParserTest.java | 51 ++++
.../parsers/ExpressionParserTest.java | 90 +++++++
.../parsers/FeatureCallParserTest.java | 74 ++++++
.../parsers/FilterParserTest.java | 63 +++++
.../parsers/FindAnyParserTest.java | 87 +++++++
.../parsers/FlatMapParserTest.java | 145 +++++++++++
.../parsers/MapParserTest.java | 226 ++++++++++++++++++
.../parsers/MemberFeatureCallParserTest.java | 136 +++++++++++
lang/expression-parser/pom.xml | 22 ++
48 files changed, 2462 insertions(+)
create mode 100644 lang/expression-parser/model/pom.xml
create mode 100644 lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FeatureCall.java
create mode 100644 lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FeatureInformation.java
create mode 100644 lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FindAny.java
create mode 100644 lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FlatMap.java
create mode 100644 lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/Map.java
create mode 100644 lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/MemberFeatureCall.java
create mode 100644 lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/ReferenceFilter.java
create mode 100644 lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/ReferenceOperator.java
create mode 100644 lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ComparisonOperator.java
create mode 100644 lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ConstantValue.java
create mode 100644 lang/expression-parser/parser/pom.xml
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/exception/UnsupportedReferenceExpressionException.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/PatternMatchingStrategy.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/ManualPatternMatchingStrategy.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/CollectReferencesParser.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/FeatureCallParser.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/FilterParser.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/FindAnyParser.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/FlatMapParser.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/MapParser.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/MemberFeatureCallParser.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/ReferenceOperatorParser.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/utils/BlockExpressionUtils.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/utils/CastingUtils.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/utils/JvmMemberCallUtils.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/utils/JvmTypeReferenceUtils.java
create mode 100644 lang/expression-parser/parser/src/main/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/utils/PredicateExpressionUtils.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/fixtures/JvmFieldFixtures.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/fixtures/JvmFormalParameterFixtures.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/fixtures/JvmOperationFixtures.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/fixtures/JvmTypeFixtures.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/fixtures/JvmTypeReferenceFixtures.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/fixtures/XBinaryOperationFixtures.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/fixtures/XBlockExpressionFixtures.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/fixtures/XClosureFixtures.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/fixtures/XFeatureCallFixtures.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/fixtures/XMemberFeatureCallFixtures.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/fixtures/XNumberLiteralFixtures.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/CollectReferencesParserTest.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/ExpressionParserTest.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/FeatureCallParserTest.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/FilterParserTest.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/FindAnyParserTest.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/FlatMapParserTest.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/MapParserTest.java
create mode 100644 lang/expression-parser/parser/src/test/java/tools/vitruv/neojoin/expression_parser/parser/strategy/manual_pattern_matching/parsers/MemberFeatureCallParserTest.java
create mode 100644 lang/expression-parser/pom.xml
diff --git a/lang/expression-parser/model/pom.xml b/lang/expression-parser/model/pom.xml
new file mode 100644
index 00000000..d17840fe
--- /dev/null
+++ b/lang/expression-parser/model/pom.xml
@@ -0,0 +1,31 @@
+
+
An example expression may look like + * + *
+ * {@code someResult = car.axis.flatMap(a -> a.wheels).toList()}
+ *
+ *
+ * Here, {@code car} is a FeatureCall
+ *
+ * A FeatureCall is also the first operation in a nested expression: + * + *
+ * {@code someResult = car.axis.flatMap(oneAxis -> oneAxis.wheels).toList()}
+ *
+ *
+ * Here, {@code oneAxis} is also a FeatureCall
+ */
+@Data
+@RequiredArgsConstructor
+public class FeatureCall implements ReferenceOperator {
+ @Nullable final String identifier;
+ @Nullable final String simpleName;
+
+ @Nullable ReferenceOperator followingOperator;
+
+ public static FeatureCall empty() {
+ return new FeatureCall(null, null);
+ }
+
+ @Override
+ public String toString() {
+ final String stringRepresentation = "FeatureCall(" + simpleName + ")";
+ if (followingOperator == null) {
+ return stringRepresentation;
+ }
+
+ return stringRepresentation + "->" + followingOperator;
+ }
+}
diff --git a/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FeatureInformation.java b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FeatureInformation.java
new file mode 100644
index 00000000..ca0f1554
--- /dev/null
+++ b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FeatureInformation.java
@@ -0,0 +1,10 @@
+package tools.vitruv.neojoin.expression_parser.model;
+
+import lombok.Value;
+
+@Value
+public class FeatureInformation {
+ String featureName;
+ String featureClassSimpleName;
+ String featureClassIdentifier;
+}
diff --git a/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FindAny.java b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FindAny.java
new file mode 100644
index 00000000..c0c8a92f
--- /dev/null
+++ b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FindAny.java
@@ -0,0 +1,27 @@
+package tools.vitruv.neojoin.expression_parser.model;
+
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+
+import org.jspecify.annotations.Nullable;
+
+/**
+ * FindAny selects any element from a collection of elements. There are no guarantees which element
+ * will be selected
+ *
+ * Example expressions may look like + * + *
+ * {@code
+ * someResult = car.axis.findFirst()
+ * someResult = car.axis.findLast()
+ * }
+ *
+ *
+ * Here, {@code X.findFirst()} and {@code X.findLast()} are FindAny operations
+ */
+@Data
+@RequiredArgsConstructor
+public class FindAny implements ReferenceOperator {
+ @Nullable ReferenceOperator followingOperator;
+}
diff --git a/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FlatMap.java b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FlatMap.java
new file mode 100644
index 00000000..2eab98f0
--- /dev/null
+++ b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/FlatMap.java
@@ -0,0 +1,37 @@
+package tools.vitruv.neojoin.expression_parser.model;
+
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
+/**
+ * A FlatMap represents mapping a parent object to some children along a one-to-many
+ * reference. It contains information about the reference and the child type
+ *
+ * An example expression may look like + * + *
+ * {@code someResult = car.axis.flatMap(a -> a.wheels).toList()}
+ *
+ *
+ * Here, {@code X.flatMap(a -> a.wheels)} is a FlatMap
+ */
+@Data
+@RequiredArgsConstructor
+public class FlatMap implements ReferenceOperator {
+ @NonNull final FeatureInformation featureInformation;
+
+ @Nullable ReferenceOperator followingOperator;
+
+ @Override
+ public String toString() {
+ final String stringRepresentation = "FlatMap(" + featureInformation.getFeatureName() + ")";
+ if (followingOperator == null) {
+ return stringRepresentation;
+ }
+
+ return stringRepresentation + "->" + followingOperator;
+ }
+}
diff --git a/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/Map.java b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/Map.java
new file mode 100644
index 00000000..69e8362c
--- /dev/null
+++ b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/Map.java
@@ -0,0 +1,37 @@
+package tools.vitruv.neojoin.expression_parser.model;
+
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
+/**
+ * A Map represents mapping a parent object to some child along a one-to-one reference. It
+ * contains information about the reference and the child type
+ *
+ * An example expression may look like + * + *
+ * {@code someResult = car.axis.map(a -> a.axisInformation).toList()}
+ *
+ *
+ * Here, {@code X.map(a -> a.axisInformation)} is a Map
+ */
+@Data
+@RequiredArgsConstructor
+public class Map implements ReferenceOperator {
+ @NonNull final FeatureInformation featureInformation;
+
+ @Nullable ReferenceOperator followingOperator;
+
+ @Override
+ public String toString() {
+ final String stringRepresentation = "Map(" + featureInformation.getFeatureName() + ")";
+ if (followingOperator == null) {
+ return stringRepresentation;
+ }
+
+ return stringRepresentation + "->" + followingOperator;
+ }
+}
diff --git a/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/MemberFeatureCall.java b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/MemberFeatureCall.java
new file mode 100644
index 00000000..512ddc4d
--- /dev/null
+++ b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/MemberFeatureCall.java
@@ -0,0 +1,38 @@
+package tools.vitruv.neojoin.expression_parser.model;
+
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
+/**
+ * A MemberFeatureCall represents a field/reference access of a parent class. It contains
+ * information about the type and reference name. The reference can have an upper and/or lower bound
+ *
+ * An example expression may look like + * + *
+ * {@code someResult = car.axis.flatMap(a -> a.wheels).toList()}
+ *
+ *
+ * Here, {@code X.axis} is a MemberFeatureCall
+ */
+@Data
+@RequiredArgsConstructor
+public class MemberFeatureCall implements ReferenceOperator {
+ @NonNull final FeatureInformation featureInformation;
+ final boolean isCollection;
+
+ @Nullable ReferenceOperator followingOperator;
+
+ @Override
+ public String toString() {
+ final String stringRepresentation = "MemberFeatureCall(" + featureInformation.getFeatureName() + ")";
+ if (followingOperator == null) {
+ return stringRepresentation;
+ }
+
+ return stringRepresentation + "->" + followingOperator;
+ }
+}
diff --git a/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/ReferenceFilter.java b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/ReferenceFilter.java
new file mode 100644
index 00000000..8f6e16ae
--- /dev/null
+++ b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/ReferenceFilter.java
@@ -0,0 +1,49 @@
+package tools.vitruv.neojoin.expression_parser.model;
+
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
+import tools.vitruv.neojoin.expression_parser.model.predicate_expression.ComparisonOperator;
+import tools.vitruv.neojoin.expression_parser.model.predicate_expression.ConstantValue;
+
+/**
+ * A ReferenceFilter represents a predicate for the previous ReferenceOperator. Only predicates that
+ * compare a feature to some constant value are supported
+ *
+ * An example expression may look like + * + *
+ * {@code someResult = car.axis.filter(a -> a.position == "front").toList()}
+ *
+ *
+ * Here, {@code X.filter(a -> a.position == "front")} is a ReferenceFilter
+ */
+@Data
+@RequiredArgsConstructor
+public class ReferenceFilter implements ReferenceOperator {
+ @NonNull final String feature;
+ @NonNull final ComparisonOperator operator;
+ @NonNull final ConstantValue constantValue;
+
+ @Nullable ReferenceOperator followingOperator;
+
+ @Override
+ public String toString() {
+ final String stringRepresentation =
+ "ReferenceFilter("
+ + feature
+ + " "
+ + operator.getRepresentation()
+ + " "
+ + constantValue
+ + ")";
+ if (followingOperator == null) {
+ return stringRepresentation;
+ }
+
+ return stringRepresentation + "->" + followingOperator;
+ }
+}
diff --git a/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/ReferenceOperator.java b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/ReferenceOperator.java
new file mode 100644
index 00000000..80a4d22c
--- /dev/null
+++ b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/ReferenceOperator.java
@@ -0,0 +1,25 @@
+package tools.vitruv.neojoin.expression_parser.model;
+
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
+/**
+ * A ReferenceOperator is a (partial) parsed expression that can be used for model transformations.
+ * It contains the required properties (e.g. type, field names) for the following steps and possibly
+ * the following ReferenceOperator-chain
+ */
+public interface ReferenceOperator {
+ @Nullable ReferenceOperator getFollowingOperator();
+
+ void setFollowingOperator(ReferenceOperator followingOperator);
+
+ /** Returns the last ReferenceOperator in this chain */
+ @NonNull
+ default ReferenceOperator getLastOperatorInChain() {
+ ReferenceOperator lastOperator = this;
+ while (lastOperator.getFollowingOperator() != null) {
+ lastOperator = lastOperator.getFollowingOperator();
+ }
+ return lastOperator;
+ }
+}
diff --git a/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ComparisonOperator.java b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ComparisonOperator.java
new file mode 100644
index 00000000..4941cf47
--- /dev/null
+++ b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ComparisonOperator.java
@@ -0,0 +1,17 @@
+package tools.vitruv.neojoin.expression_parser.model.predicate_expression;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor
+public enum ComparisonOperator {
+ Equals("=="),
+ NotEquals("!="),
+ LessThan("<"),
+ LessEquals("<="),
+ GreaterThan(">"),
+ GreaterEquals(">=");
+
+ final String representation;
+}
diff --git a/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ConstantValue.java b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ConstantValue.java
new file mode 100644
index 00000000..e316ba4e
--- /dev/null
+++ b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ConstantValue.java
@@ -0,0 +1,29 @@
+package tools.vitruv.neojoin.expression_parser.model.predicate_expression;
+
+import lombok.Value;
+
+@Value
+public class ConstantValue {
+ String value;
+ boolean isString;
+
+ public static ConstantValue String(String value) {
+ return new ConstantValue(value, true);
+ }
+
+ public static ConstantValue Boolean(boolean isTrue) {
+ return ConstantValue.of(isTrue ? "true" : "false");
+ }
+
+ public static ConstantValue of(String value) {
+ return new ConstantValue(value, false);
+ }
+
+ @Override
+ public String toString() {
+ if (isString) {
+ return "\"" + value + "\"";
+ }
+ return value;
+ }
+}
diff --git a/lang/expression-parser/parser/pom.xml b/lang/expression-parser/parser/pom.xml
new file mode 100644
index 00000000..58f62472
--- /dev/null
+++ b/lang/expression-parser/parser/pom.xml
@@ -0,0 +1,42 @@
+
+An example expression may look like
*
diff --git a/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ConstantValue.java b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ConstantValue.java
index e316ba4e..16d145b0 100644
--- a/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ConstantValue.java
+++ b/lang/expression-parser/model/src/main/java/tools/vitruv/neojoin/expression_parser/model/predicate_expression/ConstantValue.java
@@ -12,7 +12,7 @@ public static ConstantValue String(String value) {
}
public static ConstantValue Boolean(boolean isTrue) {
- return ConstantValue.of(isTrue ? "true" : "false");
+ return ConstantValue.of(Boolean.toString(isTrue));
}
public static ConstantValue of(String value) {
diff --git a/lang/pom.xml b/lang/pom.xml
index 3c1956c4..82eb5fc0 100644
--- a/lang/pom.xml
+++ b/lang/pom.xml
@@ -48,6 +48,7 @@