From 9adee7bbfd60b37bc5fd2cd507f915e02f98511e Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Thu, 9 Aug 2018 12:44:33 +0200
Subject: [PATCH] Removing unused attributes, and fixing non-relast variants.

- Access to SocialNetwork only need for non-relast
- Resolving model elements moved from attributes to map maintained in translator
- Let EMF only load model, and fail afterwards (as query + update is the same as in other variants)
---
 cp-to-solution.sh                             |  5 +-
 solve/src/main/jastadd/ModelNavigation.jrag   | 66 +++-------------
 solve/src/main/jastadd/Refs.jadd.unused       | 13 ++++
 solve/src/main/jastadd/queries.jrag           | 12 +--
 .../st/ttc18live/LiveContestDriverEMF.java    |  5 ++
 .../st/ttc18live/LiveContestDriverXml.java    |  7 +-
 .../de/tudresden/inf/st/ttc18live/Main.java   | 75 ++++---------------
 .../translator/XmlToJastaddTranslator.java    | 43 +++++++----
 8 files changed, 82 insertions(+), 144 deletions(-)

diff --git a/cp-to-solution.sh b/cp-to-solution.sh
index 5d2df2e..00c6a00 100755
--- a/cp-to-solution.sh
+++ b/cp-to-solution.sh
@@ -89,10 +89,11 @@ build "jastadd-ttc18-xml"
 revert_namelookup
 
 # workaround for failing build
+echo ">> Prepare building relast building"
 sleep 1
-./gradlew --console=plain preprocess jastadd build
+./gradlew --console=plain preprocess jastadd build 2> /dev/null
 sleep 1
-./gradlew --console=plain preprocess jastadd build
+./gradlew --console=plain preprocess jastadd build 2> /dev/null
 
 # Build jastadd-ttc18-xml
 sed -i 's/LiveContestDriverEMF/LiveContestDriverXml/' solve/build.gradle
