diff --git a/solve/src/main/jastadd/ModelNavigation.jrag b/solve/src/main/jastadd/ModelNavigation.jrag index 9cc5ed4da66b47b82f8ac900e35338e4a912c7db..c48e1541bdf3aadf946ac9f78df85f5d7a98e4b9 100644 --- a/solve/src/main/jastadd/ModelNavigation.jrag +++ b/solve/src/main/jastadd/ModelNavigation.jrag @@ -111,13 +111,4 @@ aspect ModelNavigation { syn Comment ModelElement.asComment() = null; eq Comment.asComment() = this; - // =================================================================================================================== - // going up - // =================================================================================================================== - - inh Post Comment.containingPost(); - eq Post.getComment().containingPost() = this; - eq Comment.getComment().containingPost() = containingPost(); - eq ModelChangeSet.getPendingNewElement().containingPost() = null; - } diff --git a/solve/src/main/jastadd/queries.jrag b/solve/src/main/jastadd/queries.jrag index b61f0cd1130aa1912992e2974455e233387fbf57..99809e41d4d0b3cfb749d26f63cd230be0ddea4f 100644 --- a/solve/src/main/jastadd/queries.jrag +++ b/solve/src/main/jastadd/queries.jrag @@ -1,5 +1,6 @@ aspect Queries { + syn int ModelElement.score() = 0; syn java.util.Set<User> User.getCommentLikerFriends(Comment comment) circular [new java.util.HashSet<User>()]; eq User.getCommentLikerFriends(Comment comment) { @@ -19,7 +20,7 @@ aspect Queries { return s; } - syn int Comment.score() { + eq Comment.score() { int score = 0; java.util.Set<java.util.Set<User>> commentLikerGroups = new java.util.HashSet(); for (User user : likedBy()) { @@ -32,32 +33,7 @@ aspect Queries { return score; } - syn String SocialNetwork.query2() { - Comment[] comments = new Comment[3]; - for (Comment comment : comments()) { - int score = comment.score(); - if (hasBetterQ2Score(comment, comments[2])) { - // at least better than #3 - if (hasBetterQ2Score(comment, comments[1])) { - comments[2] = comments[1]; - if (hasBetterQ2Score(comment, comments[0])) { - // new highscore - comments[1] = comments[0]; - comments[0] = comment; - } else { - // better than second - comments[1] = comment; - } - } else { - comments[2] = comment; - } - } -// System.out.println(comment + ", " + java.util.Arrays.toString(comments)); - } - return comments[0].getId() + "|" + comments[1].getId() + "|" + comments[2].getId(); - } - - syn int Post.score() { + eq Post.score() { int result = 0; for (Comment comment : commentsForPost()) { result += 10 + comment.likedBy().size(); @@ -71,38 +47,44 @@ aspect Queries { return result; } - syn String SocialNetwork.query1() { - Post[] posts = new Post[3]; - for (Post post : getPostList()) { - int score = post.score(); - if (hasBetterQ1Score(post, posts[2])) { + syn String SocialNetwork.query(int queryId) { + Iterable<? extends Submission> l; + switch (queryId) { + case 1: l = getPostList(); break; + case 2: l = comments(); break; + default: return null; + } + Submission[] elements = new Submission[3]; + for (Submission elem : l) { + int score = elem.score(); + if (elem.hasBetterScoreThan(elements[2])) { // at least better than #3 - if (hasBetterQ1Score(post, posts[1])) { - posts[2] = posts[1]; - if (hasBetterQ1Score(post, posts[0])) { + if (elem.hasBetterScoreThan(elements[1])) { + elements[2] = elements[1]; + if (elem.hasBetterScoreThan(elements[0])) { // new highscore - posts[1] = posts[0]; - posts[0] = post; + elements[1] = elements[0]; + elements[0] = elem; } else { // better than second - posts[1] = post; + elements[1] = elem; } } else { - posts[2] = post; + elements[2] = elem; } } } - return posts[0].getId() + "|" + posts[1].getId() + "|" + posts[2].getId(); + return elements[0].getId() + "|" + elements[1].getId() + "|" + elements[2].getId(); } - private boolean SocialNetwork.hasBetterQ1Score(Post myPost, Post oldPost) { - return oldPost == null || myPost.score() > oldPost.score() || - (myPost.score() == oldPost.score() && myPost.getTimestamp() > oldPost.getTimestamp()); + syn boolean Submission.hasBetterScoreThan(Submission other) = false; + eq Post.hasBetterScoreThan(Submission other) { + return other == null || this.score() > other.score() || + (this.score() == other.score() && this.getTimestamp() > other.getTimestamp()); } - - private boolean SocialNetwork.hasBetterQ2Score(Comment myComment, Comment oldComment) { - return oldComment == null || myComment.score() > oldComment.score() || - (myComment.score() == oldComment.score() && myComment.getTimestamp() > oldComment.getTimestamp()); + eq Comment.hasBetterScoreThan(Submission other) { + return other == null || this.score() > other.score() || + (this.score() == other.score() && this.getTimestamp() > other.getTimestamp()); } } diff --git a/solve/src/main/java/de/tudresden/inf/st/ttc18live/Main.java b/solve/src/main/java/de/tudresden/inf/st/ttc18live/Main.java index 4c3ab71861562ac99854ff8192dac52a77c01262..cae22a25620362587a9d3b8afcb7dac824c1df9b 100644 --- a/solve/src/main/java/de/tudresden/inf/st/ttc18live/Main.java +++ b/solve/src/main/java/de/tudresden/inf/st/ttc18live/Main.java @@ -125,7 +125,7 @@ public class Main { logger.info("{}.score: {}", comment, comment.score()); } - logger.info("sn.query2: {}", sn.query2()); + logger.info("sn.query2: {}", sn.query(2)); System.exit(0); } @@ -145,8 +145,8 @@ public class Main { logger.info("JastAdd model with {} users and {} posts", socialNetwork.getNumUser(), socialNetwork.getNumPost()); - logger.info("Query1: {}", socialNetwork.query1()); - logger.info("Query2: {}", socialNetwork.query2()); + logger.info("Query1: {}", socialNetwork.query(1)); + logger.info("Query2: {}", socialNetwork.query(2)); printQ2Scores(socialNetwork); for (int index = 1; index <= maxChanges; index++) { @@ -179,8 +179,8 @@ public class Main { logger.info("Validity after application of changes: {}", socialNetwork.isValid()); - logger.info("Query1 after change {}: {}", index, socialNetwork.query1()); - logger.info("Query2 after change {}: {}", index, socialNetwork.query2()); + logger.info("Query1 after change {}: {}", index, socialNetwork.query(1)); + logger.info("Query2 after change {}: {}", index, socialNetwork.query(2)); printQ2Scores(socialNetwork); } diff --git a/solve/src/main/java/de/tudresden/inf/st/ttc18live/SolutionQ1.java b/solve/src/main/java/de/tudresden/inf/st/ttc18live/SolutionQ1.java index 5290a1cfd3d0b33130fa334936774d6c93a8c2f1..f5d3ccb4eabb5e6aef4732474cf01661c86a2baa 100644 --- a/solve/src/main/java/de/tudresden/inf/st/ttc18live/SolutionQ1.java +++ b/solve/src/main/java/de/tudresden/inf/st/ttc18live/SolutionQ1.java @@ -8,13 +8,13 @@ public class SolutionQ1 extends Solution { @Override public String Initial() { - return this.getSocialNetwork().query1(); + return this.getSocialNetwork().query(1); } @Override public String Update(ModelChangeSet changes) { apply(changes); - return this.getSocialNetwork().query1(); + return this.getSocialNetwork().query(1); } } diff --git a/solve/src/main/java/de/tudresden/inf/st/ttc18live/SolutionQ2.java b/solve/src/main/java/de/tudresden/inf/st/ttc18live/SolutionQ2.java index 9ad4ff3fd6cec791ea20ec385a9369a855695e58..1003b6830245222fe50f03c920941dc73df924ce 100644 --- a/solve/src/main/java/de/tudresden/inf/st/ttc18live/SolutionQ2.java +++ b/solve/src/main/java/de/tudresden/inf/st/ttc18live/SolutionQ2.java @@ -6,13 +6,13 @@ public class SolutionQ2 extends Solution { @Override public String Initial() { - return getSocialNetwork().query2(); + return getSocialNetwork().query(2); } @Override public String Update(ModelChangeSet changes) { apply(changes); - return getSocialNetwork().query2(); + return getSocialNetwork().query(2); } } diff --git a/solve/src/test/java/de/tudresden/inf/st/ttc18live/test/Query1SortingTest.java b/solve/src/test/java/de/tudresden/inf/st/ttc18live/test/Query1SortingTest.java index 4dbcc13c062b88d49e2428aca17dc580bf2e3c25..aef837be775860c534140f333c0815a1bfcd8159 100644 --- a/solve/src/test/java/de/tudresden/inf/st/ttc18live/test/Query1SortingTest.java +++ b/solve/src/test/java/de/tudresden/inf/st/ttc18live/test/Query1SortingTest.java @@ -99,7 +99,7 @@ public class Query1SortingTest { private void assertQuery1(SocialNetwork sut, long firstId, long secondId, long thirdId) { printNetwork(sut); - String actualAnswer = sut.query1(); + String actualAnswer = sut.query(1); String[] ids = actualAnswer.split("\\|"); System.out.println("Got '" + actualAnswer + "'"); assertEquals(3, ids.length);