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