diff --git a/api/src/main/java/jakarta/data/expression/NavigableExpression.java b/api/src/main/java/jakarta/data/expression/NavigableExpression.java index 690121b76..c3916100b 100644 --- a/api/src/main/java/jakarta/data/expression/NavigableExpression.java +++ b/api/src/main/java/jakarta/data/expression/NavigableExpression.java @@ -25,38 +25,23 @@ import jakarta.data.metamodel.NumericAttribute; import jakarta.data.metamodel.TemporalAttribute; import jakarta.data.metamodel.TextAttribute; -import jakarta.data.spi.expression.path.BooleanPath; -import jakarta.data.spi.expression.path.ComparablePath; -import jakarta.data.spi.expression.path.NavigablePath; -import jakarta.data.spi.expression.path.NumericPath; -import jakarta.data.spi.expression.path.TemporalPath; -import jakarta.data.spi.expression.path.TextPath; public interface NavigableExpression { - default NavigableExpression navigate(NavigableAttribute attribute) { - return NavigablePath.of(this, attribute); - } + NavigableExpression navigate(NavigableAttribute attribute); - default TextExpression navigate(TextAttribute attribute) { - return TextPath.of(this, attribute); - } + TextAttribute navigate(TextAttribute attribute); - default > ComparableExpression navigate(ComparableAttribute attribute) { - return ComparablePath.of(this, attribute); - } + > ComparableAttribute navigate( + ComparableAttribute attribute); - default BooleanExpression navigate(BooleanAttribute attribute) { - return BooleanPath.of(this, attribute); - } + BooleanAttribute navigate(BooleanAttribute attribute); - default > NumericExpression navigate(NumericAttribute attribute) { - return NumericPath.of(this, attribute); - } + > NumericAttribute navigate( + NumericAttribute attribute); - default > TemporalExpression navigate( - TemporalAttribute attribute) { - return TemporalPath.of(this, attribute); - } + > + TemporalAttribute navigate( + TemporalAttribute attribute); } diff --git a/api/src/main/java/jakarta/data/metamodel/NavigableAttribute.java b/api/src/main/java/jakarta/data/metamodel/NavigableAttribute.java index da7b1bb5d..c4ac4adc3 100644 --- a/api/src/main/java/jakarta/data/metamodel/NavigableAttribute.java +++ b/api/src/main/java/jakarta/data/metamodel/NavigableAttribute.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,16 @@ */ package jakarta.data.metamodel; +import java.time.temporal.Temporal; + import jakarta.data.expression.NavigableExpression; import jakarta.data.messages.Messages; +import jakarta.data.spi.expression.path.BooleanPath; +import jakarta.data.spi.expression.path.ComparablePath; +import jakarta.data.spi.expression.path.NavigablePath; +import jakarta.data.spi.expression.path.NumericPath; +import jakarta.data.spi.expression.path.TemporalPath; +import jakarta.data.spi.expression.path.TextPath; /** *

Represents an entity attribute that is an embeddable or association to @@ -33,6 +41,41 @@ public interface NavigableAttribute extends Attribute, NavigableExpression { + @Override + default BooleanAttribute navigate(BooleanAttribute attribute) { + return BooleanPath.of(this, attribute); + } + + @Override + default > ComparableAttribute navigate( + ComparableAttribute attribute) { + return ComparablePath.of(this, attribute); + } + + @Override + default NavigableExpression navigate( + NavigableAttribute attribute) { + return NavigablePath.of(this, attribute); + } + + @Override + default > NumericAttribute navigate( + NumericAttribute attribute) { + return NumericPath.of(this, attribute); + } + + @Override + default > + TemporalAttribute navigate( + TemporalAttribute attribute) { + return TemporalPath.of(this, attribute); + } + + @Override + default TextAttribute navigate(TextAttribute attribute) { + return TextPath.of(this, attribute); + } + @Override Class type(); diff --git a/api/src/main/java/jakarta/data/spi/expression/path/BooleanPath.java b/api/src/main/java/jakarta/data/spi/expression/path/BooleanPath.java index 7f358c6ec..7e7c7532f 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/BooleanPath.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/BooleanPath.java @@ -17,17 +17,17 @@ */ package jakarta.data.spi.expression.path; -import jakarta.data.expression.BooleanExpression; -import jakarta.data.expression.NavigableExpression; import jakarta.data.metamodel.BooleanAttribute; +import jakarta.data.metamodel.NavigableAttribute; public interface BooleanPath extends Path, - BooleanExpression { + BooleanAttribute { - static BooleanPath of(NavigableExpression expression, + static BooleanPath of(NavigableAttribute expression, BooleanAttribute attribute) { - return new BooleanPathRecord<>(expression, attribute); + String name = expression.name() + '.' + attribute.name(); + return new BooleanPathRecord<>(name, expression, attribute); } } diff --git a/api/src/main/java/jakarta/data/spi/expression/path/BooleanPathRecord.java b/api/src/main/java/jakarta/data/spi/expression/path/BooleanPathRecord.java index 6cec149fb..d48f48842 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/BooleanPathRecord.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/BooleanPathRecord.java @@ -17,11 +17,12 @@ */ package jakarta.data.spi.expression.path; -import jakarta.data.expression.NavigableExpression; import jakarta.data.messages.Messages; import jakarta.data.metamodel.BooleanAttribute; +import jakarta.data.metamodel.NavigableAttribute; -record BooleanPathRecord(NavigableExpression expression, +record BooleanPathRecord(String name, + NavigableAttribute expression, BooleanAttribute attribute) implements BooleanPath { @@ -30,13 +31,19 @@ record BooleanPathRecord(NavigableExpression expression, Messages.requireNonNull(attribute, "attribute"); } + @Override + public Class declaringType() { + return expression.declaringType(); + } + @Override public String toString() { - String expr = expression.toString(); - String attrName = attribute.name(); - StringBuilder path = - new StringBuilder(expr.length() + 1 + attrName.length()); - path.append(expr).append('.').append(attrName); - return path.toString(); + return expression + "." + attribute.name(); } + + @Override + public Class type() { + return attribute.type(); + } + } diff --git a/api/src/main/java/jakarta/data/spi/expression/path/ComparablePath.java b/api/src/main/java/jakarta/data/spi/expression/path/ComparablePath.java index be1c4a4c0..2569c7cbe 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/ComparablePath.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/ComparablePath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,14 +17,15 @@ */ package jakarta.data.spi.expression.path; -import jakarta.data.expression.ComparableExpression; -import jakarta.data.expression.NavigableExpression; import jakarta.data.metamodel.ComparableAttribute; +import jakarta.data.metamodel.NavigableAttribute; public interface ComparablePath> - extends Path, ComparableExpression { - static > ComparablePath - of(NavigableExpression expression, ComparableAttribute attribute) { - return new ComparablePathRecord<>(expression, attribute); + extends Path, ComparableAttribute { + static > ComparablePath of( + NavigableAttribute expression, + ComparableAttribute attribute) { + String name = expression.name() + '.' + attribute.name(); + return new ComparablePathRecord<>(name, expression, attribute); } } diff --git a/api/src/main/java/jakarta/data/spi/expression/path/ComparablePathRecord.java b/api/src/main/java/jakarta/data/spi/expression/path/ComparablePathRecord.java index 63c8679f5..0968ae8ae 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/ComparablePathRecord.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/ComparablePathRecord.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,13 +17,14 @@ */ package jakarta.data.spi.expression.path; -import jakarta.data.expression.NavigableExpression; import jakarta.data.messages.Messages; import jakarta.data.metamodel.ComparableAttribute; +import jakarta.data.metamodel.NavigableAttribute; -record ComparablePathRecord> - (NavigableExpression expression, - ComparableAttribute attribute) +record ComparablePathRecord>( + String name, + NavigableAttribute expression, + ComparableAttribute attribute) implements ComparablePath { ComparablePathRecord { @@ -32,7 +33,12 @@ record ComparablePathRecord> } @Override - public Class type() { + public Class declaringType() { + return expression.declaringType(); + } + + @Override + public Class type() { return attribute.type(); } diff --git a/api/src/main/java/jakarta/data/spi/expression/path/NavigablePath.java b/api/src/main/java/jakarta/data/spi/expression/path/NavigablePath.java index a6511087e..12ed839ff 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/NavigablePath.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/NavigablePath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,8 +22,10 @@ public interface NavigablePath extends Path, NavigableExpression { - static NavigablePath of(NavigableExpression expression, - NavigableAttribute attribute) { - return new NavigablePathRecord<>(expression, attribute); + static NavigablePath of( + NavigableAttribute expression, + NavigableAttribute attribute) { + String name = expression.name() + '.' + attribute.name(); + return new NavigablePathRecord<>(name, expression, attribute); } } diff --git a/api/src/main/java/jakarta/data/spi/expression/path/NavigablePathRecord.java b/api/src/main/java/jakarta/data/spi/expression/path/NavigablePathRecord.java index b1cc3d45e..08c79b23c 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/NavigablePathRecord.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/NavigablePathRecord.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,10 +21,11 @@ import jakarta.data.messages.Messages; import jakarta.data.metamodel.NavigableAttribute; -record NavigablePathRecord - (NavigableExpression expression, - NavigableAttribute attribute) - implements NavigablePath { +record NavigablePathRecord( + String name, + NavigableExpression expression, + NavigableAttribute attribute) + implements NavigableAttribute, NavigablePath { NavigablePathRecord { Messages.requireNonNull(expression, "expression"); @@ -35,4 +36,9 @@ record NavigablePathRecord public String toString() { return expression + "." + attribute.name(); } + + @Override + public Class type() { + return attribute.type(); + } } diff --git a/api/src/main/java/jakarta/data/spi/expression/path/NumericPath.java b/api/src/main/java/jakarta/data/spi/expression/path/NumericPath.java index f4291534b..ee1a98b93 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/NumericPath.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/NumericPath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,14 +17,15 @@ */ package jakarta.data.spi.expression.path; -import jakarta.data.expression.NavigableExpression; -import jakarta.data.expression.NumericExpression; +import jakarta.data.metamodel.NavigableAttribute; import jakarta.data.metamodel.NumericAttribute; public interface NumericPath> - extends Path, NumericExpression { - static > NumericPath - of(NavigableExpression expression, NumericAttribute attribute) { - return new NumericPathRecord<>(expression, attribute); + extends Path, NumericAttribute { + static > NumericPath of( + NavigableAttribute expression, + NumericAttribute attribute) { + String name = expression.name() + '.' + attribute.name(); + return new NumericPathRecord<>(name, expression, attribute); } } diff --git a/api/src/main/java/jakarta/data/spi/expression/path/NumericPathRecord.java b/api/src/main/java/jakarta/data/spi/expression/path/NumericPathRecord.java index 259e15095..666bc1530 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/NumericPathRecord.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/NumericPathRecord.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,14 @@ */ package jakarta.data.spi.expression.path; -import jakarta.data.expression.NavigableExpression; import jakarta.data.messages.Messages; +import jakarta.data.metamodel.NavigableAttribute; import jakarta.data.metamodel.NumericAttribute; -record NumericPathRecord> - (NavigableExpression expression, NumericAttribute attribute) +record NumericPathRecord>( + String name, + NavigableAttribute expression, + NumericAttribute attribute) implements NumericPath { NumericPathRecord { @@ -31,7 +33,12 @@ record NumericPathRecord> } @Override - public Class type() { + public Class declaringType() { + return expression.declaringType(); + } + + @Override + public Class type() { return attribute.type(); } diff --git a/api/src/main/java/jakarta/data/spi/expression/path/TemporalPath.java b/api/src/main/java/jakarta/data/spi/expression/path/TemporalPath.java index 9ca12b0db..1619d61be 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/TemporalPath.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/TemporalPath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,17 +19,18 @@ import java.time.temporal.Temporal; -import jakarta.data.expression.NavigableExpression; -import jakarta.data.expression.TemporalExpression; +import jakarta.data.metamodel.NavigableAttribute; import jakarta.data.metamodel.TemporalAttribute; public interface TemporalPath> - extends Path, TemporalExpression { + extends Path, TemporalAttribute { - static > TemporalPath of( - NavigableExpression expression, - TemporalAttribute attribute) { + static > + TemporalPath of( + NavigableAttribute expression, + TemporalAttribute attribute) { - return new TemporalPathRecord<>(expression, attribute); + String name = expression.name() + '.' + attribute.name(); + return new TemporalPathRecord<>(name, expression, attribute); } } diff --git a/api/src/main/java/jakarta/data/spi/expression/path/TemporalPathRecord.java b/api/src/main/java/jakarta/data/spi/expression/path/TemporalPathRecord.java index 988975f16..ff9e68586 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/TemporalPathRecord.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/TemporalPathRecord.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,13 +19,16 @@ import java.time.temporal.Temporal; -import jakarta.data.expression.NavigableExpression; import jakarta.data.messages.Messages; +import jakarta.data.metamodel.NavigableAttribute; import jakarta.data.metamodel.TemporalAttribute; -record TemporalPathRecord>( - NavigableExpression expression, - TemporalAttribute attribute) implements TemporalPath { +record TemporalPathRecord>( + String name, + NavigableAttribute expression, + TemporalAttribute attribute) + implements TemporalPath { TemporalPathRecord { Messages.requireNonNull(expression, "expression"); @@ -33,8 +36,13 @@ record TemporalPathRecord type() { - return attribute().type(); + public Class declaringType() { + return expression.declaringType(); + } + + @Override + public Class type() { + return attribute.type(); } @Override diff --git a/api/src/main/java/jakarta/data/spi/expression/path/TextPath.java b/api/src/main/java/jakarta/data/spi/expression/path/TextPath.java index da5778844..45cf86cba 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/TextPath.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/TextPath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,13 +17,14 @@ */ package jakarta.data.spi.expression.path; -import jakarta.data.expression.NavigableExpression; -import jakarta.data.expression.TextExpression; +import jakarta.data.metamodel.NavigableAttribute; import jakarta.data.metamodel.TextAttribute; public interface TextPath - extends Path, TextExpression { - static TextPath of(NavigableExpression expression, TextAttribute attribute) { - return new TextPathRecord<>(expression, attribute); + extends Path, TextAttribute { + static TextPath of(NavigableAttribute expression, + TextAttribute attribute) { + String name = expression.name() + '.' + attribute.name(); + return new TextPathRecord<>(name, expression, attribute); } } diff --git a/api/src/main/java/jakarta/data/spi/expression/path/TextPathRecord.java b/api/src/main/java/jakarta/data/spi/expression/path/TextPathRecord.java index 2d5406fcc..f2c796be8 100644 --- a/api/src/main/java/jakarta/data/spi/expression/path/TextPathRecord.java +++ b/api/src/main/java/jakarta/data/spi/expression/path/TextPathRecord.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,14 @@ */ package jakarta.data.spi.expression.path; -import jakarta.data.expression.NavigableExpression; import jakarta.data.messages.Messages; +import jakarta.data.metamodel.NavigableAttribute; import jakarta.data.metamodel.TextAttribute; -record TextPathRecord - (NavigableExpression expression, TextAttribute attribute) +record TextPathRecord( + String name, + NavigableAttribute expression, + TextAttribute attribute) implements TextPath { TextPathRecord { @@ -30,6 +32,11 @@ record TextPathRecord Messages.requireNonNull(attribute, "attribute"); } + @Override + public Class declaringType() { + return expression.declaringType(); + } + @Override public String toString() { return expression + "." + attribute.name(); diff --git a/api/src/test/java/jakarta/data/spi/expression/path/ComparablePathTest.java b/api/src/test/java/jakarta/data/spi/expression/path/ComparablePathTest.java index 209c91800..1585bf173 100644 --- a/api/src/test/java/jakarta/data/spi/expression/path/ComparablePathTest.java +++ b/api/src/test/java/jakarta/data/spi/expression/path/ComparablePathTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,6 @@ import jakarta.data.expression.NavigableExpression; import jakarta.data.metamodel.ComparableAttribute; import jakarta.data.metamodel.NavigableAttribute; -import jakarta.data.spi.expression.path.ComparablePath; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.DisplayName; @@ -56,7 +55,7 @@ void shouldCreateComparablePath() { NavigableExpression expr = _Author.publisher; ComparableAttribute attr = _Publisher.rating; - var path = ComparablePath.of(expr, attr); + var path = expr.navigate(attr); SoftAssertions.assertSoftly(soft -> { soft.assertThat(path).isNotNull(); diff --git a/api/src/test/java/jakarta/data/spi/expression/path/NavigablePathTest.java b/api/src/test/java/jakarta/data/spi/expression/path/NavigablePathTest.java index 52d0d1561..4fbfa4cf0 100644 --- a/api/src/test/java/jakarta/data/spi/expression/path/NavigablePathTest.java +++ b/api/src/test/java/jakarta/data/spi/expression/path/NavigablePathTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,9 +17,15 @@ */ package jakarta.data.spi.expression.path; +import java.time.LocalDate; + import jakarta.data.expression.NavigableExpression; +import jakarta.data.metamodel.BooleanAttribute; +import jakarta.data.metamodel.ComparableAttribute; import jakarta.data.metamodel.NavigableAttribute; -import jakarta.data.spi.expression.path.NavigablePath; +import jakarta.data.metamodel.NumericAttribute; +import jakarta.data.metamodel.TemporalAttribute; +import jakarta.data.metamodel.TextAttribute; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.DisplayName; @@ -30,17 +36,48 @@ */ class NavigablePathTest { - static class Publisher { + static enum BusinessType { + COMMERCIAL, + GOVERNMENT, + NONPROFIT + } + + static class BusinessInfo { + Boolean active; + LocalDate founded; String name; + BusinessType type; + int zipcode; + } + + static class Publisher { + BusinessInfo info; } static class Book { Publisher publisher; } + interface _BusinessInfo { + BooleanAttribute active = + BooleanAttribute.of(BusinessInfo.class, "active", Boolean.class); + + TemporalAttribute founded = + TemporalAttribute.of(BusinessInfo.class, "founded", LocalDate.class); + + TextAttribute name = + TextAttribute.of(BusinessInfo.class, "name"); + + ComparableAttribute type = + ComparableAttribute.of(BusinessInfo.class, "type", BusinessType.class); + + NumericAttribute zipcode = + NumericAttribute.of(BusinessInfo.class, "zipcode", int.class); + } + interface _Publisher { - NavigableAttribute name = - NavigableAttribute.of(Publisher.class, "name", String.class); + NavigableAttribute info = + NavigableAttribute.of(Publisher.class, "info", BusinessInfo.class); } interface _Book { @@ -49,18 +86,117 @@ interface _Book { } @Test - @DisplayName("should create NavigablePath from expression and attribute") + @DisplayName("should create BooleanPath from path and attribute") + void shouldCreateBooleanPath() { + BooleanAttribute publisherInfoActive = + _Book.publisher.navigate(_Publisher.info) + .navigate(_BusinessInfo.active); + + SoftAssertions.assertSoftly(soft -> { + soft.assertThat(publisherInfoActive.name()) + .isEqualTo("publisher.info.active"); + soft.assertThat(publisherInfoActive.asc().property()) + .isEqualTo("publisher.info.active"); + soft.assertThat(publisherInfoActive.desc().property()) + .isEqualTo("publisher.info.active"); + soft.assertThat(publisherInfoActive.toString()) + .isEqualTo("book.publisher.info.active"); + }); + } + + @Test + @DisplayName("should create ComparablePath from path and attribute") + void shouldCreateComparablePath() { + ComparableAttribute publisherBusinessInfoType = + _Book.publisher.navigate(_Publisher.info) + .navigate(_BusinessInfo.type); + + SoftAssertions.assertSoftly(soft -> { + soft.assertThat(publisherBusinessInfoType.name()) + .isEqualTo("publisher.info.type"); + soft.assertThat(publisherBusinessInfoType.asc().property()) + .isEqualTo("publisher.info.type"); + soft.assertThat(publisherBusinessInfoType.desc().property()) + .isEqualTo("publisher.info.type"); + soft.assertThat(publisherBusinessInfoType.toString()) + .isEqualTo("book.publisher.info.type"); + }); + } + + @Test + @DisplayName("should create NavigablePath from path and attribute") void shouldCreateNavigablePath() { - NavigableExpression expr = _Book.publisher; - NavigableAttribute attr = _Publisher.name; - var path = NavigablePath.of(expr, attr); + SoftAssertions.assertSoftly(soft -> { + soft.assertThat(_Book.publisher.name()) + .isEqualTo("publisher"); + soft.assertThat(_Book.publisher.toString()) + .isEqualTo("book.publisher"); + }); + + NavigableExpression publisherInfo = + _Book.publisher.navigate(_Publisher.info); + + SoftAssertions.assertSoftly(soft -> { + soft.assertThat(publisherInfo.toString()) + .isEqualTo("book.publisher.info"); + }); + } + + @Test + @DisplayName("should create NumericPath from path and attribute") + void shouldCreateNumericPath() { + NumericAttribute publisherInfoZipcode = + _Book.publisher.navigate(_Publisher.info) + .navigate(_BusinessInfo.zipcode); + + SoftAssertions.assertSoftly(soft -> { + soft.assertThat(publisherInfoZipcode.name()) + .isEqualTo("publisher.info.zipcode"); + soft.assertThat(publisherInfoZipcode.asc().property()) + .isEqualTo("publisher.info.zipcode"); + soft.assertThat(publisherInfoZipcode.desc().property()) + .isEqualTo("publisher.info.zipcode"); + soft.assertThat(publisherInfoZipcode.toString()) + .isEqualTo("book.publisher.info.zipcode"); + }); + } + + @Test + @DisplayName("should create TemporalPath from path and attribute") + void shouldCreateTemporalPath() { + TemporalAttribute publisherInfoFounded = + _Book.publisher.navigate(_Publisher.info) + .navigate(_BusinessInfo.founded); + + SoftAssertions.assertSoftly(soft -> { + soft.assertThat(publisherInfoFounded.name()) + .isEqualTo("publisher.info.founded"); + soft.assertThat(publisherInfoFounded.asc().property()) + .isEqualTo("publisher.info.founded"); + soft.assertThat(publisherInfoFounded.desc().property()) + .isEqualTo("publisher.info.founded"); + soft.assertThat(publisherInfoFounded.toString()) + .isEqualTo("book.publisher.info.founded"); + }); + } + + @Test + @DisplayName("should create TextPath from path and attribute") + void shouldCreateTextPath() { + TextAttribute publisherInfoName = + _Book.publisher.navigate(_Publisher.info) + .navigate(_BusinessInfo.name); SoftAssertions.assertSoftly(soft -> { - soft.assertThat(path).isNotNull(); - soft.assertThat(path).isInstanceOf(NavigableExpression.class); - soft.assertThat(path.toString()) - .isEqualTo("book.publisher.name"); + soft.assertThat(publisherInfoName.name()) + .isEqualTo("publisher.info.name"); + soft.assertThat(publisherInfoName.asc().property()) + .isEqualTo("publisher.info.name"); + soft.assertThat(publisherInfoName.descIgnoreCase().property()) + .isEqualTo("publisher.info.name"); + soft.assertThat(publisherInfoName.toString()) + .isEqualTo("book.publisher.info.name"); }); } }