diff --git a/solve/src/main/jastadd/ModelNavigation.jrag b/solve/src/main/jastadd/ModelNavigation.jrag
index c48e154..7571a71 100644
--- a/solve/src/main/jastadd/ModelNavigation.jrag
+++ b/solve/src/main/jastadd/ModelNavigation.jrag
@@ -3,30 +3,6 @@ import java.util.HashMap;
 
 aspect ModelNavigation {
 
-  // ===================================================================================================================
-  // resolving
-  // ===================================================================================================================
-
-  syn User SocialNetwork.resolveUser(Long id) = userMap().get(id);
-
-  syn Map<Long, User> SocialNetwork.userMap() {
-    java.util.Map<Long, User> users = new HashMap<>();
-    for (User user : getUserList()) {
-      users.put(user.getId(), user);
-    }
-    return users;
-  }
-
-  syn Comment SocialNetwork.resolveComment(Long id) = commentMap().get(id);
-
-  syn Map<Long, Comment> SocialNetwork.commentMap() {
-    java.util.Map<Long, Comment> comments = new HashMap<>();
-    for (Comment comment : comments()) {
-      comments.put(comment.getId(), comment);
-    }
-    return comments;
-  }
-
   syn java.util.List<Comment> SocialNetwork.comments() {
     java.util.List<Comment> result = new java.util.ArrayList<>();
     for (Post post : getPostList()) {
@@ -46,37 +22,6 @@ aspect ModelNavigation {
     }
   }
 
-  syn Post SocialNetwork.resolvePost(Long id) = postMap().get(id);
-
-  syn Map<Long, Post> SocialNetwork.postMap() {
-    java.util.Map<Long, Post> posts = new HashMap<>();
-    for (Post post : getPostList()) {
-      posts.put(post.getId(), post);
-    }
-    return posts;
-  }
-
-  // ===================================================================================================================
-  // root access
-  // ===================================================================================================================
-
-  inh SocialNetwork ModelElement.socialNetwork();
-//  inh SocialNetwork User.socialNetwork();
-  eq SocialNetwork.getUser().socialNetwork() = this;
-
-//  inh SocialNetwork Post.socialNetwork();
-  eq SocialNetwork.getPost().socialNetwork() = this;
-//  eq CompositionListInsertion.getAddedElement().socialNetwork() = socialNetwork();
-
-//  eq Post.getComment(int i).socialNetwork() = socialNetwork();
-
-//  inh SocialNetwork Comment.socialNetwork();
-  eq Post.getComment().socialNetwork() = socialNetwork();
-
-  inh SocialNetwork ModelChange.socialNetwork();
-  eq ModelChangeSet.getModelChange().socialNetwork() = getSocialNetwork();
-  eq ModelChangeSet.getPendingNewElement().socialNetwork() = getSocialNetwork();
-
   // ===================================================================================================================
   // casting
   // ===================================================================================================================
@@ -111,4 +56,15 @@ aspect ModelNavigation {
   syn Comment ModelElement.asComment() = null;
   eq Comment.asComment() = this;
 
+  // (un)cache instructions
+  uncache ModelElement.isSocialNetwork();
+  uncache ModelElement.isPost();
+  uncache ModelElement.isSubmission();
+  uncache ModelElement.isUser();
+  uncache ModelElement.isComment();
+  uncache ModelElement.asSocialNetwork();
+  uncache ModelElement.asPost();
+  uncache ModelElement.asSubmission();
+  uncache ModelElement.asUser();
+  uncache ModelElement.asComment();
 }
diff --git a/solve/src/main/jastadd/Refs.jadd.unused b/solve/src/main/jastadd/Refs.jadd.unused
index ac6e44f..f9f4974 100644
--- a/solve/src/main/jastadd/Refs.jadd.unused
+++ b/solve/src/main/jastadd/Refs.jadd.unused
@@ -27,6 +27,19 @@ aspect NameLookup {
     return result;
   }
 
+  // ===================================================================================================================
+  // root access
+  // ===================================================================================================================
+
+  inh SocialNetwork ModelElement.socialNetwork();
+  eq SocialNetwork.getUser().socialNetwork() = this;
+  eq SocialNetwork.getPost().socialNetwork() = this;
+  eq Post.getComment().socialNetwork() = socialNetwork();
+
+  inh SocialNetwork ModelChange.socialNetwork();
+  eq ModelChangeSet.getModelChange().socialNetwork() = getSocialNetwork();
+  eq ModelChangeSet.getPendingNewElement().socialNetwork() = getSocialNetwork();
+
   syn java.util.List<User> Comment.getLikedByList() = socialNetwork().getLikedByMap().get(this);
 
   syn Map<Comment, java.util.List<User>> SocialNetwork.getLikedByMap() {
diff --git a/solve/src/main/jastadd/queries.jrag b/solve/src/main/jastadd/queries.jrag
index d14c681..d149261 100644
--- a/solve/src/main/jastadd/queries.jrag
+++ b/solve/src/main/jastadd/queries.jrag
@@ -11,9 +11,7 @@ aspect Queries {
       for (Comment otherComment : f.getLikes()) {
         if (otherComment == comment) {
           s.add(f);
-          for (User commentLikerFriend : f.getCommentLikerFriends(comment)) {
-            s.add(commentLikerFriend);
-          }
+          s.addAll(f.getCommentLikerFriends(comment));
         }
       }
     }
@@ -76,14 +74,8 @@ aspect Queries {
     return elements[0].getId() + "|" + elements[1].getId() + "|" + elements[2].getId();
   }
 
-  syn boolean Submission.hasBetterScoreThan(Submission other) = false;
-  eq Post.hasBetterScoreThan(Submission other) {
+  syn boolean Submission.hasBetterScoreThan(Submission other) {
     return other == null || this.score() > other.score() ||
       (this.score() == other.score() && this.getTimestamp() > other.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/LiveContestDriverEMF.java b/solve/src/main/java/de/tudresden/inf/st/ttc18live/LiveContestDriverEMF.java
index a4af67f..e8d75ba 100644
--- a/solve/src/main/java/de/tudresden/inf/st/ttc18live/LiveContestDriverEMF.java
+++ b/solve/src/main/java/de/tudresden/inf/st/ttc18live/LiveContestDriverEMF.java
@@ -72,4 +72,9 @@ public class LiveContestDriverEMF extends AbstractLiveContestDriver {
     Changes.ModelChangeSet emfChanges = (Changes.ModelChangeSet) loadFile(String.format("change%02d.xmi", iteration));
     return translator.translateChangeSet(emfChanges);
   }
+
+  @Override
+  public void Initial() {
+    throw new RuntimeException();
+  }
 }
diff --git a/solve/src/main/java/de/tudresden/inf/st/ttc18live/LiveContestDriverXml.java b/solve/src/main/java/de/tudresden/inf/st/ttc18live/LiveContestDriverXml.java
index a98355a..a660de8 100644
--- a/solve/src/main/java/de/tudresden/inf/st/ttc18live/LiveContestDriverXml.java
+++ b/solve/src/main/java/de/tudresden/inf/st/ttc18live/LiveContestDriverXml.java
@@ -19,12 +19,15 @@ import java.nio.file.Paths;
  * @author jmey - Implementation of 2nd query
  */
 public class LiveContestDriverXml extends AbstractLiveContestDriver {
+
   public static void main(String[] args) {
     LiveContestDriverXml driver = new LiveContestDriverXml();
     Path filename = Paths.get(String.format("events-xml-%s-%s.csv", driver.getChangeSet(), driver.getQuery()));
     driver.enableTracing(filename).mainImpl();
   }
 
+  private XmlToJastaddTranslator translator = new XmlToJastaddTranslator();
+
   @Override
   SocialNetwork LoadImpl() throws Exception {
     JAXBContext jc = JAXBContext.newInstance(ParsedSocialNetwork.class);
@@ -33,7 +36,6 @@ public class LiveContestDriverXml extends AbstractLiveContestDriver {
     ParsedSocialNetwork parsedSocialNetwork = (ParsedSocialNetwork) unmarshaller.unmarshal(model1Content.toFile());
 //    logger.info("Users: {}, Posts: {}",
 //        parsedSocialNetwork.users.size(), parsedSocialNetwork.posts.size());
-    XmlToJastaddTranslator translator = new XmlToJastaddTranslator();
     return translator.translateSocialNetwork(parsedSocialNetwork);
   }
 
@@ -51,7 +53,6 @@ public class LiveContestDriverXml extends AbstractLiveContestDriver {
 //    logger.debug("Parsing {}", modelContent);
     ParsedModelChangeSet parsedModelChangeSet = (ParsedModelChangeSet) unmarshaller.unmarshal(modelContent.toFile());
 
-    XmlToJastaddTranslator translator = new XmlToJastaddTranslator();
-    return translator.translateModelChangeSet(parsedModelChangeSet, getSolution().getSocialNetwork());
+    return translator.translateModelChangeSet(parsedModelChangeSet);
   }
 }
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 908fbc0..57c256b 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
@@ -21,8 +21,8 @@ public class Main {
   private static Logger logger = LogManager.getLogger(Main.class);
 
   private static boolean splitApply = true;
-  private static int changeSet = 2;
-  private static int maxChanges = 5;
+  private static int changeSet = 128;
+  private static int maxChanges = 20;
 
   private static User mkUser(long id, SocialNetwork sn, Comment... likes) {
     User result = new User();
@@ -40,19 +40,9 @@ public class Main {
     }
   }
 
-  private static Post findContainingPost(Comment comment) {
-    // this should actually be done with an inherited attribute, but attributes needs to be flushed for this
-    ASTNode parent = comment.getParent();
-    while (parent != null && !(parent instanceof Post)) {
-      parent = parent.getParent();
-    }
-    return (Post) parent;
-  }
-
-  private static Comment mkComment(@SuppressWarnings("SameParameterValue") long id, Submission parent) {
+  private static Comment mkComment(long id, Submission parent) {
     Comment comment = new Comment();
     comment.setId(id);
-//    comment.setPost(findContainingPost(parent));
     comment.setTimestamp(id);
     parent.addComment(comment);
     return comment;
@@ -83,38 +73,6 @@ public class Main {
     report(sn, u1);
   }
 
-//  private static void testCS2() {
-//    SocialNetwork sn = SocialNetwork.createSocialNetwork();
-//
-//    Post post = new Post();
-//    post.setId(123L);
-//    sn.addPost(post);
-//
-//    Comment c725662 = mkComment(725662, post);
-//
-//    User u4555 = mkUser(4555, sn, c725662);
-//    User u4755 = mkUser(4755, sn, c725662);
-//    User u1103 = mkUser(1103, sn, c725662);
-//    User u768 = mkUser(768, sn, c725662);
-//    User u1222 = mkUser(1222, sn, c725662);
-//    User u1050 = mkUser(1050, sn, c725662);
-//    User u3055 = mkUser(3055, sn, c725662);
-//    User u1077 = mkUser(1077, sn, c725662);
-//    User u1922 = mkUser(1922, sn, c725662);
-//
-//
-//
-//    addFriends(u4555, u2608, u2783, u143, u4644, u2004, u1434, u2269, u1222, u1490);
-//    addFriends(u4755, u143, u2783);
-//    addFriends(u1103, u2783, u238, u143);
-//    addFriends(u768, u2783);
-//    addFriends(u1222, u2783, u4555);
-//    addFriends(u1050, u2783);
-//    addFriends(u3055, u2783);
-//    addFriends(u1077, u2783);
-//    addFriends(u1922, u2783);
-//  }
-
   private static void report(SocialNetwork sn, User interestingUser) {
     sn.flushTreeCache();
 
@@ -132,12 +90,8 @@ public class Main {
 
   public static void main(String[] args) throws Exception {
 //    test();
-    SocialNetwork socialNetwork = parseSocialNetwork();
-//    java.util.List<String> events = new ArrayList<>();
-//    socialNetwork.trace().setReceiver((event, node, attribute, params, value) -> {
-//      String eventString = System.currentTimeMillis() + "," + event + "," + attribute;
-//      events.add(eventString);
-//    });
+    XmlToJastaddTranslator translator = parseSocialNetwork();
+    SocialNetwork socialNetwork = translator.getSocialNetwork();
     socialNetwork.enableTracing();
     logger.info("Validity: {}", socialNetwork.isValid());
 
@@ -147,10 +101,10 @@ public class Main {
 
     logger.info("Query1: {}", socialNetwork.query(1));
     logger.info("Query2: {}", socialNetwork.query(2));
-    printQ2Scores(socialNetwork);
+//    printQ2Scores(socialNetwork);
 
     for (int index = 1; index <= maxChanges; index++) {
-      ModelChangeSet modelChangeSet = parseChanges(socialNetwork, index);
+      ModelChangeSet modelChangeSet = parseChanges(translator, index);
       if (modelChangeSet == null) {
         logger.debug("Got null as modelChangeSet, skipping.");
         continue;
@@ -158,7 +112,7 @@ public class Main {
       logger.info("Validity after parsing of {} changes: {}",
           modelChangeSet.getNumModelChange(), socialNetwork.isValid());
 
-//      // flush to get ids correct after parsing
+      // flush to get ids correct after parsing
       socialNetwork.flushTreeCache();
 
       if (splitApply) {
@@ -182,7 +136,7 @@ public class Main {
       logger.info("Query1 after change {}: {}", index, socialNetwork.query(1));
       logger.info("Query2 after change {}: {}", index, socialNetwork.query(2));
 
-      printQ2Scores(socialNetwork);
+//      printQ2Scores(socialNetwork);
     }
     socialNetwork.writeTracingEvents(Paths.get("events.txt"));
   }
@@ -200,7 +154,6 @@ public class Main {
       for (User user : comment.getLikedByList()) {
         logger.debug("{} and {}: {}", comment, user, user.getCommentLikerFriends(comment));
         logger.debug("{} friends: {}", user, printList(user.getFriends()));
-        // check that commentLikers are all friends
       }
     }
   }
@@ -219,7 +172,7 @@ public class Main {
     return sb.append("]").toString();
   }
 
-  private static SocialNetwork parseSocialNetwork() throws JAXBException, ParseException {
+  private static XmlToJastaddTranslator parseSocialNetwork() throws JAXBException, ParseException {
     JAXBContext jc = JAXBContext.newInstance(ParsedSocialNetwork.class);
     Unmarshaller unmarshaller = jc.createUnmarshaller();
     Path model1Content = Paths.get("src", "main", "resources", Integer.toString(changeSet), "initial.xmi");
@@ -227,10 +180,11 @@ public class Main {
     logger.info("Users: {}, Posts: {}",
         parsedSocialNetwork.users.size(), parsedSocialNetwork.posts.size());
     XmlToJastaddTranslator translator = new XmlToJastaddTranslator();
-    return translator.translateSocialNetwork(parsedSocialNetwork);
+    translator.translateSocialNetwork(parsedSocialNetwork);
+    return translator;
   }
 
-  private static ModelChangeSet parseChanges(SocialNetwork socialNetwork, int index) throws JAXBException, ParseException {
+  private static ModelChangeSet parseChanges(XmlToJastaddTranslator translator, int index) throws JAXBException, ParseException {
     String suffix = String.format("change%02d.xmi", index);
     logger.info("Parsing changes {}", suffix);
     JAXBContext jc = JAXBContext.newInstance(ParsedModelChangeSet.class);
@@ -243,7 +197,6 @@ public class Main {
     }
     ParsedModelChangeSet parsedModelChangeSet = (ParsedModelChangeSet) unmarshaller.unmarshal(modelContent.toFile());
 
-    XmlToJastaddTranslator translator = new XmlToJastaddTranslator();
-    return translator.translateModelChangeSet(parsedModelChangeSet, socialNetwork);
+    return translator.translateModelChangeSet(parsedModelChangeSet);
   }
 }
diff --git a/solve/src/main/java/de/tudresden/inf/st/ttc18live/translator/XmlToJastaddTranslator.java b/solve/src/main/java/de/tudresden/inf/st/ttc18live/translator/XmlToJastaddTranslator.java
index 1020579..3777be7 100644
--- a/solve/src/main/java/de/tudresden/inf/st/ttc18live/translator/XmlToJastaddTranslator.java
+++ b/solve/src/main/java/de/tudresden/inf/st/ttc18live/translator/XmlToJastaddTranslator.java
@@ -28,8 +28,20 @@ public class XmlToJastaddTranslator {
   /** Created objects within changes when translating change sets */
   private Map<Long, ModelElement> createdObjects;
 
+  /** Created users created initially and within changes */
+  private Map<Long, User> userMap = new HashMap<>();
+  /** Created submissions created initially and within changes */
+  private Map<Long, Submission> submissionMap = new HashMap<>();
+
+  private SocialNetwork socialNetwork;
+
   public XmlToJastaddTranslator() {
     // empty for now
+    socialNetwork = null;
+  }
+
+  public SocialNetwork getSocialNetwork() {
+    return socialNetwork;
   }
 
   public SocialNetwork translateSocialNetwork(ParsedSocialNetwork parsedSocialNetwork) throws ParseException {
@@ -38,10 +50,7 @@ public class XmlToJastaddTranslator {
     Map<User, String> userLikes = new HashMap<>();
     Map<Comment, Long> commentPosts = new HashMap<>();
 
-    Map<Long, User> userMap = new HashMap<>();
-    Map<Long, Submission> submissionMap = new HashMap<>();
-
-    SocialNetwork result = SocialNetwork.createSocialNetwork();
+    socialNetwork = SocialNetwork.createSocialNetwork();
     for (ParsedUser parsedUser : parsedSocialNetwork.users) {
       logger.trace("Parsing user id={}", parsedUser.id);
       User user = new User();
@@ -56,7 +65,7 @@ public class XmlToJastaddTranslator {
       if (parsedUser.likes != null) {
         userLikes.put(user, parsedUser.likes);
       }
-      result.addUser(user);
+      socialNetwork.addUser(user);
 
       // FIXME remove manual user lookup
       userMap.put(user.getId(), user);
@@ -68,7 +77,7 @@ public class XmlToJastaddTranslator {
       post.setTimestamp(convertTimestamp(parsedPost.timestamp));
       post.setContent(parsedPost.content);
       addComments(parsedPost, post, commentPosts, submissionMap);
-      result.addPost(post);
+      socialNetwork.addPost(post);
 
       // FIXME remove manual submission lookup
       submissionMap.put(post.getId(), post);
@@ -103,7 +112,7 @@ public class XmlToJastaddTranslator {
       }
     }
     logger.info("Done translating");
-    return result;
+    return socialNetwork;
   }
 
   private void addComments(ParsedSubmission parsedSubmission, Submission submission,
@@ -140,7 +149,12 @@ public class XmlToJastaddTranslator {
     List<CompositionListInsertion> compositionListInsertions = new ArrayList<>();
   }
 
-  public ModelChangeSet translateModelChangeSet(ParsedModelChangeSet parsedModelChangeSet, SocialNetwork socialNetwork) throws ParseException {
+  public ModelChangeSet translateModelChangeSet(ParsedModelChangeSet parsedModelChangeSet) throws ParseException {
+    if (socialNetwork == null) {
+      logger.fatal("No previously parsed SocialNetwork found!");
+      return null;
+    }
+
     forwardReferencesElements = new HashMap<>();
     forwardReferencesPaths = new HashMap<>();
     createdObjects = new HashMap<>();
@@ -248,6 +262,7 @@ public class XmlToJastaddTranslator {
       return forwardReferencesElements.get(parsedModelElement);
     }
     ModelElement me;
+    Long id = Long.valueOf(parsedModelElement.id.substring(parsedModelElement.id.lastIndexOf('#') + 1));
     SocialNetwork socialNetwork = modelChangeSet.getSocialNetwork();
     if (parsedModelElement instanceof ParsedUser) {
       ParsedUser parsedUser = (ParsedUser) parsedModelElement;
@@ -261,6 +276,7 @@ public class XmlToJastaddTranslator {
       }
       // maybe set other fields? (submission is set, but refers to later introduced changes)
       socialNetwork.addUser(user);
+      userMap.put(id, user);
       me = user;
     } else if (parsedModelElement instanceof ParsedSubmission) {
       ParsedSubmission parsedSubmission = (ParsedSubmission) parsedModelElement;
@@ -282,6 +298,8 @@ public class XmlToJastaddTranslator {
       }
       submission.setTimestamp(convertTimestamp(parsedSubmission.timestamp));
       submission.setContent(parsedSubmission.content);
+      // add map
+      submissionMap.put(id, submission);
       // resolveModelElement user
       User submitter = resolveUser(parsedSubmission.submitter, modelChangeSet);
       submitter.addSubmission(submission);
@@ -303,7 +321,7 @@ public class XmlToJastaddTranslator {
       throw new RuntimeException("Unknown ModelElement " + parsedModelElement +
           " with id=" + parsedModelElement.id);
     }
-    me.setId(Long.valueOf(parsedModelElement.id.substring(parsedModelElement.id.lastIndexOf('#') + 1)));
+    me.setId(id);
     createdObjects.put(me.getId(), me);
     return me;
   }
@@ -376,17 +394,16 @@ public class XmlToJastaddTranslator {
       logger.warn("Can not resolveModelElement " + path);
       id = 0;
     }
-    SocialNetwork socialNetwork = modelChangeSet.getSocialNetwork();
     ModelElement result;
     switch (nonterminalName) {
       case "User":
-        result = socialNetwork.resolveUser(id);
+        result = userMap.get(id);
         break;
       case "Comment":
-        result = socialNetwork.resolveComment(id);
+        result = submissionMap.get(id);
         break;
       case "Post":
-        result = socialNetwork.resolvePost(id);
+        result = submissionMap.get(id);
         break;
       default:
         throw new RuntimeException("Can not resolveModelElement a " + nonterminalName + " with " + path);
-- 
GitLab