diff --git a/src/main/java/org/rosi_project/model_sync/model_join/representation/util/JoinFactory.java b/src/main/java/org/rosi_project/model_sync/model_join/representation/util/JoinFactory.java index bd873738be32d3169868662f1f048e01480db08e..b22e6e91fc9b1e3e4a208c1fc66aba3879e12c43 100644 --- a/src/main/java/org/rosi_project/model_sync/model_join/representation/util/JoinFactory.java +++ b/src/main/java/org/rosi_project/model_sync/model_join/representation/util/JoinFactory.java @@ -72,50 +72,12 @@ public class JoinFactory { protected ClassResource right; protected ClassResource target; protected List<KeepExpression> keeps = new ArrayList<>(); - } - - /** - * The {@code OuterJoinBuilder} takes care of setting up new {@link OuterJoinExpression} - * instances. - * - * @see OuterJoinExpression - */ - public static class OuterJoinBuilder extends AbstractJoinBuilder { - - private OuterJoinExpression.JoinDirection direction; - - /** - * Default constructor. - * <p> - * {@code private} to prevent direct instantiation. - */ - private OuterJoinBuilder() { - // pass - } - - /** - * Configures the join to use the right source model as the primary one. - */ - @Nonnull - public OuterJoinBuilder rightOuter() { - direction = JoinDirection.RIGHT; - return this; - } - - /** - * Configures the join to use the left source model as the primary one. - */ - @Nonnull - public OuterJoinBuilder leftOuter() { - direction = JoinDirection.LEFT; - return this; - } - + /** * Specifies the left source. */ @Nonnull - public OuterJoinBuilder join(@Nonnull ClassResource left) { + public AbstractJoinBuilder join(@Nonnull ClassResource left) { this.left = left; return this; } @@ -124,7 +86,7 @@ public class JoinFactory { * Specifies the right source. */ @Nonnull - public OuterJoinBuilder with(@Nonnull ClassResource right) { + public AbstractJoinBuilder with(@Nonnull ClassResource right) { this.right = right; return this; } @@ -133,7 +95,7 @@ public class JoinFactory { * Specifies the name of the resulting class. */ @Nonnull - public OuterJoinBuilder as(@Nonnull ClassResource target) { + public AbstractJoinBuilder as(@Nonnull ClassResource target) { this.target = target; return this; } @@ -142,72 +104,76 @@ public class JoinFactory { * Specifies a field that should be contained in the resulting view. */ @Nonnull - public OuterJoinBuilder keep(@Nonnull KeepExpression keep) { + public AbstractJoinBuilder keep(@Nonnull KeepExpression keep) { this.keeps.add(keep); return this; } - - /** - * Finishes the construction process and provides the resulting {@code join}. - */ - @Nonnull - public OuterJoinExpression done() { - return new OuterJoinExpression(left, right, target, direction, keeps); - } + + public abstract JoinExpression done(); } /** - * The {@code NaturalJoinBuilder} takes care of setting up new {@link NaturalJoinExpression} + * The {@code OuterJoinBuilder} takes care of setting up new {@link OuterJoinExpression} * instances. * - * @see NaturalJoinExpression + * @see OuterJoinExpression */ - public static class NaturalJoinBuilder extends AbstractJoinBuilder { + public static class OuterJoinBuilder extends AbstractJoinBuilder { + + private OuterJoinExpression.JoinDirection direction; /** * Default constructor. * <p> * {@code private} to prevent direct instantiation. */ - private NaturalJoinBuilder() { + private OuterJoinBuilder() { // pass } /** - * Specifies the left source. + * Configures the join to use the right source model as the primary one. */ @Nonnull - public NaturalJoinBuilder join(@Nonnull ClassResource left) { - this.left = left; + public OuterJoinBuilder rightOuter() { + direction = JoinDirection.RIGHT; return this; } /** - * Specifies the right source. + * Configures the join to use the left source model as the primary one. */ @Nonnull - public NaturalJoinBuilder with(@Nonnull ClassResource right) { - this.right = right; + public OuterJoinBuilder leftOuter() { + direction = JoinDirection.LEFT; return this; - } + } /** - * Specifies the name of the resulting class. + * Finishes the construction process and provides the resulting {@code join}. */ @Nonnull - public NaturalJoinBuilder as(@Nonnull ClassResource target) { - this.target = target; - return this; + public OuterJoinExpression done() { + return new OuterJoinExpression(left, right, target, direction, keeps); } + } + + /** + * The {@code NaturalJoinBuilder} takes care of setting up new {@link NaturalJoinExpression} + * instances. + * + * @see NaturalJoinExpression + */ + public static class NaturalJoinBuilder extends AbstractJoinBuilder { /** - * Specifies a field that should be contained in the resulting view. + * Default constructor. + * <p> + * {@code private} to prevent direct instantiation. */ - @Nonnull - public NaturalJoinBuilder keep(@Nonnull KeepExpression keep) { - this.keeps.add(keep); - return this; - } + private NaturalJoinBuilder() { + // pass + } /** * Finishes the construction process and provides the resulting {@code join}. @@ -235,34 +201,7 @@ public class JoinFactory { */ private ThetaJoinBuilder() { // pass - } - - /** - * Specifies the left source. - */ - @Nonnull - public ThetaJoinBuilder join(@Nonnull ClassResource left) { - this.left = left; - return this; - } - - /** - * Specifies the right source. - */ - @Nonnull - public ThetaJoinBuilder with(@Nonnull ClassResource right) { - this.right = right; - return this; - } - - /** - * Specifies the name of the resulting class. - */ - @Nonnull - public ThetaJoinBuilder as(@Nonnull ClassResource target) { - this.target = target; - return this; - } + } /** * Specifies the join condition. @@ -281,15 +220,6 @@ public class JoinFactory { return where(OCLConstraint.of(oclCondition)); } - /** - * Specifies a field that should be contained in the resulting view. - */ - @Nonnull - public ThetaJoinBuilder keep(@Nonnull KeepExpression keep) { - this.keeps.add(keep); - return this; - } - /** * Finishes the construction process and provides the resulting {@code join}. */ diff --git a/src/main/java/org/rosi_project/model_sync/model_join/representation/util/ModelJoinBuilder.java b/src/main/java/org/rosi_project/model_sync/model_join/representation/util/ModelJoinBuilder.java index c92b525cc3cab941a9524c8b396b0de39958d25c..b5daa77a68a168b3ee5d7f3bba23d7694d955015 100644 --- a/src/main/java/org/rosi_project/model_sync/model_join/representation/util/ModelJoinBuilder.java +++ b/src/main/java/org/rosi_project/model_sync/model_join/representation/util/ModelJoinBuilder.java @@ -9,10 +9,13 @@ import org.rosi_project.model_sync.model_join.representation.grammar.JoinExpress import org.rosi_project.model_sync.model_join.representation.grammar.KeepAttributesExpression; import org.rosi_project.model_sync.model_join.representation.grammar.KeepReferenceExpression; import org.rosi_project.model_sync.model_join.representation.grammar.KeepReferenceExpression.KeepReferenceBuilder; +import org.rosi_project.model_sync.model_join.representation.grammar.KeepSubTypeExpression; +import org.rosi_project.model_sync.model_join.representation.grammar.KeepSubTypeExpression.KeepSubTypeBuilder; import org.rosi_project.model_sync.model_join.representation.grammar.KeepSuperTypeExpression; import org.rosi_project.model_sync.model_join.representation.grammar.KeepSuperTypeExpression.KeepSuperTypeBuilder; import org.rosi_project.model_sync.model_join.representation.grammar.ModelJoinExpression; import org.rosi_project.model_sync.model_join.representation.util.JoinFactory.NaturalJoinBuilder; +import org.rosi_project.model_sync.model_join.representation.util.JoinFactory.OuterJoinBuilder; import org.rosi_project.model_sync.model_join.representation.util.JoinFactory.ThetaJoinBuilder; /** @@ -30,6 +33,10 @@ public class ModelJoinBuilder { public static NaturalJoinBuilder naturalJoin() { return JoinFactory.createNew().natural(); } + + public static OuterJoinBuilder outerJoin() { + return JoinFactory.createNew().outer(); + } public static KeepAttributesExpression attributes(AttributePath firstAttribute, AttributePath... moreAttributes) { return KeepAttributesExpression.keepAttributes(firstAttribute, moreAttributes); @@ -38,10 +45,18 @@ public class ModelJoinBuilder { public static KeepReferenceBuilder outgoing(AttributePath attr) { return KeepReferenceExpression.keep().outgoing(attr); } + + public static KeepReferenceBuilder incoming(AttributePath attr) { + return KeepReferenceExpression.keep().incoming(attr); + } public static KeepSuperTypeBuilder supertype(ClassResource supertype) { return KeepSuperTypeExpression.keep().supertype(supertype); } + + public static KeepSubTypeBuilder subtype(ClassResource subtype) { + return KeepSubTypeExpression.keep().subtype(subtype); + } /** * Starts the construction process for a new {@link ModelJoinExpression}. diff --git a/src/main/java/org/rosi_project/model_sync/modelrepresentation/ModelJoinCreation.java b/src/main/java/org/rosi_project/model_sync/modelrepresentation/ModelJoinCreation.java index 44fa819a32695600f414d3adb075e0d8c4411cb6..6db9adf545602863afb2209a577014c7d30c3de4 100644 --- a/src/main/java/org/rosi_project/model_sync/modelrepresentation/ModelJoinCreation.java +++ b/src/main/java/org/rosi_project/model_sync/modelrepresentation/ModelJoinCreation.java @@ -42,6 +42,7 @@ public class ModelJoinCreation { ClassResource library = ClassResource.from("lib", "Library"); ClassResource employee = ClassResource.from("lib", "Employee"); ClassResource person = ClassResource.from("lib", "Person"); + //ClassResource.fromQualifiedName("lib.Library"); //ClassResource jointargetMovie = ClassResource.from("jointarget", "Movie"); //ClassResource jointargetVote = ClassResource.from("jointarget", "Vote"); diff --git a/src/test/java/org/rosi_project/model_sync/model_join/representation/writer/TestedModels.java b/src/test/java/org/rosi_project/model_sync/model_join/representation/writer/TestedModels.java index 12ab7c144319e4a5a33174852cf402f2e22e644f..ad0da375f1164c652a42b83d828597b8e96ef766 100644 --- a/src/test/java/org/rosi_project/model_sync/model_join/representation/writer/TestedModels.java +++ b/src/test/java/org/rosi_project/model_sync/model_join/representation/writer/TestedModels.java @@ -4,10 +4,15 @@ import static org.rosi_project.model_sync.model_join.representation.util.ModelJo import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.outgoing; import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.supertype; import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.thetaJoin; +import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.naturalJoin; +import org.rosi_project.model_sync.model_join.representation.grammar.KeepAttributesExpression; +import org.rosi_project.model_sync.model_join.representation.grammar.KeepExpression; import org.rosi_project.model_sync.model_join.representation.core.AttributePath; import org.rosi_project.model_sync.model_join.representation.core.ClassResource; import org.rosi_project.model_sync.model_join.representation.grammar.ModelJoinExpression; +import org.rosi_project.model_sync.model_join.representation.util.JoinFactory.ThetaJoinBuilder; +import org.rosi_project.model_sync.model_join.representation.util.JoinFactory; import org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder; class TestedModels { @@ -32,14 +37,14 @@ class TestedModels { static final AttributePath imdbVoteScore = AttributePath.from("imdb.Vote", "score"); static final AttributePath libraryAudioVisualItemMinutesLength = AttributePath.from(libraryAudioVisualItem, "minutesLength"); + //static final ThetaJoinBuilder tjb = (ThetaJoinBuilder)JoinFactory.createNew().theta().join(imdbFilm).with(libraryVideoCassette).as(jointargetMovie); static final ModelJoinExpression asModelJoin = ModelJoinBuilder.createNewModelJoin() .add(thetaJoin() + .where("library.VideoCassette.cast->forAll (p | imdb.Film.figures->playedBy->exists (a | p.firstname.concat(\" \") .concat(p.lastName) == a.name))") .join(imdbFilm) .with(libraryVideoCassette) .as(jointargetMovie) - .where( - "library.VideoCassette.cast->forAll (p | imdb.Film.figures->playedBy->exists (a | p.firstname.concat(\" \") .concat(p.lastName) == a.name))") - .keep(attributes(imdbFilmYear)) + .keep(attributes(imdbFilmYear)) .keep(outgoing(imdbFilmVotes) .as(jointargetVote) .keep(attributes(imdbVoteScore)) @@ -52,6 +57,26 @@ class TestedModels { ) .done()) .build(); + /*static final KeepAttributesExpression ke = attributes(imdbFilmYear); + + static final ModelJoinExpression asModelJoin = ModelJoinBuilder.createNewModelJoin() + .add(naturalJoin() + .join(imdbFilm) + .with(libraryVideoCassette) + .as(jointargetMovie) + .keep(ke) + .keep(outgoing(imdbFilmVotes) + .as(jointargetVote) + .keep(attributes(imdbVoteScore)) + .buildExpression() + ) + .keep(supertype(libraryAudioVisualItem) + .as(jointargetMediaItem) + .keep(attributes(libraryAudioVisualItemMinutesLength)) + .buildExpression() + ) + .done()) + .build();*/ static final String asString = "theta join imdb.Film with library.VideoCassette as jointarget.Movie\n" + "where library.VideoCassette.cast->forAll (p | imdb.Film.figures->playedBy->exists (a | p.\n"