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 {
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,71 +104,75 @@ 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);
}
}
/**
* Specifies a field that should be contained in the resulting view.
* The {@code NaturalJoinBuilder} takes care of setting up new {@link NaturalJoinExpression}
* instances.
*
* @see NaturalJoinExpression
*/
@Nonnull
public NaturalJoinBuilder keep(@Nonnull KeepExpression keep) {
this.keeps.add(keep);
return this;
public static class NaturalJoinBuilder extends AbstractJoinBuilder {
/**
* Default constructor.
* <p>
* {@code private} to prevent direct instantiation.
*/
private NaturalJoinBuilder() {
// pass
}
/**
......@@ -237,33 +203,6 @@ public class JoinFactory {
// 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}.
*/
......
......@@ -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;
/**
......@@ -31,6 +34,10 @@ public class ModelJoinBuilder {
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);
}
......@@ -39,10 +46,18 @@ public class ModelJoinBuilder {
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}.
*/
......
......@@ -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");
......
......@@ -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,13 +37,13 @@ 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(outgoing(imdbFilmVotes)
.as(jointargetVote)
......@@ -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"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment