Skip to content
Snippets Groups Projects
Commit 19ffd5b7 authored by Chrissi's avatar Chrissi
Browse files

kleine Änderungen im bauen einer Model Join representation

parent eba459da
No related branches found
No related tags found
No related merge requests found
...@@ -72,50 +72,12 @@ public class JoinFactory { ...@@ -72,50 +72,12 @@ public class JoinFactory {
protected ClassResource right; protected ClassResource right;
protected ClassResource target; protected ClassResource target;
protected List<KeepExpression> keeps = new ArrayList<>(); 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. * Specifies the left source.
*/ */
@Nonnull @Nonnull
public OuterJoinBuilder join(@Nonnull ClassResource left) { public AbstractJoinBuilder join(@Nonnull ClassResource left) {
this.left = left; this.left = left;
return this; return this;
} }
...@@ -124,7 +86,7 @@ public class JoinFactory { ...@@ -124,7 +86,7 @@ public class JoinFactory {
* Specifies the right source. * Specifies the right source.
*/ */
@Nonnull @Nonnull
public OuterJoinBuilder with(@Nonnull ClassResource right) { public AbstractJoinBuilder with(@Nonnull ClassResource right) {
this.right = right; this.right = right;
return this; return this;
} }
...@@ -133,7 +95,7 @@ public class JoinFactory { ...@@ -133,7 +95,7 @@ public class JoinFactory {
* Specifies the name of the resulting class. * Specifies the name of the resulting class.
*/ */
@Nonnull @Nonnull
public OuterJoinBuilder as(@Nonnull ClassResource target) { public AbstractJoinBuilder as(@Nonnull ClassResource target) {
this.target = target; this.target = target;
return this; return this;
} }
...@@ -142,72 +104,76 @@ public class JoinFactory { ...@@ -142,72 +104,76 @@ public class JoinFactory {
* Specifies a field that should be contained in the resulting view. * Specifies a field that should be contained in the resulting view.
*/ */
@Nonnull @Nonnull
public OuterJoinBuilder keep(@Nonnull KeepExpression keep) { public AbstractJoinBuilder keep(@Nonnull KeepExpression keep) {
this.keeps.add(keep); this.keeps.add(keep);
return this; return this;
} }
/** public abstract JoinExpression done();
* Finishes the construction process and provides the resulting {@code join}.
*/
@Nonnull
public OuterJoinExpression done() {
return new OuterJoinExpression(left, right, target, direction, keeps);
}
} }
/** /**
* The {@code NaturalJoinBuilder} takes care of setting up new {@link NaturalJoinExpression} * The {@code OuterJoinBuilder} takes care of setting up new {@link OuterJoinExpression}
* instances. * instances.
* *
* @see NaturalJoinExpression * @see OuterJoinExpression
*/ */
public static class NaturalJoinBuilder extends AbstractJoinBuilder { public static class OuterJoinBuilder extends AbstractJoinBuilder {
private OuterJoinExpression.JoinDirection direction;
/** /**
* Default constructor. * Default constructor.
* <p> * <p>
* {@code private} to prevent direct instantiation. * {@code private} to prevent direct instantiation.
*/ */
private NaturalJoinBuilder() { private OuterJoinBuilder() {
// pass // pass
} }
/** /**
* Specifies the left source. * Configures the join to use the right source model as the primary one.
*/ */
@Nonnull @Nonnull
public NaturalJoinBuilder join(@Nonnull ClassResource left) { public OuterJoinBuilder rightOuter() {
this.left = left; direction = JoinDirection.RIGHT;
return this; return this;
} }
/** /**
* Specifies the right source. * Configures the join to use the left source model as the primary one.
*/ */
@Nonnull @Nonnull
public NaturalJoinBuilder with(@Nonnull ClassResource right) { public OuterJoinBuilder leftOuter() {
this.right = right; direction = JoinDirection.LEFT;
return this; return this;
} }
/** /**
* Specifies the name of the resulting class. * Finishes the construction process and provides the resulting {@code join}.
*/ */
@Nonnull @Nonnull
public NaturalJoinBuilder as(@Nonnull ClassResource target) { public OuterJoinExpression done() {
this.target = target; return new OuterJoinExpression(left, right, target, direction, keeps);
return this;
} }
}
/**
* 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 private NaturalJoinBuilder() {
public NaturalJoinBuilder keep(@Nonnull KeepExpression keep) { // pass
this.keeps.add(keep); }
return this;
}
/** /**
* Finishes the construction process and provides the resulting {@code join}. * Finishes the construction process and provides the resulting {@code join}.
...@@ -235,34 +201,7 @@ public class JoinFactory { ...@@ -235,34 +201,7 @@ public class JoinFactory {
*/ */
private ThetaJoinBuilder() { private ThetaJoinBuilder() {
// pass // 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. * Specifies the join condition.
...@@ -281,15 +220,6 @@ public class JoinFactory { ...@@ -281,15 +220,6 @@ public class JoinFactory {
return where(OCLConstraint.of(oclCondition)); 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}. * Finishes the construction process and provides the resulting {@code join}.
*/ */
......
...@@ -9,10 +9,13 @@ import org.rosi_project.model_sync.model_join.representation.grammar.JoinExpress ...@@ -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.KeepAttributesExpression;
import org.rosi_project.model_sync.model_join.representation.grammar.KeepReferenceExpression; 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.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;
import org.rosi_project.model_sync.model_join.representation.grammar.KeepSuperTypeExpression.KeepSuperTypeBuilder; 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.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.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; import org.rosi_project.model_sync.model_join.representation.util.JoinFactory.ThetaJoinBuilder;
/** /**
...@@ -30,6 +33,10 @@ public class ModelJoinBuilder { ...@@ -30,6 +33,10 @@ public class ModelJoinBuilder {
public static NaturalJoinBuilder naturalJoin() { public static NaturalJoinBuilder naturalJoin() {
return JoinFactory.createNew().natural(); return JoinFactory.createNew().natural();
} }
public static OuterJoinBuilder outerJoin() {
return JoinFactory.createNew().outer();
}
public static KeepAttributesExpression attributes(AttributePath firstAttribute, AttributePath... moreAttributes) { public static KeepAttributesExpression attributes(AttributePath firstAttribute, AttributePath... moreAttributes) {
return KeepAttributesExpression.keepAttributes(firstAttribute, moreAttributes); return KeepAttributesExpression.keepAttributes(firstAttribute, moreAttributes);
...@@ -38,10 +45,18 @@ public class ModelJoinBuilder { ...@@ -38,10 +45,18 @@ public class ModelJoinBuilder {
public static KeepReferenceBuilder outgoing(AttributePath attr) { public static KeepReferenceBuilder outgoing(AttributePath attr) {
return KeepReferenceExpression.keep().outgoing(attr); return KeepReferenceExpression.keep().outgoing(attr);
} }
public static KeepReferenceBuilder incoming(AttributePath attr) {
return KeepReferenceExpression.keep().incoming(attr);
}
public static KeepSuperTypeBuilder supertype(ClassResource supertype) { public static KeepSuperTypeBuilder supertype(ClassResource supertype) {
return KeepSuperTypeExpression.keep().supertype(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}. * Starts the construction process for a new {@link ModelJoinExpression}.
......
...@@ -42,6 +42,7 @@ public class ModelJoinCreation { ...@@ -42,6 +42,7 @@ public class ModelJoinCreation {
ClassResource library = ClassResource.from("lib", "Library"); ClassResource library = ClassResource.from("lib", "Library");
ClassResource employee = ClassResource.from("lib", "Employee"); ClassResource employee = ClassResource.from("lib", "Employee");
ClassResource person = ClassResource.from("lib", "Person"); ClassResource person = ClassResource.from("lib", "Person");
//ClassResource.fromQualifiedName("lib.Library");
//ClassResource jointargetMovie = ClassResource.from("jointarget", "Movie"); //ClassResource jointargetMovie = ClassResource.from("jointarget", "Movie");
//ClassResource jointargetVote = ClassResource.from("jointarget", "Vote"); //ClassResource jointargetVote = ClassResource.from("jointarget", "Vote");
......
...@@ -4,10 +4,15 @@ import static org.rosi_project.model_sync.model_join.representation.util.ModelJo ...@@ -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.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.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.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.AttributePath;
import org.rosi_project.model_sync.model_join.representation.core.ClassResource; 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.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; import org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder;
class TestedModels { class TestedModels {
...@@ -32,14 +37,14 @@ class TestedModels { ...@@ -32,14 +37,14 @@ class TestedModels {
static final AttributePath imdbVoteScore = AttributePath.from("imdb.Vote", "score"); static final AttributePath imdbVoteScore = AttributePath.from("imdb.Vote", "score");
static final AttributePath libraryAudioVisualItemMinutesLength = AttributePath.from(libraryAudioVisualItem, "minutesLength"); 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() static final ModelJoinExpression asModelJoin = ModelJoinBuilder.createNewModelJoin()
.add(thetaJoin() .add(thetaJoin()
.where("library.VideoCassette.cast->forAll (p | imdb.Film.figures->playedBy->exists (a | p.firstname.concat(\" \") .concat(p.lastName) == a.name))")
.join(imdbFilm) .join(imdbFilm)
.with(libraryVideoCassette) .with(libraryVideoCassette)
.as(jointargetMovie) .as(jointargetMovie)
.where( .keep(attributes(imdbFilmYear))
"library.VideoCassette.cast->forAll (p | imdb.Film.figures->playedBy->exists (a | p.firstname.concat(\" \") .concat(p.lastName) == a.name))")
.keep(attributes(imdbFilmYear))
.keep(outgoing(imdbFilmVotes) .keep(outgoing(imdbFilmVotes)
.as(jointargetVote) .as(jointargetVote)
.keep(attributes(imdbVoteScore)) .keep(attributes(imdbVoteScore))
...@@ -52,6 +57,26 @@ class TestedModels { ...@@ -52,6 +57,26 @@ class TestedModels {
) )
.done()) .done())
.build(); .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" 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" + "where library.VideoCassette.cast->forAll (p | imdb.Film.figures->playedBy->exists (a | p.\n"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment