From 96c4a887910ba5e9006eb0df3c3a321eefd98cae Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Mon, 6 Aug 2018 16:10:12 +0200
Subject: [PATCH] Merging query attributes.

---
 solve/src/main/jastadd/ModelNavigation.jrag   |  9 ---
 solve/src/main/jastadd/queries.jrag           | 76 +++++++------------
 .../de/tudresden/inf/st/ttc18live/Main.java   | 10 +--
 .../inf/st/ttc18live/SolutionQ1.java          |  4 +-
 .../inf/st/ttc18live/SolutionQ2.java          |  4 +-
 .../st/ttc18live/test/Query1SortingTest.java  |  2 +-
 6 files changed, 39 insertions(+), 66 deletions(-)

diff --git a/solve/src/main/jastadd/ModelNavigation.jrag b/solve/src/main/jastadd/ModelNavigation.jrag
index 9cc5ed4..c48e154 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 b61f0cd..99809e4 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 4c3ab71..cae22a2 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 5290a1c..f5d3ccb 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 9ad4ff3..1003b68 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 4dbcc13..aef837b 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);
-- 
GitLab