diff --git a/CHANGELOG.md b/CHANGELOG.md
index e990ab1ac..bce6a04a6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,11 @@
Note: version releases in the 0.x.y range may introduce breaking changes.
+## [2.1.0]
+ ### Added
+- Added json Serialisation for the AQL-DTO model ([#496](https://github.com/ehrbase/openEHR_SDK/pull/496))
+ ### Fixed
+
## [2.0.0]
### Added
@@ -323,3 +328,4 @@ Note: version releases in the 0.x.y range may introduce breaking changes.
[1.29.0]: https://github.com/ehrbase/openEHR_SDK/compare/v1.28.0...v1.29.0
[2.0.0]: https://github.com/ehrbase/openEHR_SDK/compare/v1.29.0...v2.0.0
+[2.1.0]: https://github.com/ehrbase/openEHR_SDK/compare/v2.0.0...v2.1.0
diff --git a/aql/pom.xml b/aql/pom.xml
index 951809208..e751bfd00 100644
--- a/aql/pom.xml
+++ b/aql/pom.xml
@@ -25,7 +25,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
aql
diff --git a/aql/src/main/antlr4/org/ehrbase/openehr/sdk/aql/parser/antlr/AqlParser.g4 b/aql/src/main/antlr4/org/ehrbase/openehr/sdk/aql/parser/antlr/AqlParser.g4
index 685ced56d..dfe72899c 100644
--- a/aql/src/main/antlr4/org/ehrbase/openehr/sdk/aql/parser/antlr/AqlParser.g4
+++ b/aql/src/main/antlr4/org/ehrbase/openehr/sdk/aql/parser/antlr/AqlParser.g4
@@ -66,7 +66,8 @@ selectExpr
;
fromExpr
- : containsExpr
+ : classExprOperand (NOT? CONTAINS containsExpr)?
+ | SYM_LEFT_PAREN fromExpr SYM_RIGHT_PAREN
;
whereExpr
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/ComparisonOperatorCondition.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/ComparisonOperatorCondition.java
index 55e2e431f..f6a34f8d2 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/ComparisonOperatorCondition.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/ComparisonOperatorCondition.java
@@ -17,6 +17,7 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.condition;
+import java.util.Objects;
import org.ehrbase.openehr.sdk.aql.dto.operand.ComparisonLeftOperand;
import org.ehrbase.openehr.sdk.aql.dto.operand.Operand;
@@ -50,46 +51,24 @@ public void setValue(Operand value) {
this.value = value;
}
- public boolean equals(final Object o) {
- if (o == this) return true;
- if (!(o instanceof ComparisonOperatorCondition)) return false;
- final ComparisonOperatorCondition other = (ComparisonOperatorCondition) o;
- if (!other.canEqual((Object) this)) return false;
- final Object this$statement = this.getStatement();
- final Object other$statement = other.getStatement();
- if (this$statement == null ? other$statement != null : !this$statement.equals(other$statement)) return false;
- final Object this$symbol = this.getSymbol();
- final Object other$symbol = other.getSymbol();
- if (this$symbol == null ? other$symbol != null : !this$symbol.equals(other$symbol)) return false;
- final Object this$value = this.getValue();
- final Object other$value = other.getValue();
- if (this$value == null ? other$value != null : !this$value.equals(other$value)) return false;
- return true;
- }
-
- protected boolean canEqual(final Object other) {
- return other instanceof ComparisonOperatorCondition;
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ComparisonOperatorCondition that = (ComparisonOperatorCondition) o;
+ return Objects.equals(statement, that.statement) && symbol == that.symbol && Objects.equals(value, that.value);
}
+ @Override
public int hashCode() {
- final int PRIME = 59;
- int result = 1;
- final Object $statement = this.getStatement();
- result = result * PRIME + ($statement == null ? 43 : $statement.hashCode());
- final Object $symbol = this.getSymbol();
- result = result * PRIME + ($symbol == null ? 43 : $symbol.hashCode());
- final Object $value = this.getValue();
- result = result * PRIME + ($value == null ? 43 : $value.hashCode());
- return result;
+ return Objects.hash(statement, symbol, value);
}
+ @Override
public String toString() {
- return "ComparisonOperatorCondition(statement="
- + this.getStatement()
- + ", symbol="
- + this.getSymbol()
- + ", value="
- + this.getValue()
- + ")";
+ return "ComparisonOperatorCondition{" + "statement="
+ + statement + ", symbol="
+ + symbol + ", value="
+ + value + '}';
}
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/ExistsCondition.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/ExistsCondition.java
index b26042eec..c730f269e 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/ExistsCondition.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/ExistsCondition.java
@@ -41,19 +41,10 @@ public void setValue(IdentifiedPath value) {
this.value = value;
}
- @Override
- public String toString() {
- return "ExistsCondition{" + "value=" + value + '}';
- }
-
@Override
public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
ExistsCondition that = (ExistsCondition) o;
return Objects.equals(value, that.value);
}
@@ -62,4 +53,9 @@ public boolean equals(Object o) {
public int hashCode() {
return Objects.hash(value);
}
+
+ @Override
+ public String toString() {
+ return "ExistsCondition{" + "value=" + value + '}';
+ }
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/LikeCondition.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/LikeCondition.java
index 540a65cde..f7d8179fb 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/LikeCondition.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/LikeCondition.java
@@ -17,6 +17,7 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.condition;
+import java.util.Objects;
import org.ehrbase.openehr.sdk.aql.dto.operand.IdentifiedPath;
import org.ehrbase.openehr.sdk.aql.dto.operand.LikeOperand;
@@ -42,35 +43,21 @@ public void setValue(LikeOperand value) {
this.value = value;
}
- public boolean equals(final Object o) {
- if (o == this) return true;
- if (!(o instanceof LikeCondition)) return false;
- final LikeCondition other = (LikeCondition) o;
- if (!other.canEqual((Object) this)) return false;
- final Object this$statement = this.getStatement();
- final Object other$statement = other.getStatement();
- if (this$statement == null ? other$statement != null : !this$statement.equals(other$statement)) return false;
- final Object this$value = this.getValue();
- final Object other$value = other.getValue();
- if (this$value == null ? other$value != null : !this$value.equals(other$value)) return false;
- return true;
- }
-
- protected boolean canEqual(final Object other) {
- return other instanceof LikeCondition;
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ LikeCondition that = (LikeCondition) o;
+ return Objects.equals(statement, that.statement) && Objects.equals(value, that.value);
}
+ @Override
public int hashCode() {
- final int PRIME = 59;
- int result = 1;
- final Object $statement = this.getStatement();
- result = result * PRIME + ($statement == null ? 43 : $statement.hashCode());
- final Object $value = this.getValue();
- result = result * PRIME + ($value == null ? 43 : $value.hashCode());
- return result;
+ return Objects.hash(statement, value);
}
+ @Override
public String toString() {
- return "LikeCondition(statement=" + this.getStatement() + ", value=" + this.getValue() + ")";
+ return "LikeCondition{" + "statement=" + statement + ", value=" + value + '}';
}
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/LogicalOperatorCondition.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/LogicalOperatorCondition.java
index 95971f6ef..57e92eb9a 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/LogicalOperatorCondition.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/LogicalOperatorCondition.java
@@ -18,6 +18,7 @@
package org.ehrbase.openehr.sdk.aql.dto.condition;
import java.util.List;
+import java.util.Objects;
import org.ehrbase.openehr.sdk.aql.dto.LogicalOperator;
import org.ehrbase.openehr.sdk.aql.dto.condition.LogicalOperatorCondition.ConditionLogicalOperatorSymbol;
@@ -45,36 +46,22 @@ public void setValues(List values) {
this.values = values;
}
- public boolean equals(final Object o) {
- if (o == this) return true;
- if (!(o instanceof LogicalOperatorCondition)) return false;
- final LogicalOperatorCondition other = (LogicalOperatorCondition) o;
- if (!other.canEqual((Object) this)) return false;
- final Object this$symbol = this.getSymbol();
- final Object other$symbol = other.getSymbol();
- if (this$symbol == null ? other$symbol != null : !this$symbol.equals(other$symbol)) return false;
- final Object this$values = this.getValues();
- final Object other$values = other.getValues();
- if (this$values == null ? other$values != null : !this$values.equals(other$values)) return false;
- return true;
- }
-
- protected boolean canEqual(final Object other) {
- return other instanceof LogicalOperatorCondition;
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ LogicalOperatorCondition that = (LogicalOperatorCondition) o;
+ return symbol == that.symbol && Objects.equals(values, that.values);
}
+ @Override
public int hashCode() {
- final int PRIME = 59;
- int result = 1;
- final Object $symbol = this.getSymbol();
- result = result * PRIME + ($symbol == null ? 43 : $symbol.hashCode());
- final Object $values = this.getValues();
- result = result * PRIME + ($values == null ? 43 : $values.hashCode());
- return result;
+ return Objects.hash(symbol, values);
}
+ @Override
public String toString() {
- return "LogicalOperatorCondition(symbol=" + this.getSymbol() + ", values=" + this.getValues() + ")";
+ return "LogicalOperatorCondition{" + "symbol=" + symbol + ", values=" + values + '}';
}
public enum ConditionLogicalOperatorSymbol {
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/NotCondition.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/NotCondition.java
index 3baf0987b..fbd07ed41 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/NotCondition.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/NotCondition.java
@@ -40,19 +40,10 @@ public void setConditionDto(WhereCondition condition) {
this.condition = condition;
}
- @Override
- public String toString() {
- return "NotCondition{" + "condition=" + condition + '}';
- }
-
@Override
public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
NotCondition that = (NotCondition) o;
return Objects.equals(condition, that.condition);
}
@@ -61,4 +52,9 @@ public boolean equals(Object o) {
public int hashCode() {
return Objects.hash(condition);
}
+
+ @Override
+ public String toString() {
+ return "NotCondition{" + "condition=" + condition + '}';
+ }
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/WhereCondition.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/WhereCondition.java
index 21bfd8caf..d3332cf53 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/WhereCondition.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/condition/WhereCondition.java
@@ -23,6 +23,10 @@
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "_type")
@JsonSubTypes({
@JsonSubTypes.Type(value = ComparisonOperatorCondition.class, name = "ComparisonOperator"),
- @JsonSubTypes.Type(value = LogicalOperatorCondition.class, name = "LogicalOperator")
+ @JsonSubTypes.Type(value = LogicalOperatorCondition.class, name = "LogicalOperator"),
+ @JsonSubTypes.Type(value = ExistsCondition.class, name = "Exists"),
+ @JsonSubTypes.Type(value = LikeCondition.class, name = "Like"),
+ @JsonSubTypes.Type(value = MatchesCondition.class, name = "Matches"),
+ @JsonSubTypes.Type(value = NotCondition.class, name = "Not")
})
public interface WhereCondition {}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/AbstractContainmentExpression.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/AbstractContainmentExpression.java
index dc501da9b..dbe33df4a 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/AbstractContainmentExpression.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/AbstractContainmentExpression.java
@@ -16,9 +16,15 @@
* limitations under the License.
*/
package org.ehrbase.openehr.sdk.aql.dto.containment;
+
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
+import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+import java.util.Objects;
+
/**
* @author Stefan Spiska
*/
+@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "identifier")
public abstract class AbstractContainmentExpression implements Containment {
private Containment contains;
@@ -40,4 +46,22 @@ public String getIdentifier() {
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AbstractContainmentExpression that = (AbstractContainmentExpression) o;
+ return Objects.equals(contains, that.contains) && Objects.equals(identifier, that.identifier);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(contains, identifier);
+ }
+
+ @Override
+ public String toString() {
+ return "AbstractContainmentExpression{" + "contains=" + contains + ", identifier='" + identifier + '\'' + '}';
+ }
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentClassExpression.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentClassExpression.java
index f9d94b37b..2e3b4d7b9 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentClassExpression.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentClassExpression.java
@@ -17,9 +17,14 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.containment;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import org.ehrbase.openehr.sdk.aql.dto.path.AndOperatorPredicate;
+import org.ehrbase.openehr.sdk.aql.serializer.PredicateDeserializer;
+import org.ehrbase.openehr.sdk.aql.serializer.PredicateSerializer;
public class ContainmentClassExpression extends AbstractContainmentExpression {
@@ -35,11 +40,35 @@ public void setType(String type) {
this.type = type;
}
+ @JsonSerialize(using = PredicateSerializer.class)
public List getPredicates() {
return predicates;
}
+ @JsonDeserialize(using = PredicateDeserializer.class)
public void setPredicates(List predicates) {
this.predicates = new ArrayList<>(predicates);
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ ContainmentClassExpression that = (ContainmentClassExpression) o;
+ return Objects.equals(type, that.type) && Objects.equals(predicates, that.predicates);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), type, predicates);
+ }
+
+ @Override
+ public String toString() {
+ return "ContainmentClassExpression{" + "type='"
+ + type + '\'' + ", predicates="
+ + predicates + "} "
+ + super.toString();
+ }
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentNotOperator.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentNotOperator.java
index 0eb83c109..f52b7e2e0 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentNotOperator.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentNotOperator.java
@@ -17,6 +17,8 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.containment;
+import java.util.Objects;
+
/**
* @author Stefan Spiska
*/
@@ -30,4 +32,22 @@ public Containment getContainmentExpression() {
public void setContainmentExpression(Containment containmentExpression) {
this.containmentExpression = containmentExpression;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ContainmentNotOperator that = (ContainmentNotOperator) o;
+ return Objects.equals(containmentExpression, that.containmentExpression);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(containmentExpression);
+ }
+
+ @Override
+ public String toString() {
+ return "ContainmentNotOperator{" + "containmentExpression=" + containmentExpression + '}';
+ }
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentSetOperator.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentSetOperator.java
index 5fca1761d..2578aa0b2 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentSetOperator.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/containment/ContainmentSetOperator.java
@@ -19,6 +19,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
+import java.util.Objects;
import org.ehrbase.openehr.sdk.aql.dto.LogicalOperator;
public class ContainmentSetOperator implements Containment, LogicalOperator {
@@ -45,35 +46,21 @@ public void setValues(List values) {
this.values = values;
}
- public boolean equals(final Object o) {
- if (o == this) return true;
- if (!(o instanceof ContainmentSetOperator)) return false;
- final ContainmentSetOperator other = (ContainmentSetOperator) o;
- if (!other.canEqual((Object) this)) return false;
- final Object this$symbol = this.getSymbol();
- final Object other$symbol = other.getSymbol();
- if (this$symbol == null ? other$symbol != null : !this$symbol.equals(other$symbol)) return false;
- final Object this$values = this.getValues();
- final Object other$values = other.getValues();
- if (this$values == null ? other$values != null : !this$values.equals(other$values)) return false;
- return true;
- }
-
- protected boolean canEqual(final Object other) {
- return other instanceof ContainmentSetOperator;
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ContainmentSetOperator that = (ContainmentSetOperator) o;
+ return symbol == that.symbol && Objects.equals(values, that.values);
}
+ @Override
public int hashCode() {
- final int PRIME = 59;
- int result = 1;
- final Object $symbol = this.getSymbol();
- result = result * PRIME + ($symbol == null ? 43 : $symbol.hashCode());
- final Object $values = this.getValues();
- result = result * PRIME + ($values == null ? 43 : $values.hashCode());
- return result;
+ return Objects.hash(symbol, values);
}
+ @Override
public String toString() {
- return "ContainmentSetOperator(symbol=" + this.getSymbol() + ", values=" + this.getValues() + ")";
+ return "ContainmentSetOperator{" + "symbol=" + symbol + ", values=" + values + '}';
}
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/AggregateFunction.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/AggregateFunction.java
index 02a1e97ad..07d4372c8 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/AggregateFunction.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/AggregateFunction.java
@@ -17,6 +17,8 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.operand;
+import java.util.Objects;
+
/**
* @author Stefan Spiska
*/
@@ -47,4 +49,22 @@ public enum AggregateFunctionName {
MAX,
AVG
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AggregateFunction that = (AggregateFunction) o;
+ return functionName == that.functionName && Objects.equals(identifiedPath, that.identifiedPath);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(functionName, identifiedPath);
+ }
+
+ @Override
+ public String toString() {
+ return "AggregateFunction{" + "functionName=" + functionName + ", identifiedPath=" + identifiedPath + '}';
+ }
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/ColumnExpression.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/ColumnExpression.java
index 4697dd072..eedcb5fa4 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/ColumnExpression.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/ColumnExpression.java
@@ -17,7 +17,24 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.operand;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
/**
* @author Stefan Spiska
*/
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "_type")
+@JsonSubTypes({
+ @JsonSubTypes.Type(value = AggregateFunction.class, name = "AggregateFunction"),
+ @JsonSubTypes.Type(value = IdentifiedPath.class, name = "IdentifiedPath"),
+ @JsonSubTypes.Type(value = BooleanPrimitive.class, name = "Boolean"),
+ @JsonSubTypes.Type(value = CountDistinctAggregateFunction.class, name = "CountDistinctAggregateFunction"),
+ @JsonSubTypes.Type(value = DoublePrimitive.class, name = "Double"),
+ @JsonSubTypes.Type(value = LongPrimitive.class, name = "Long"),
+ @JsonSubTypes.Type(value = NullPrimitive.class, name = "Null"),
+ @JsonSubTypes.Type(value = SingleRowFunction.class, name = "SingleRowFunction"),
+ @JsonSubTypes.Type(value = StringPrimitive.class, name = "String"),
+ @JsonSubTypes.Type(value = TemporalPrimitive.class, name = "Temporal"),
+ @JsonSubTypes.Type(value = TerminologyFunction.class, name = "TerminologyFunction")
+})
public interface ColumnExpression {}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/ComparisonLeftOperand.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/ComparisonLeftOperand.java
index 3db5022df..d028e6d8c 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/ComparisonLeftOperand.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/ComparisonLeftOperand.java
@@ -17,7 +17,16 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.operand;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
/**
* @author Stefan Spiska
*/
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "_type")
+@JsonSubTypes({
+ @JsonSubTypes.Type(value = IdentifiedPath.class, name = "IdentifiedPath"),
+ @JsonSubTypes.Type(value = SingleRowFunction.class, name = "SingleRowFunction"),
+ @JsonSubTypes.Type(value = TerminologyFunction.class, name = "TerminologyFunction")
+})
public interface ComparisonLeftOperand {}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/DoublePrimitive.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/DoublePrimitive.java
index eb9316480..240055b57 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/DoublePrimitive.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/DoublePrimitive.java
@@ -17,6 +17,7 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.operand;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import org.apache.commons.lang3.StringUtils;
/**
@@ -62,6 +63,7 @@ public void setValue(Double value) {
this.stringRepresentation = null;
}
+ @JsonIgnore
public String getStringRepresentation() {
if (stringRepresentation == null && getValue() != null) {
this.stringRepresentation = getValue().toString();
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/IdentifiedPath.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/IdentifiedPath.java
index 38b491aaf..b1fc14192 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/IdentifiedPath.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/IdentifiedPath.java
@@ -17,35 +17,45 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.operand;
+import com.fasterxml.jackson.annotation.JsonIdentityReference;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import org.ehrbase.openehr.sdk.aql.dto.containment.AbstractContainmentExpression;
import org.ehrbase.openehr.sdk.aql.dto.path.AndOperatorPredicate;
import org.ehrbase.openehr.sdk.aql.dto.path.AqlObjectPath;
+import org.ehrbase.openehr.sdk.aql.serializer.PredicateDeserializer;
+import org.ehrbase.openehr.sdk.aql.serializer.PredicateSerializer;
/**
* @author Stefan Spiska
*/
public class IdentifiedPath implements ColumnExpression, Operand, ComparisonLeftOperand {
-
- private AbstractContainmentExpression from;
+ @JsonIdentityReference(alwaysAsId = true)
+ private AbstractContainmentExpression root;
private List rootPredicate;
private AqlObjectPath path;
- public AbstractContainmentExpression getFrom() {
- return from;
+ public AbstractContainmentExpression getRoot() {
+ return root;
}
- public void setFrom(AbstractContainmentExpression from) {
- this.from = from;
+ public void setRoot(AbstractContainmentExpression root) {
+ this.root = root;
}
+ @JsonSerialize(using = PredicateSerializer.class)
public List getRootPredicate() {
return rootPredicate;
}
+ @JsonIgnore
+ @JsonDeserialize(using = PredicateDeserializer.class)
public void setRootPredicate(List rootPredicate) {
this.rootPredicate = new ArrayList<>(rootPredicate);
}
@@ -57,4 +67,24 @@ public AqlObjectPath getPath() {
public void setPath(AqlObjectPath path) {
this.path = path;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ IdentifiedPath that = (IdentifiedPath) o;
+ return Objects.equals(root, that.root)
+ && Objects.equals(rootPredicate, that.rootPredicate)
+ && Objects.equals(path, that.path);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(root, rootPredicate, path);
+ }
+
+ @Override
+ public String toString() {
+ return "IdentifiedPath{" + "root=" + root + ", rootPredicate=" + rootPredicate + ", path=" + path + '}';
+ }
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/LikeOperand.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/LikeOperand.java
index b6549e709..1a2196dfd 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/LikeOperand.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/LikeOperand.java
@@ -17,7 +17,16 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.operand;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
/**
* @author Stefan Spiska
*/
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "_type")
+@JsonSubTypes({
+ @JsonSubTypes.Type(value = QueryParameter.class, name = "QueryParameter"),
+ @JsonSubTypes.Type(value = StringPrimitive.class, name = "String"),
+ @JsonSubTypes.Type(value = TemporalPrimitive.class, name = "Temporal")
+})
public interface LikeOperand {}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/MatchesOperand.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/MatchesOperand.java
index 618a9641e..6adc55aad 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/MatchesOperand.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/MatchesOperand.java
@@ -17,7 +17,22 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.operand;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
/**
* @author Stefan Spiska
*/
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "_type")
+@JsonSubTypes({
+ @JsonSubTypes.Type(value = QueryParameter.class, name = "QueryParameter"),
+ @JsonSubTypes.Type(value = BooleanPrimitive.class, name = "Boolean"),
+ @JsonSubTypes.Type(value = DoublePrimitive.class, name = "Double"),
+ @JsonSubTypes.Type(value = LongPrimitive.class, name = "Long"),
+ @JsonSubTypes.Type(value = NullPrimitive.class, name = "Null"),
+ @JsonSubTypes.Type(value = SingleRowFunction.class, name = "SingleRowFunction"),
+ @JsonSubTypes.Type(value = StringPrimitive.class, name = "String"),
+ @JsonSubTypes.Type(value = TemporalPrimitive.class, name = "Temporal"),
+ @JsonSubTypes.Type(value = TerminologyFunction.class, name = "TerminologyFunction")
+})
public interface MatchesOperand {}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/Operand.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/Operand.java
index c7f59d043..34b90be89 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/Operand.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/Operand.java
@@ -17,7 +17,23 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.operand;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
/**
* @author Stefan Spiska
*/
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "_type")
+@JsonSubTypes({
+ @JsonSubTypes.Type(value = IdentifiedPath.class, name = "IdentifiedPath"),
+ @JsonSubTypes.Type(value = QueryParameter.class, name = "QueryParameter"),
+ @JsonSubTypes.Type(value = BooleanPrimitive.class, name = "Boolean"),
+ @JsonSubTypes.Type(value = DoublePrimitive.class, name = "Double"),
+ @JsonSubTypes.Type(value = LongPrimitive.class, name = "Long"),
+ @JsonSubTypes.Type(value = NullPrimitive.class, name = "Null"),
+ @JsonSubTypes.Type(value = SingleRowFunction.class, name = "SingleRowFunction"),
+ @JsonSubTypes.Type(value = StringPrimitive.class, name = "String"),
+ @JsonSubTypes.Type(value = TemporalPrimitive.class, name = "Temporal"),
+ @JsonSubTypes.Type(value = TerminologyFunction.class, name = "TerminologyFunction")
+})
public interface Operand {}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/QueryParameter.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/QueryParameter.java
index 7f2d521b2..3f14b33e0 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/QueryParameter.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/QueryParameter.java
@@ -17,6 +17,7 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.operand;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.Objects;
import org.ehrbase.openehr.sdk.util.Freezable;
@@ -64,6 +65,7 @@ public int hashCode() {
return Objects.hash(name);
}
+ @JsonIgnore
public boolean isFrozen() {
return frozen;
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/SingleRowFunction.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/SingleRowFunction.java
index e4f8899bf..2266e5fab 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/SingleRowFunction.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/operand/SingleRowFunction.java
@@ -18,6 +18,7 @@
package org.ehrbase.openehr.sdk.aql.dto.operand;
import java.util.List;
+import java.util.Objects;
/**
* @author Stefan Spiska
@@ -86,4 +87,22 @@ public String getName() {
return name();
}
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ SingleRowFunction that = (SingleRowFunction) o;
+ return Objects.equals(functionName, that.functionName) && Objects.equals(operandList, that.operandList);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(functionName, operandList);
+ }
+
+ @Override
+ public String toString() {
+ return "SingleRowFunction{" + "functionName=" + functionName + ", operandList=" + operandList + '}';
+ }
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/orderby/OrderByExpression.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/orderby/OrderByExpression.java
index b84f41b8f..a0f4d6499 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/orderby/OrderByExpression.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/orderby/OrderByExpression.java
@@ -17,6 +17,7 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.orderby;
+import java.util.Objects;
import org.ehrbase.openehr.sdk.aql.dto.operand.IdentifiedPath;
public class OrderByExpression {
@@ -44,35 +45,21 @@ public void setSymbol(OrderByDirection symbol) {
this.symbol = symbol;
}
- public boolean equals(final Object o) {
- if (o == this) return true;
- if (!(o instanceof OrderByExpression)) return false;
- final OrderByExpression other = (OrderByExpression) o;
- if (!other.canEqual((Object) this)) return false;
- final Object this$statement = this.getStatement();
- final Object other$statement = other.getStatement();
- if (this$statement == null ? other$statement != null : !this$statement.equals(other$statement)) return false;
- final Object this$symbol = this.getSymbol();
- final Object other$symbol = other.getSymbol();
- if (this$symbol == null ? other$symbol != null : !this$symbol.equals(other$symbol)) return false;
- return true;
- }
-
- protected boolean canEqual(final Object other) {
- return other instanceof OrderByExpression;
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ OrderByExpression that = (OrderByExpression) o;
+ return Objects.equals(statement, that.statement) && symbol == that.symbol;
}
+ @Override
public int hashCode() {
- final int PRIME = 59;
- int result = 1;
- final Object $statement = this.getStatement();
- result = result * PRIME + ($statement == null ? 43 : $statement.hashCode());
- final Object $symbol = this.getSymbol();
- result = result * PRIME + ($symbol == null ? 43 : $symbol.hashCode());
- return result;
+ return Objects.hash(statement, symbol);
}
+ @Override
public String toString() {
- return "OrderByExpression(statement=" + this.getStatement() + ", symbol=" + this.getSymbol() + ")";
+ return "OrderByExpression{" + "statement=" + statement + ", symbol=" + symbol + '}';
}
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/select/SelectClause.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/select/SelectClause.java
index 6ca8af829..75c0a8399 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/select/SelectClause.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/select/SelectClause.java
@@ -19,8 +19,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
+import java.util.Objects;
public class SelectClause {
@@ -49,17 +48,17 @@ public void setDistinct(boolean distinct) {
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
-
SelectClause that = (SelectClause) o;
-
- return new EqualsBuilder()
- .append(isDistinct, that.isDistinct)
- .append(statement, that.statement)
- .isEquals();
+ return isDistinct == that.isDistinct && Objects.equals(statement, that.statement);
}
@Override
public int hashCode() {
- return new HashCodeBuilder(17, 37).append(isDistinct).append(statement).toHashCode();
+ return Objects.hash(isDistinct, statement);
+ }
+
+ @Override
+ public String toString() {
+ return "SelectClause{" + "isDistinct=" + isDistinct + ", statement=" + statement + '}';
}
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/select/SelectExpression.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/select/SelectExpression.java
index 8e076d051..84f4ce83c 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/select/SelectExpression.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/dto/select/SelectExpression.java
@@ -17,6 +17,7 @@
*/
package org.ehrbase.openehr.sdk.aql.dto.select;
+import java.util.Objects;
import org.ehrbase.openehr.sdk.aql.dto.operand.ColumnExpression;
public class SelectExpression {
@@ -39,4 +40,22 @@ public ColumnExpression getColumnExpression() {
public void setColumnExpression(ColumnExpression columnExpression) {
this.columnExpression = columnExpression;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ SelectExpression that = (SelectExpression) o;
+ return Objects.equals(alias, that.alias) && Objects.equals(columnExpression, that.columnExpression);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(alias, columnExpression);
+ }
+
+ @Override
+ public String toString() {
+ return "SelectExpression{" + "alias='" + alias + '\'' + ", columnExpression=" + columnExpression + '}';
+ }
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/parser/AqlQueryVisitor.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/parser/AqlQueryVisitor.java
index 1bdadd497..c52cff3f6 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/parser/AqlQueryVisitor.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/parser/AqlQueryVisitor.java
@@ -159,7 +159,7 @@ public AqlQuery visitSelectQuery(SelectQueryContext ctx) {
identifiedPathByContainmentAlias.entries().forEach(e -> {
if (containmentByAlias.containsKey(e.getKey())) {
- e.getValue().setFrom(containmentByAlias.get(e.getKey()));
+ e.getValue().setRoot(containmentByAlias.get(e.getKey()));
} else {
errors.add("unknown FROM alias '%s'".formatted(e.getKey()));
}
@@ -347,8 +347,37 @@ public Containment visitFromClause(FromClauseContext ctx) {
@Override
public Containment visitFromExpr(FromExprContext ctx) {
+ if (ctx.SYM_LEFT_PAREN() != null) {
+ return visitFromExpr(ctx.fromExpr());
+ }
- return visitContainsExpr(ctx.containsExpr());
+ return handleContainsChain(ctx.classExprOperand(), ctx.NOT(), ctx.CONTAINS(), ctx.containsExpr());
+ }
+
+ private Containment handleContainsChain(
+ ClassExprOperandContext classExprOperandContext,
+ TerminalNode notNode,
+ TerminalNode containsNode,
+ ContainsExprContext containsExprContext) {
+
+ final AbstractContainmentExpression containmentDto;
+
+ if (classExprOperandContext instanceof ClassExpressionContext clc) {
+ containmentDto = visitClassExpression(clc);
+ } else {
+ containmentDto = visitVersionClassExpr((VersionClassExprContext) classExprOperandContext);
+ }
+ if (containsNode != null) {
+ Containment contains = visitContainsExpr(containsExprContext);
+ if (notNode != null) {
+ ContainmentNotOperator not = new ContainmentNotOperator();
+ not.setContainmentExpression(contains);
+ containmentDto.setContains(not);
+ } else {
+ containmentDto.setContains(contains);
+ }
+ }
+ return containmentDto;
}
@Override
@@ -364,31 +393,7 @@ public Containment visitContainsExpr(ContainsExprContext ctx) {
return visitContainsExpr(ctx.containsExpr(0));
} else {
-
- ClassExprOperandContext classExprOperandContext = ctx.classExprOperand();
-
- final AbstractContainmentExpression containmentDto;
-
- if (classExprOperandContext instanceof ClassExpressionContext) {
-
- containmentDto = visitClassExpression((ClassExpressionContext) classExprOperandContext);
- } else {
-
- containmentDto = visitVersionClassExpr((VersionClassExprContext) classExprOperandContext);
- }
- if (ctx.CONTAINS() != null) {
-
- Containment contains = visitContainsExpr(ctx.containsExpr(0));
- if (ctx.NOT() != null) {
-
- ContainmentNotOperator not = new ContainmentNotOperator();
- not.setContainmentExpression(contains);
- containmentDto.setContains(not);
- } else {
- containmentDto.setContains(contains);
- }
- }
- return containmentDto;
+ return handleContainsChain(ctx.classExprOperand(), ctx.NOT(), ctx.CONTAINS(), ctx.containsExpr(0));
}
}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/render/AqlRenderer.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/render/AqlRenderer.java
index a4559f64a..e3e630124 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/render/AqlRenderer.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/render/AqlRenderer.java
@@ -311,7 +311,7 @@ private static void renderParameterDto(StringBuilder sb, QueryParameter queryPar
private static void renderIdentifiedPath(StringBuilder sb, IdentifiedPath dto) {
- AbstractContainmentExpression containmentDto = dto.getFrom();
+ AbstractContainmentExpression containmentDto = dto.getRoot();
if (containmentDto == null) {
throw new SdkException("SelectClause without corresponding contains");
@@ -326,6 +326,13 @@ private static void renderIdentifiedPath(StringBuilder sb, IdentifiedPath dto) {
});
}
+ public static String renderPredicate(List or) {
+ StringBuilder sb = new StringBuilder();
+ renderPredicate(sb, or);
+
+ return sb.toString();
+ }
+
private static void renderPredicate(StringBuilder sb, List or) {
if (or.isEmpty() || or.size() == 1 && or.get(0).isEmpty()) {
return;
@@ -576,7 +583,14 @@ private static void renderContainmentLogicalOperator(
sb.append("(");
while (iterator.hasNext()) {
Containment next = iterator.next();
+ boolean requiresParenthesis = requiresParenthesis(next);
+ if (requiresParenthesis) {
+ sb.append('(');
+ }
renderContainmentExpresionDto(sb, next);
+ if (requiresParenthesis) {
+ sb.append(')');
+ }
if (iterator.hasNext()) {
sb.append(" ").append(containmentSetOperator.getSymbol()).append(" ");
}
@@ -584,6 +598,10 @@ private static void renderContainmentLogicalOperator(
sb.append(")");
}
+ private static boolean requiresParenthesis(Containment c) {
+ return c instanceof AbstractContainmentExpression e && e.getContains() != null;
+ }
+
private static void renderContainmentDto(StringBuilder sb, ContainmentClassExpression dto) {
sb.append(dto.getType());
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/AqlQueryObjectMapperProvider.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/AqlQueryObjectMapperProvider.java
new file mode 100644
index 000000000..aa8bf6acb
--- /dev/null
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/AqlQueryObjectMapperProvider.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2023 vitasystems GmbH and Hannover Medical School.
+ *
+ * This file is part of project openEHR_SDK
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.ehrbase.openehr.sdk.aql.serializer;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import org.ehrbase.openehr.sdk.aql.dto.path.AqlObjectPath;
+
+/**
+ * @author Stefan Spiska
+ */
+public class AqlQueryObjectMapperProvider {
+
+ private AqlQueryObjectMapperProvider() {
+ // NOP
+ }
+
+ private static ObjectMapper objectMapper = init();
+
+ public static ObjectMapper getObjectMapper() {
+
+ return objectMapper;
+ }
+
+ private static ObjectMapper init() {
+
+ ObjectMapper aqlobjectMapper = new ObjectMapper();
+
+ SimpleModule simpleModule = new SimpleModule();
+ simpleModule.addSerializer(AqlObjectPath.class, new ObjectPathSerializer());
+ simpleModule.addDeserializer(AqlObjectPath.class, new ObjectPathDeserializer());
+
+ aqlobjectMapper.registerModule(simpleModule);
+ aqlobjectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+ return aqlobjectMapper;
+ }
+}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/ObjectPathDeserializer.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/ObjectPathDeserializer.java
new file mode 100644
index 000000000..f385f016e
--- /dev/null
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/ObjectPathDeserializer.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2023 vitasystems GmbH and Hannover Medical School.
+ *
+ * This file is part of project openEHR_SDK
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.ehrbase.openehr.sdk.aql.serializer;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import java.io.IOException;
+import org.ehrbase.openehr.sdk.aql.dto.path.AqlObjectPath;
+import org.ehrbase.openehr.sdk.aql.parser.AqlQueryParser;
+
+/**
+ * @author Stefan Spiska
+ */
+public class ObjectPathDeserializer extends StdDeserializer {
+ protected ObjectPathDeserializer() {
+ super(AqlObjectPath.class);
+ }
+
+ @Override
+ public AqlObjectPath deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
+ return AqlQueryParser.parsePath(p.getValueAsString());
+ }
+}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/ObjectPathSerializer.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/ObjectPathSerializer.java
new file mode 100644
index 000000000..85fc81fa7
--- /dev/null
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/ObjectPathSerializer.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2023 vitasystems GmbH and Hannover Medical School.
+ *
+ * This file is part of project openEHR_SDK
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.ehrbase.openehr.sdk.aql.serializer;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import java.io.IOException;
+import org.ehrbase.openehr.sdk.aql.dto.path.AqlObjectPath;
+import org.ehrbase.openehr.sdk.aql.render.AqlRenderer;
+
+/**
+ * @author Stefan Spiska
+ */
+public class ObjectPathSerializer extends StdSerializer {
+ protected ObjectPathSerializer() {
+ super(AqlObjectPath.class);
+ }
+
+ @Override
+ public void serialize(AqlObjectPath value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+
+ gen.writeString(AqlRenderer.renderPath(value));
+ }
+}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/PredicateDeserializer.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/PredicateDeserializer.java
new file mode 100644
index 000000000..73515f88a
--- /dev/null
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/PredicateDeserializer.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2023 vitasystems GmbH and Hannover Medical School.
+ *
+ * This file is part of project openEHR_SDK
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.ehrbase.openehr.sdk.aql.serializer;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import java.io.IOException;
+import java.util.List;
+import org.ehrbase.openehr.sdk.aql.dto.path.AndOperatorPredicate;
+import org.ehrbase.openehr.sdk.aql.parser.AqlQueryParser;
+
+/**
+ * @author Stefan Spiska
+ */
+public class PredicateDeserializer extends StdDeserializer> {
+
+ protected PredicateDeserializer() {
+ super((Class>) null);
+ }
+
+ @Override
+ public List deserialize(JsonParser p, DeserializationContext ctxt)
+ throws IOException, JacksonException {
+ return AqlQueryParser.parsePredicate(p.getValueAsString());
+ }
+}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/PredicateSerializer.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/PredicateSerializer.java
new file mode 100644
index 000000000..362edc6c9
--- /dev/null
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/PredicateSerializer.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2023 vitasystems GmbH and Hannover Medical School.
+ *
+ * This file is part of project openEHR_SDK
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.ehrbase.openehr.sdk.aql.serializer;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import java.io.IOException;
+import java.util.List;
+import org.ehrbase.openehr.sdk.aql.dto.path.AndOperatorPredicate;
+import org.ehrbase.openehr.sdk.aql.render.AqlRenderer;
+
+/**
+ * @author Stefan Spiska
+ */
+public class PredicateSerializer extends StdSerializer> {
+
+ protected PredicateSerializer() {
+ super((Class>) null);
+ }
+
+ @Override
+ public void serialize(List value, JsonGenerator gen, SerializerProvider provider)
+ throws IOException {
+
+ gen.writeString(AqlRenderer.renderPredicate(value));
+ }
+}
diff --git a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/util/AqlUtil.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/util/AqlUtil.java
index b5f52e257..6e9e716fe 100644
--- a/aql/src/main/java/org/ehrbase/openehr/sdk/aql/util/AqlUtil.java
+++ b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/util/AqlUtil.java
@@ -19,11 +19,18 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import org.ehrbase.openehr.sdk.aql.dto.AqlQuery;
import org.ehrbase.openehr.sdk.aql.dto.condition.ComparisonOperatorCondition;
import org.ehrbase.openehr.sdk.aql.dto.condition.LogicalOperatorCondition;
import org.ehrbase.openehr.sdk.aql.dto.condition.WhereCondition;
+import org.ehrbase.openehr.sdk.aql.dto.containment.AbstractContainmentExpression;
+import org.ehrbase.openehr.sdk.aql.dto.containment.Containment;
+import org.ehrbase.openehr.sdk.aql.dto.containment.ContainmentNotOperator;
+import org.ehrbase.openehr.sdk.aql.dto.containment.ContainmentSetOperator;
import org.ehrbase.openehr.sdk.aql.dto.operand.Operand;
import org.ehrbase.openehr.sdk.aql.dto.operand.QueryParameter;
import org.ehrbase.openehr.sdk.aql.parser.AqlQueryParser;
@@ -78,4 +85,27 @@ private static WhereCondition removeParameter(WhereCondition condition, String p
return condition;
}
+
+ public static Map containmentExpressionsByIdentifier(
+ Containment containment) {
+ return streamContainmentExpressions(containment)
+ .collect(Collectors.toMap(AbstractContainmentExpression::getIdentifier, e -> e));
+ }
+
+ private static Stream streamContainmentExpressions(Containment containment) {
+ if (containment == null) {
+ return Stream.empty();
+ } else if (containment instanceof AbstractContainmentExpression containmentExp) {
+ return Stream.concat(
+ Stream.of(containmentExp).filter(e -> e.getIdentifier() != null),
+ streamContainmentExpressions(containmentExp.getContains()));
+ } else if (containment instanceof ContainmentSetOperator containmentSetOp) {
+ return containmentSetOp.getValues().stream().flatMap(AqlUtil::streamContainmentExpressions);
+ } else if (containment instanceof ContainmentNotOperator containmentNotOp) {
+ return streamContainmentExpressions(containmentNotOp.getContainmentExpression());
+ } else {
+ throw new IllegalArgumentException(
+ "Unsupported class %s".formatted(containment.getClass().getSimpleName()));
+ }
+ }
}
diff --git a/aql/src/test/java/org/ehrbase/openehr/sdk/aql/parser/AqlQueryParserTest.java b/aql/src/test/java/org/ehrbase/openehr/sdk/aql/parser/AqlQueryParserTest.java
index 9763bb723..8961838e3 100644
--- a/aql/src/test/java/org/ehrbase/openehr/sdk/aql/parser/AqlQueryParserTest.java
+++ b/aql/src/test/java/org/ehrbase/openehr/sdk/aql/parser/AqlQueryParserTest.java
@@ -191,7 +191,7 @@ void parseObservation() {
@Test
void parseObservation2() {
String aql =
- "SELECT e/ehr_id/value AS F1, o/data[at0001]/events[at0002]/data[at0003]/items[at0022]/items[at0005]/value/value AS F2, o/data[at0001]/events[at0002]/data[at0003]/items[at0022]/items[at0004]/value/value AS F3 FROM EHR e CONTAINS (COMPOSITION c0 and SECTION s4[openEHR-EHR-SECTION.adhoc.v1] CONTAINS OBSERVATION o[openEHR-EHR-OBSERVATION.symptom_sign_screening.v0]) WHERE (e/ehr_id/value MATCHES {'47dc21a2-7076-4a57-89dc-bd83729ed52f'} and c0/archetype_details/template_id/value MATCHES {'Corona_Anamnese'})";
+ "SELECT e/ehr_id/value AS F1, o/data[at0001]/events[at0002]/data[at0003]/items[at0022]/items[at0005]/value/value AS F2, o/data[at0001]/events[at0002]/data[at0003]/items[at0022]/items[at0004]/value/value AS F3 FROM EHR e CONTAINS (COMPOSITION c0 and (SECTION s4[openEHR-EHR-SECTION.adhoc.v1] CONTAINS OBSERVATION o[openEHR-EHR-OBSERVATION.symptom_sign_screening.v0])) WHERE (e/ehr_id/value MATCHES {'47dc21a2-7076-4a57-89dc-bd83729ed52f'} and c0/archetype_details/template_id/value MATCHES {'Corona_Anamnese'})";
testAql(aql, aql);
}
diff --git a/aql/src/test/java/org/ehrbase/openehr/sdk/aql/render/AqlRendererTest.java b/aql/src/test/java/org/ehrbase/openehr/sdk/aql/render/AqlRendererTest.java
index 9002831b1..4a1059bf1 100644
--- a/aql/src/test/java/org/ehrbase/openehr/sdk/aql/render/AqlRendererTest.java
+++ b/aql/src/test/java/org/ehrbase/openehr/sdk/aql/render/AqlRendererTest.java
@@ -114,11 +114,34 @@ void renderContainAnd() {
+ " FROM EHR e"
+ " CONTAINS COMPOSITION c"
+ " CONTAINS"
- + " (OBSERVATION o1[openEHR-EHR-OBSERVATION.blood_pressure.v2] AND OBSERVATION o2[openEHR-EHR-OBSERVATION.body_weight.v2])";
+ + " ((OBSERVATION o1[openEHR-EHR-OBSERVATION.blood_pressure.v2] CONTAINS POINT_EVENT) AND OBSERVATION o2[openEHR-EHR-OBSERVATION.body_weight.v2])";
test(aql, aql);
}
+ @Test
+ void renderContainAnd2() {
+ String aql = "SELECT"
+ + " e/ehr_id/value AS Ehr_id,"
+ + " c/context/start_time AS start_time,"
+ + " o1/data[at0001]/events[at0006]/state[at0007]/items[at0008]/value/value AS position_"
+ + " FROM EHR e"
+ + " CONTAINS COMPOSITION c"
+ + " CONTAINS"
+ + " (OBSERVATION o1[openEHR-EHR-OBSERVATION.blood_pressure.v2] CONTAINS POINT_EVENT AND CLUSTER)";
+
+ String expected = "SELECT"
+ + " e/ehr_id/value AS Ehr_id,"
+ + " c/context/start_time AS start_time,"
+ + " o1/data[at0001]/events[at0006]/state[at0007]/items[at0008]/value/value AS position_"
+ + " FROM EHR e"
+ + " CONTAINS COMPOSITION c"
+ + " CONTAINS OBSERVATION o1[openEHR-EHR-OBSERVATION.blood_pressure.v2]"
+ + " CONTAINS (POINT_EVENT AND CLUSTER)";
+
+ test(aql, expected);
+ }
+
@Test
void renderContainNOT() {
String aql = "SELECT"
diff --git a/aql/src/test/java/org/ehrbase/openehr/sdk/aql/serializer/AqlQueryObjectMapperProviderTest.java b/aql/src/test/java/org/ehrbase/openehr/sdk/aql/serializer/AqlQueryObjectMapperProviderTest.java
new file mode 100644
index 000000000..872753384
--- /dev/null
+++ b/aql/src/test/java/org/ehrbase/openehr/sdk/aql/serializer/AqlQueryObjectMapperProviderTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2023 vitasystems GmbH and Hannover Medical School.
+ *
+ * This file is part of project openEHR_SDK
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.ehrbase.openehr.sdk.aql.serializer;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.ehrbase.openehr.sdk.aql.dto.AqlQuery;
+import org.ehrbase.openehr.sdk.aql.parser.AqlQueryParser;
+import org.ehrbase.openehr.sdk.aql.render.AqlRenderer;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author Stefan Spiska
+ */
+class AqlQueryObjectMapperProviderTest {
+
+ @Test
+ void to() throws JsonProcessingException {
+ ObjectMapper cut = AqlQueryObjectMapperProvider.getObjectMapper();
+
+ String aql =
+ "SELECT o0/data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude AS Systolic__magnitude, e/ehr_id/value AS ehr_id FROM EHR e CONTAINS COMPOSITION CONTAINS OBSERVATION o0[openEHR-EHR-OBSERVATION.sample_blood_pressure.v1] WHERE (o0/data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude >= $magnitude AND o0/data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude < 1.1) ORDER BY o0/data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude ASC LIMIT 10 OFFSET 5";
+
+ AqlQuery parse = AqlQueryParser.parse(aql);
+
+ String value = cut.writerWithDefaultPrettyPrinter().writeValueAsString(parse);
+
+ assertThat(value)
+ .isEqualToIgnoringNewLines(
+ """
+ {
+ "select" : {
+ "distinct" : false,
+ "statement" : [ {
+ "alias" : "Systolic__magnitude",
+ "columnExpression" : {
+ "_type" : "IdentifiedPath",
+ "root" : "o0",
+ "path" : "data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude"
+ }
+ }, {
+ "alias" : "ehr_id",
+ "columnExpression" : {
+ "_type" : "IdentifiedPath",
+ "root" : "e",
+ "path" : "ehr_id/value"
+ }
+ } ]
+ },
+ "from" : {
+ "_type" : "Containment",
+ "identifier" : "e",
+ "contains" : {
+ "_type" : "Containment",
+ "contains" : {
+ "_type" : "Containment",
+ "identifier" : "o0",
+ "type" : "OBSERVATION",
+ "predicates" : "[openEHR-EHR-OBSERVATION.sample_blood_pressure.v1]"
+ },
+ "type" : "COMPOSITION"
+ },
+ "type" : "EHR"
+ },
+ "where" : {
+ "_type" : "LogicalOperator",
+ "symbol" : "AND",
+ "values" : [ {
+ "_type" : "ComparisonOperator",
+ "statement" : {
+ "_type" : "IdentifiedPath",
+ "root" : "o0",
+ "path" : "data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude"
+ },
+ "symbol" : "GT_EQ",
+ "value" : {
+ "_type" : "QueryParameter",
+ "name" : "magnitude"
+ }
+ }, {
+ "_type" : "ComparisonOperator",
+ "statement" : {
+ "_type" : "IdentifiedPath",
+ "root" : "o0",
+ "path" : "data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude"
+ },
+ "symbol" : "LT",
+ "value" : {
+ "_type" : "Double",
+ "value" : 1.1
+ }
+ } ]
+ },
+ "orderBy" : [ {
+ "statement" : {
+ "_type" : "IdentifiedPath",
+ "root" : "o0",
+ "path" : "data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude"
+ },
+ "symbol" : "ASC"
+ } ],
+ "limit" : 10,
+ "offset" : 5
+ }
+ """);
+
+ AqlQuery read = cut.readValue(value, AqlQuery.class);
+
+ assertThat(read).isEqualTo(parse);
+
+ String actual = AqlRenderer.render(read);
+
+ assertThat(actual).isEqualTo(aql);
+ }
+}
diff --git a/aql/src/test/java/org/ehrbase/openehr/sdk/aql/util/AqlUtilTest.java b/aql/src/test/java/org/ehrbase/openehr/sdk/aql/util/AqlUtilTest.java
index 8b3531367..5636dbfda 100644
--- a/aql/src/test/java/org/ehrbase/openehr/sdk/aql/util/AqlUtilTest.java
+++ b/aql/src/test/java/org/ehrbase/openehr/sdk/aql/util/AqlUtilTest.java
@@ -17,18 +17,24 @@
*/
package org.ehrbase.openehr.sdk.aql.util;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
+import java.util.Map;
+import org.ehrbase.openehr.sdk.aql.dto.AqlQuery;
+import org.ehrbase.openehr.sdk.aql.dto.containment.AbstractContainmentExpression;
+import org.ehrbase.openehr.sdk.aql.parser.AqlQueryParser;
import org.junit.Test;
public class AqlUtilTest {
@Test
public void removeParameter() {
-
String aql =
- "Select c0 as F1, e/ehr_id/value from EHR e contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1] where e/ehr_id/value = $ehrid";
-
+ """
+ Select c0 as F1, e/ehr_id/value
+ from EHR e
+ contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1]
+ where e/ehr_id/value = $ehrid""";
String actual = AqlUtil.removeParameter(aql, "ehrid");
assertThat(actual)
@@ -38,10 +44,13 @@ public void removeParameter() {
@Test
public void removeParameterWithOr() {
-
String aql =
- "Select c0 as F1, e/ehr_id/value from EHR e contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1] where e/ehr_id/value = $ehrid or e/ehr_id/value = $ehrid2";
-
+ """
+ Select c0 as F1, e/ehr_id/value
+ from EHR e
+ contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1]
+ where e/ehr_id/value = $ehrid
+ or e/ehr_id/value = $ehrid2""";
String actual = AqlUtil.removeParameter(aql, "ehrid");
assertThat(actual)
@@ -51,10 +60,14 @@ public void removeParameterWithOr() {
@Test
public void removeParameterWithTripleOr() {
-
String aql =
- "Select c0 as F1, e/ehr_id/value from EHR e contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1] where e/ehr_id/value = $ehrid or e/ehr_id/value = $ehrid2 or e/ehr_id/value = $ehrid3";
-
+ """
+ Select c0 as F1, e/ehr_id/value
+ from EHR e
+ contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1]
+ where e/ehr_id/value = $ehrid
+ or e/ehr_id/value = $ehrid2
+ or e/ehr_id/value = $ehrid3""";
String actual = AqlUtil.removeParameter(aql, "ehrid");
assertThat(actual)
@@ -64,10 +77,14 @@ public void removeParameterWithTripleOr() {
@Test
public void removeParameterMultiple() {
-
String aql =
- "Select c0 as F1, e/ehr_id/value from EHR e contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1] where e/ehr_id/value = $ehrid or e/ehr_id/value = $ehrid or e/ehr_id/value = $ehrid";
-
+ """
+ Select c0 as F1, e/ehr_id/value
+ from EHR e
+ contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1]
+ where e/ehr_id/value = $ehrid
+ or e/ehr_id/value = $ehrid
+ or e/ehr_id/value = $ehrid""";
String actual = AqlUtil.removeParameter(aql, "ehrid");
assertThat(actual)
@@ -77,10 +94,18 @@ public void removeParameterMultiple() {
@Test
public void removeParameterWithMixedOrAnd() {
-
String aql =
- "Select c0 as F1, e/ehr_id/value from EHR e contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1] where (e/ehr_id/value = $ehrid or (e/ehr_id/value = $ehrid2 and e/ehr_id/value = $ehrid3))";
-
+ """
+ Select c0 as F1, e/ehr_id/value
+ from EHR e
+ contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1]
+ where (
+ e/ehr_id/value = $ehrid
+ or (
+ e/ehr_id/value = $ehrid2
+ and e/ehr_id/value = $ehrid3
+ )
+ )""";
String actual = AqlUtil.removeParameter(aql, "ehrid");
assertThat(actual)
@@ -90,10 +115,18 @@ public void removeParameterWithMixedOrAnd() {
@Test
public void removeParameterWithMixedAndOr() {
-
String aql =
- "Select c0 as F1, e/ehr_id/value from EHR e contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1] where (e/ehr_id/value = $ehrid or (e/ehr_id/value = $ehrid2 and e/ehr_id/value = $ehrid3))";
-
+ """
+ Select c0 as F1, e/ehr_id/value
+ from EHR e
+ contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1]
+ where (
+ e/ehr_id/value = $ehrid
+ or (
+ e/ehr_id/value = $ehrid2
+ and e/ehr_id/value = $ehrid3
+ )
+ )""";
String actual = AqlUtil.removeParameter(aql, "ehrid2");
assertThat(actual)
@@ -103,7 +136,6 @@ public void removeParameterWithMixedAndOr() {
@Test
public void removeParameterParameterNotfound() {
-
String aql =
"Select c0 as F1, e/ehr_id/value as F2 from EHR e contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1] where (e/ehr_id/value = $ehrid or (e/ehr_id/value = $ehrid2 and e/ehr_id/value = $ehrid3))";
@@ -114,7 +146,6 @@ public void removeParameterParameterNotfound() {
@Test
public void removeParameterNoWhere() {
-
String aql =
"Select c0 as F1, e/ehr_id/value as F2 from EHR e contains COMPOSITION c0[openEHR-EHR-COMPOSITION.report.v1]";
@@ -122,4 +153,30 @@ public void removeParameterNoWhere() {
assertThat(actual).isEqualToIgnoringCase(aql);
}
+
+ @Test
+ public void containmentExpressionsByIdentifier() {
+ AqlQuery aqlQuery = AqlQueryParser.parse(
+ """
+ SELECT o1/data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude AS Systolic
+ FROM EHR e
+ CONTAINS (
+ COMPOSITION
+ and (
+ (
+ SECTION s_en[openEHR-EHR-SECTION.adhoc.v1, 'Vital Signs']
+ NOT CONTAINS OBSERVATION o1[openEHR-EHR-OBSERVATION.sample_blood_pressure.v1]
+ )
+ or
+ (
+ SECTION s_de[openEHR-EHR-SECTION.adhoc.v1, 'Vitalzeichen']
+ NOT CONTAINS OBSERVATION o2[openEHR-EHR-OBSERVATION.sample_blood_pressure.v1]
+ )
+ )
+ )""");
+
+ Map cut = AqlUtil.containmentExpressionsByIdentifier(aqlQuery.getFrom());
+
+ assertThat(cut).containsOnlyKeys("e", "s_en", "o1", "s_de", "o2");
+ }
}
diff --git a/bom/pom.xml b/bom/pom.xml
index cc55c4510..06c26f84a 100644
--- a/bom/pom.xml
+++ b/bom/pom.xml
@@ -8,7 +8,7 @@
bom
org.ehrbase.openehr.sdk
- 2.0.0
+ 2.1.0
pom
openEHR SDK
@@ -349,6 +349,7 @@
org.slf4j
slf4j-simple
${slf4j.version}
+ test
diff --git a/client/pom.xml b/client/pom.xml
index e548fa443..3b10a0dae 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -26,7 +26,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
client
diff --git a/example-generator/pom.xml b/example-generator/pom.xml
index 4c7cc3a5e..cbc85b2d1 100644
--- a/example-generator/pom.xml
+++ b/example-generator/pom.xml
@@ -5,7 +5,7 @@
sdk-parent
org.ehrbase.openehr.sdk
- 2.0.0
+ 2.1.0
4.0.0
diff --git a/generator-commons/pom.xml b/generator-commons/pom.xml
index d90e9368a..308ce780a 100644
--- a/generator-commons/pom.xml
+++ b/generator-commons/pom.xml
@@ -6,7 +6,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
generator-commons
diff --git a/generator-maven-plugin/pom.xml b/generator-maven-plugin/pom.xml
index f45b6d1dd..8dad189dd 100644
--- a/generator-maven-plugin/pom.xml
+++ b/generator-maven-plugin/pom.xml
@@ -5,7 +5,7 @@
sdk-parent
org.ehrbase.openehr.sdk
- 2.0.0
+ 2.1.0
4.0.0
diff --git a/generator/pom.xml b/generator/pom.xml
index a1b694715..cffd11dea 100644
--- a/generator/pom.xml
+++ b/generator/pom.xml
@@ -25,7 +25,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
generator
@@ -97,7 +97,6 @@
org.slf4j
slf4j-simple
- runtime
org.assertj
diff --git a/opt-1.4/pom.xml b/opt-1.4/pom.xml
index 695d3f756..3125c0d5f 100644
--- a/opt-1.4/pom.xml
+++ b/opt-1.4/pom.xml
@@ -26,7 +26,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
opt-1.4
diff --git a/pom.xml b/pom.xml
index 8859bf2a3..0e84bacae 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,13 +25,13 @@
org.ehrbase.openehr.sdk
bom
- 2.0.0
+ 2.1.0
./bom/pom.xml
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
pom
openEHR SDK
@@ -282,12 +282,4 @@
-
-
-
-
- jitpack.io
- https://jitpack.io
-
-
diff --git a/response-dto/pom.xml b/response-dto/pom.xml
index dd28bb6ef..a38ecdbbd 100644
--- a/response-dto/pom.xml
+++ b/response-dto/pom.xml
@@ -26,7 +26,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
response-dto
diff --git a/serialisation/pom.xml b/serialisation/pom.xml
index 1fa793bb7..bc1e65954 100644
--- a/serialisation/pom.xml
+++ b/serialisation/pom.xml
@@ -26,7 +26,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
serialisation
diff --git a/serialisation_conformance_test/pom.xml b/serialisation_conformance_test/pom.xml
index 2c8fd9ac0..b7590cdaf 100644
--- a/serialisation_conformance_test/pom.xml
+++ b/serialisation_conformance_test/pom.xml
@@ -26,7 +26,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
serialisation_conformance_test
@@ -105,6 +105,13 @@
+
+
+ jitpack.io
+ https://jitpack.io
+
+
+
org.ehrbase.openehr.sdk
diff --git a/terminology/pom.xml b/terminology/pom.xml
index 6df83287b..93fb2e939 100644
--- a/terminology/pom.xml
+++ b/terminology/pom.xml
@@ -26,7 +26,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
terminology
diff --git a/test-coverage/pom.xml b/test-coverage/pom.xml
index afef26340..4baea1e33 100644
--- a/test-coverage/pom.xml
+++ b/test-coverage/pom.xml
@@ -8,7 +8,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
test-coverage
diff --git a/test-data/pom.xml b/test-data/pom.xml
index 39c4d8106..4587af526 100644
--- a/test-data/pom.xml
+++ b/test-data/pom.xml
@@ -26,7 +26,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
test-data
diff --git a/test-data/src/main/java/org/ehrbase/openehr/sdk/test_data/operationaltemplate/OperationalTemplateTestData.java b/test-data/src/main/java/org/ehrbase/openehr/sdk/test_data/operationaltemplate/OperationalTemplateTestData.java
index 057997ff8..b18a2a073 100644
--- a/test-data/src/main/java/org/ehrbase/openehr/sdk/test_data/operationaltemplate/OperationalTemplateTestData.java
+++ b/test-data/src/main/java/org/ehrbase/openehr/sdk/test_data/operationaltemplate/OperationalTemplateTestData.java
@@ -70,7 +70,6 @@ public enum OperationalTemplateTestData {
"Deterioriation assessment ",
"EREACT - Deterioriation assessment.v0.opt",
"EREACT - Deterioriation assessment.v0"),
- VIROLOGISCHER_BEFUND("Virologischer Befund", "Virologischer_Befund.opt", "Virologischer Befund"),
LABOR_BEFUND("Labor Befund", "laborbefund.opt", "Laborbefund"),
GECCO_DIAGNOSE("example with snomed terminologies", "GECCO_Diagnose.opt", "GECCO_Diagnose"),
MINIMAL_ACTION_2("Minimal Action 2", "minimal_action2.opt", "Minimal action 2"),
diff --git a/util/pom.xml b/util/pom.xml
index 4a21ca286..a562b47ad 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -25,7 +25,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
util
diff --git a/util/src/main/java/org/ehrbase/openehr/sdk/util/Freezable.java b/util/src/main/java/org/ehrbase/openehr/sdk/util/Freezable.java
index f8ec5648c..be93c1fd1 100644
--- a/util/src/main/java/org/ehrbase/openehr/sdk/util/Freezable.java
+++ b/util/src/main/java/org/ehrbase/openehr/sdk/util/Freezable.java
@@ -17,6 +17,7 @@
*/
package org.ehrbase.openehr.sdk.util;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.List;
import java.util.Optional;
import java.util.function.UnaryOperator;
@@ -30,6 +31,7 @@
public interface Freezable> extends Cloneable {
O thawed();
+ @JsonIgnore
boolean isFrozen();
O frozen();
diff --git a/validation/pom.xml b/validation/pom.xml
index b9653b890..9be68169a 100644
--- a/validation/pom.xml
+++ b/validation/pom.xml
@@ -24,7 +24,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
validation
diff --git a/web-template/pom.xml b/web-template/pom.xml
index b9ea13f87..7b34c316f 100644
--- a/web-template/pom.xml
+++ b/web-template/pom.xml
@@ -25,7 +25,7 @@
org.ehrbase.openehr.sdk
sdk-parent
- 2.0.0
+ 2.1.0
web-template