From 46b8c5e47736a261c5a3eefd8d4f29bc18a579dc Mon Sep 17 00:00:00 2001 From: bot Date: Tue, 25 Jul 2023 12:33:04 +0000 Subject: [PATCH 01/10] updated version to 2.1.0-SNAPSHOT --- CHANGELOG.md | 5 +++++ aql/pom.xml | 2 +- bom/pom.xml | 2 +- client/pom.xml | 2 +- example-generator/pom.xml | 2 +- generator-commons/pom.xml | 2 +- generator-maven-plugin/pom.xml | 2 +- generator/pom.xml | 2 +- opt-1.4/pom.xml | 2 +- pom.xml | 4 ++-- response-dto/pom.xml | 2 +- serialisation/pom.xml | 2 +- serialisation_conformance_test/pom.xml | 2 +- terminology/pom.xml | 2 +- test-coverage/pom.xml | 2 +- test-data/pom.xml | 2 +- util/pom.xml | 2 +- validation/pom.xml | 2 +- web-template/pom.xml | 2 +- 19 files changed, 24 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e990ab1ac..5b3a5d1e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ Note: version releases in the 0.x.y range may introduce breaking changes. +## [unreleased] + ### Added + ### Fixed + ## [2.0.0] ### Added @@ -323,3 +327,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 +[unreleased]: https://github.com/ehrbase/openEHR_SDK/compare/v2.0.0...HEAD diff --git a/aql/pom.xml b/aql/pom.xml index 951809208..ba688f205 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-SNAPSHOT aql diff --git a/bom/pom.xml b/bom/pom.xml index cc55c4510..79fd317f1 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -8,7 +8,7 @@ bom org.ehrbase.openehr.sdk - 2.0.0 + 2.1.0-SNAPSHOT pom openEHR SDK diff --git a/client/pom.xml b/client/pom.xml index e548fa443..11694c0e1 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-SNAPSHOT client diff --git a/example-generator/pom.xml b/example-generator/pom.xml index 4c7cc3a5e..b383294ea 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-SNAPSHOT 4.0.0 diff --git a/generator-commons/pom.xml b/generator-commons/pom.xml index d90e9368a..ff78fed2e 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-SNAPSHOT generator-commons diff --git a/generator-maven-plugin/pom.xml b/generator-maven-plugin/pom.xml index f45b6d1dd..c120d9019 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-SNAPSHOT 4.0.0 diff --git a/generator/pom.xml b/generator/pom.xml index a1b694715..d6d96d461 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-SNAPSHOT generator diff --git a/opt-1.4/pom.xml b/opt-1.4/pom.xml index 695d3f756..1237d7a5b 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-SNAPSHOT opt-1.4 diff --git a/pom.xml b/pom.xml index 8859bf2a3..148ca4d78 100644 --- a/pom.xml +++ b/pom.xml @@ -25,13 +25,13 @@ org.ehrbase.openehr.sdk bom - 2.0.0 + 2.1.0-SNAPSHOT ./bom/pom.xml org.ehrbase.openehr.sdk sdk-parent - 2.0.0 + 2.1.0-SNAPSHOT pom openEHR SDK diff --git a/response-dto/pom.xml b/response-dto/pom.xml index dd28bb6ef..8ec96873f 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-SNAPSHOT response-dto diff --git a/serialisation/pom.xml b/serialisation/pom.xml index 1fa793bb7..5d7e228f7 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-SNAPSHOT serialisation diff --git a/serialisation_conformance_test/pom.xml b/serialisation_conformance_test/pom.xml index 2c8fd9ac0..c441b426c 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-SNAPSHOT serialisation_conformance_test diff --git a/terminology/pom.xml b/terminology/pom.xml index 6df83287b..27077de4d 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-SNAPSHOT terminology diff --git a/test-coverage/pom.xml b/test-coverage/pom.xml index afef26340..00aca5fa5 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-SNAPSHOT test-coverage diff --git a/test-data/pom.xml b/test-data/pom.xml index 39c4d8106..35ced7a0e 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-SNAPSHOT test-data diff --git a/util/pom.xml b/util/pom.xml index 4a21ca286..e59bbcbf3 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-SNAPSHOT util diff --git a/validation/pom.xml b/validation/pom.xml index b9653b890..f75143e94 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-SNAPSHOT validation diff --git a/web-template/pom.xml b/web-template/pom.xml index b9ea13f87..14f3244df 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-SNAPSHOT web-template From 0f72da07dd52729ecc1142b46e21906a95c7cb37 Mon Sep 17 00:00:00 2001 From: Alex Vidrean Date: Wed, 26 Jul 2023 10:12:28 +0300 Subject: [PATCH 02/10] Remove jitpack repository from pom --- pom.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pom.xml b/pom.xml index 148ca4d78..0d5339123 100644 --- a/pom.xml +++ b/pom.xml @@ -282,12 +282,4 @@ - - - - - jitpack.io - https://jitpack.io - - From a2aa002c32385ae9de689d66637951b6a1108fa1 Mon Sep 17 00:00:00 2001 From: Alex Vidrean Date: Wed, 26 Jul 2023 10:37:41 +0300 Subject: [PATCH 03/10] Add jitpack repo to serialization_conformance_tests This is required for web-template-tests dependency --- serialisation_conformance_test/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/serialisation_conformance_test/pom.xml b/serialisation_conformance_test/pom.xml index c441b426c..17f4b4d1a 100644 --- a/serialisation_conformance_test/pom.xml +++ b/serialisation_conformance_test/pom.xml @@ -105,6 +105,13 @@ + + + jitpack.io + https://jitpack.io + + + org.ehrbase.openehr.sdk From d206b8e151614ca4188bcb9616578bfb71be8689 Mon Sep 17 00:00:00 2001 From: stefanspiska Date: Fri, 28 Jul 2023 10:38:18 +0200 Subject: [PATCH 04/10] Feature/cdr 891 aql parser advanced features (#496) --- CHANGELOG.md | 1 + .../ComparisonOperatorCondition.java | 49 ++----- .../aql/dto/condition/ExistsCondition.java | 18 +-- .../sdk/aql/dto/condition/LikeCondition.java | 35 ++--- .../condition/LogicalOperatorCondition.java | 35 ++--- .../sdk/aql/dto/condition/NotCondition.java | 18 +-- .../sdk/aql/dto/condition/WhereCondition.java | 6 +- .../AbstractContainmentExpression.java | 24 ++++ .../ContainmentClassExpression.java | 29 ++++ .../containment/ContainmentNotOperator.java | 20 +++ .../containment/ContainmentSetOperator.java | 35 ++--- .../aql/dto/operand/AggregateFunction.java | 20 +++ .../sdk/aql/dto/operand/ColumnExpression.java | 17 +++ .../dto/operand/ComparisonLeftOperand.java | 9 ++ .../sdk/aql/dto/operand/DoublePrimitive.java | 2 + .../sdk/aql/dto/operand/IdentifiedPath.java | 42 +++++- .../sdk/aql/dto/operand/LikeOperand.java | 9 ++ .../sdk/aql/dto/operand/MatchesOperand.java | 15 ++ .../openehr/sdk/aql/dto/operand/Operand.java | 16 +++ .../sdk/aql/dto/operand/QueryParameter.java | 2 + .../aql/dto/operand/SingleRowFunction.java | 19 +++ .../aql/dto/orderby/OrderByExpression.java | 35 ++--- .../sdk/aql/dto/select/SelectClause.java | 17 ++- .../sdk/aql/dto/select/SelectExpression.java | 19 +++ .../sdk/aql/parser/AqlQueryVisitor.java | 2 +- .../openehr/sdk/aql/render/AqlRenderer.java | 9 +- .../AqlQueryObjectMapperProvider.java | 53 +++++++ .../serializer/ObjectPathDeserializer.java | 40 ++++++ .../aql/serializer/ObjectPathSerializer.java | 40 ++++++ .../aql/serializer/PredicateDeserializer.java | 43 ++++++ .../aql/serializer/PredicateSerializer.java | 43 ++++++ .../ehrbase/openehr/sdk/aql/util/AqlUtil.java | 32 +++++ .../AqlQueryObjectMapperProviderTest.java | 132 ++++++++++++++++++ .../openehr/sdk/aql/util/AqlUtilTest.java | 18 +++ bom/pom.xml | 1 + generator/pom.xml | 1 - .../ehrbase/openehr/sdk/util/Freezable.java | 2 + 37 files changed, 736 insertions(+), 172 deletions(-) create mode 100644 aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/AqlQueryObjectMapperProvider.java create mode 100644 aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/ObjectPathDeserializer.java create mode 100644 aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/ObjectPathSerializer.java create mode 100644 aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/PredicateDeserializer.java create mode 100644 aql/src/main/java/org/ehrbase/openehr/sdk/aql/serializer/PredicateSerializer.java create mode 100644 aql/src/test/java/org/ehrbase/openehr/sdk/aql/serializer/AqlQueryObjectMapperProviderTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b3a5d1e9..a34b4d4c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Note: version releases in the 0.x.y range may introduce breaking changes. ## [unreleased] ### Added +- Added json Serialisation for the AQL-DTO model ([#496](https://github.com/ehrbase/openEHR_SDK/pull/496)) ### Fixed ## [2.0.0] 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..1dd7fd95c 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())); } 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..262836f6e 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; 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..475f1579d 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 @@ -18,12 +18,18 @@ package org.ehrbase.openehr.sdk.aql.util; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; 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 +84,30 @@ private static WhereCondition removeParameter(WhereCondition condition, String p return condition; } + + public static Map containmentExpressionsByIdentifier( + Containment containment) { + + HashMap map = new HashMap<>(); + if (containment instanceof AbstractContainmentExpression abstractContainmentExpression) { + if (abstractContainmentExpression.getIdentifier() != null) { + map.put(abstractContainmentExpression.getIdentifier(), abstractContainmentExpression); + } + if (abstractContainmentExpression.getContains() != null) { + map.putAll(containmentExpressionsByIdentifier(abstractContainmentExpression.getContains())); + } + } else if (containment instanceof ContainmentSetOperator containmentSetOperator) { + + containmentSetOperator.getValues().stream() + .map(AqlUtil::containmentExpressionsByIdentifier) + .forEach(map::putAll); + } else if (containment instanceof ContainmentNotOperator containmentNotOperator) { + + map.putAll(containmentExpressionsByIdentifier(containmentNotOperator.getContainmentExpression())); + } else { + throw new UnsupportedOperationException( + "Unsupported class %s".formatted(containment.getClass().getSimpleName())); + } + return map; + } } 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..889460bae 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 @@ -19,6 +19,11 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import java.util.ArrayList; +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 { @@ -122,4 +127,17 @@ public void removeParameterNoWhere() { assertThat(actual).isEqualToIgnoringCase(aql); } + + @Test + public void containmentExpressionsByIdentifier() { + + String aql = + "SELECT o_659/data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude AS Systolic FROM EHR e CONTAINS COMPOSITION NOT CONTAINS (OBSERVATION o_659[openEHR-EHR-OBSERVATION.sample_blood_pressure.v1] and OBSERVATION o_659[openEHR-EHR-OBSERVATION.sample_blood_pressure.v2])"; + + AqlQuery aqlQuery = AqlQueryParser.parse(aql); + + Map cut = AqlUtil.containmentExpressionsByIdentifier(aqlQuery.getFrom()); + + assertThat(new ArrayList<>(cut.keySet())).asList().containsExactlyInAnyOrder("e", "o_659"); + } } diff --git a/bom/pom.xml b/bom/pom.xml index 79fd317f1..1166ae46f 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -349,6 +349,7 @@ org.slf4j slf4j-simple ${slf4j.version} + test diff --git a/generator/pom.xml b/generator/pom.xml index d6d96d461..3b8bf0e2c 100644 --- a/generator/pom.xml +++ b/generator/pom.xml @@ -97,7 +97,6 @@ org.slf4j slf4j-simple - runtime org.assertj 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(); From 2d67bf7bc42ecf2936a4fcdcbc11b6612c7777e4 Mon Sep 17 00:00:00 2001 From: Holger Reise Date: Mon, 31 Jul 2023 12:48:46 +0200 Subject: [PATCH 05/10] removed duplicate "Virologischer Befund" --- .../operationaltemplate/OperationalTemplateTestData.java | 1 - 1 file changed, 1 deletion(-) 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"), From 918cbfbbdfc35a49ccc56d9bbadd86abb61d4ca5 Mon Sep 17 00:00:00 2001 From: Holger Reise Date: Mon, 31 Jul 2023 12:49:16 +0200 Subject: [PATCH 06/10] Cleanup AqlUtil::containmentExpressionsByIdentifier --- .../ehrbase/openehr/sdk/aql/util/AqlUtil.java | 36 ++++--- .../openehr/sdk/aql/util/AqlUtilTest.java | 95 +++++++++++++------ 2 files changed, 84 insertions(+), 47 deletions(-) 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 475f1579d..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 @@ -18,10 +18,11 @@ package org.ehrbase.openehr.sdk.aql.util; import java.util.ArrayList; -import java.util.HashMap; 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; @@ -87,27 +88,24 @@ private static WhereCondition removeParameter(WhereCondition condition, String p public static Map containmentExpressionsByIdentifier( Containment containment) { + return streamContainmentExpressions(containment) + .collect(Collectors.toMap(AbstractContainmentExpression::getIdentifier, e -> e)); + } - HashMap map = new HashMap<>(); - if (containment instanceof AbstractContainmentExpression abstractContainmentExpression) { - if (abstractContainmentExpression.getIdentifier() != null) { - map.put(abstractContainmentExpression.getIdentifier(), abstractContainmentExpression); - } - if (abstractContainmentExpression.getContains() != null) { - map.putAll(containmentExpressionsByIdentifier(abstractContainmentExpression.getContains())); - } - } else if (containment instanceof ContainmentSetOperator containmentSetOperator) { - - containmentSetOperator.getValues().stream() - .map(AqlUtil::containmentExpressionsByIdentifier) - .forEach(map::putAll); - } else if (containment instanceof ContainmentNotOperator containmentNotOperator) { - - map.putAll(containmentExpressionsByIdentifier(containmentNotOperator.getContainmentExpression())); + 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 UnsupportedOperationException( + throw new IllegalArgumentException( "Unsupported class %s".formatted(containment.getClass().getSimpleName())); } - return map; } } 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 889460bae..1f61121ac 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,9 +17,8 @@ */ 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.ArrayList; import java.util.Map; import org.ehrbase.openehr.sdk.aql.dto.AqlQuery; import org.ehrbase.openehr.sdk.aql.dto.containment.AbstractContainmentExpression; @@ -30,10 +29,12 @@ 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) @@ -43,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) @@ -56,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) @@ -69,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) @@ -82,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) @@ -95,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) @@ -108,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))"; @@ -119,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]"; @@ -130,14 +156,27 @@ public void removeParameterNoWhere() { @Test public void containmentExpressionsByIdentifier() { - - String aql = - "SELECT o_659/data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude AS Systolic FROM EHR e CONTAINS COMPOSITION NOT CONTAINS (OBSERVATION o_659[openEHR-EHR-OBSERVATION.sample_blood_pressure.v1] and OBSERVATION o_659[openEHR-EHR-OBSERVATION.sample_blood_pressure.v2])"; - - AqlQuery aqlQuery = AqlQueryParser.parse(aql); + 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(new ArrayList<>(cut.keySet())).asList().containsExactlyInAnyOrder("e", "o_659"); + assertThat(cut).containsOnlyKeys("e", "s_en", "o_658", "s_de", "o_659"); } } From 08f5a7ac0a4157af323b8ef09076c31c39aa2071 Mon Sep 17 00:00:00 2001 From: "vinzenz.mueller" Date: Mon, 31 Jul 2023 13:46:23 +0200 Subject: [PATCH 07/10] Fix broken test --- .../test/java/org/ehrbase/openehr/sdk/aql/util/AqlUtilTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1f61121ac..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 @@ -177,6 +177,6 @@ public void containmentExpressionsByIdentifier() { Map cut = AqlUtil.containmentExpressionsByIdentifier(aqlQuery.getFrom()); - assertThat(cut).containsOnlyKeys("e", "s_en", "o_658", "s_de", "o_659"); + assertThat(cut).containsOnlyKeys("e", "s_en", "o1", "s_de", "o2"); } } From 94a3eda8804e5b89d1b148a301a9c2998bcf9d09 Mon Sep 17 00:00:00 2001 From: "vinzenz.mueller" Date: Tue, 1 Aug 2023 12:24:50 +0200 Subject: [PATCH 08/10] CDR-897 AQL grammar no longer allows set operators in "fromExpr" --- .../openehr/sdk/aql/parser/antlr/AqlParser.g4 | 3 +- .../sdk/aql/parser/AqlQueryVisitor.java | 57 ++++++++++--------- .../sdk/aql/parser/AqlQueryParserTest.java | 2 +- 3 files changed, 34 insertions(+), 28 deletions(-) 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/parser/AqlQueryVisitor.java b/aql/src/main/java/org/ehrbase/openehr/sdk/aql/parser/AqlQueryVisitor.java index 1dd7fd95c..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 @@ -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/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); } From a8b3d357b4e3b63008102c0eb1de74348d3f2bee Mon Sep 17 00:00:00 2001 From: "vinzenz.mueller" Date: Tue, 1 Aug 2023 12:26:26 +0200 Subject: [PATCH 09/10] CDR-973 Add parenthesis around contains chains nested in set operators --- .../openehr/sdk/aql/render/AqlRenderer.java | 11 ++++++++ .../sdk/aql/render/AqlRendererTest.java | 25 ++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) 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 262836f6e..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 @@ -583,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(" "); } @@ -591,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/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" From a2b5757f768168b14074e0fc259b074e97cd5933 Mon Sep 17 00:00:00 2001 From: bot Date: Wed, 9 Aug 2023 08:22:08 +0000 Subject: [PATCH 10/10] release 2.1.0: updated version to 2.1.0 --- CHANGELOG.md | 4 ++-- aql/pom.xml | 2 +- bom/pom.xml | 2 +- client/pom.xml | 2 +- example-generator/pom.xml | 2 +- generator-commons/pom.xml | 2 +- generator-maven-plugin/pom.xml | 2 +- generator/pom.xml | 2 +- opt-1.4/pom.xml | 2 +- pom.xml | 4 ++-- response-dto/pom.xml | 2 +- serialisation/pom.xml | 2 +- serialisation_conformance_test/pom.xml | 2 +- terminology/pom.xml | 2 +- test-coverage/pom.xml | 2 +- test-data/pom.xml | 2 +- util/pom.xml | 2 +- validation/pom.xml | 2 +- web-template/pom.xml | 2 +- 19 files changed, 21 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a34b4d4c7..bce6a04a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Note: version releases in the 0.x.y range may introduce breaking changes. -## [unreleased] +## [2.1.0] ### Added - Added json Serialisation for the AQL-DTO model ([#496](https://github.com/ehrbase/openEHR_SDK/pull/496)) ### Fixed @@ -328,4 +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 -[unreleased]: https://github.com/ehrbase/openEHR_SDK/compare/v2.0.0...HEAD +[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 ba688f205..e751bfd00 100644 --- a/aql/pom.xml +++ b/aql/pom.xml @@ -25,7 +25,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 aql diff --git a/bom/pom.xml b/bom/pom.xml index 1166ae46f..06c26f84a 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -8,7 +8,7 @@ bom org.ehrbase.openehr.sdk - 2.1.0-SNAPSHOT + 2.1.0 pom openEHR SDK diff --git a/client/pom.xml b/client/pom.xml index 11694c0e1..3b10a0dae 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -26,7 +26,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 client diff --git a/example-generator/pom.xml b/example-generator/pom.xml index b383294ea..cbc85b2d1 100644 --- a/example-generator/pom.xml +++ b/example-generator/pom.xml @@ -5,7 +5,7 @@ sdk-parent org.ehrbase.openehr.sdk - 2.1.0-SNAPSHOT + 2.1.0 4.0.0 diff --git a/generator-commons/pom.xml b/generator-commons/pom.xml index ff78fed2e..308ce780a 100644 --- a/generator-commons/pom.xml +++ b/generator-commons/pom.xml @@ -6,7 +6,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 generator-commons diff --git a/generator-maven-plugin/pom.xml b/generator-maven-plugin/pom.xml index c120d9019..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.1.0-SNAPSHOT + 2.1.0 4.0.0 diff --git a/generator/pom.xml b/generator/pom.xml index 3b8bf0e2c..cffd11dea 100644 --- a/generator/pom.xml +++ b/generator/pom.xml @@ -25,7 +25,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 generator diff --git a/opt-1.4/pom.xml b/opt-1.4/pom.xml index 1237d7a5b..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.1.0-SNAPSHOT + 2.1.0 opt-1.4 diff --git a/pom.xml b/pom.xml index 0d5339123..0e84bacae 100644 --- a/pom.xml +++ b/pom.xml @@ -25,13 +25,13 @@ org.ehrbase.openehr.sdk bom - 2.1.0-SNAPSHOT + 2.1.0 ./bom/pom.xml org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 pom openEHR SDK diff --git a/response-dto/pom.xml b/response-dto/pom.xml index 8ec96873f..a38ecdbbd 100644 --- a/response-dto/pom.xml +++ b/response-dto/pom.xml @@ -26,7 +26,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 response-dto diff --git a/serialisation/pom.xml b/serialisation/pom.xml index 5d7e228f7..bc1e65954 100644 --- a/serialisation/pom.xml +++ b/serialisation/pom.xml @@ -26,7 +26,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 serialisation diff --git a/serialisation_conformance_test/pom.xml b/serialisation_conformance_test/pom.xml index 17f4b4d1a..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.1.0-SNAPSHOT + 2.1.0 serialisation_conformance_test diff --git a/terminology/pom.xml b/terminology/pom.xml index 27077de4d..93fb2e939 100644 --- a/terminology/pom.xml +++ b/terminology/pom.xml @@ -26,7 +26,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 terminology diff --git a/test-coverage/pom.xml b/test-coverage/pom.xml index 00aca5fa5..4baea1e33 100644 --- a/test-coverage/pom.xml +++ b/test-coverage/pom.xml @@ -8,7 +8,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 test-coverage diff --git a/test-data/pom.xml b/test-data/pom.xml index 35ced7a0e..4587af526 100644 --- a/test-data/pom.xml +++ b/test-data/pom.xml @@ -26,7 +26,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 test-data diff --git a/util/pom.xml b/util/pom.xml index e59bbcbf3..a562b47ad 100644 --- a/util/pom.xml +++ b/util/pom.xml @@ -25,7 +25,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 util diff --git a/validation/pom.xml b/validation/pom.xml index f75143e94..9be68169a 100644 --- a/validation/pom.xml +++ b/validation/pom.xml @@ -24,7 +24,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 validation diff --git a/web-template/pom.xml b/web-template/pom.xml index 14f3244df..7b34c316f 100644 --- a/web-template/pom.xml +++ b/web-template/pom.xml @@ -25,7 +25,7 @@ org.ehrbase.openehr.sdk sdk-parent - 2.1.0-SNAPSHOT + 2.1.0 web-template