From c73dca51415abcf2c9764dadc46872a77d109a32 Mon Sep 17 00:00:00 2001
From: Manuel Krombholz <s3866577@msx.tu-dresden.de>
Date: Tue, 20 Apr 2021 14:34:35 +0200
Subject: [PATCH] Added event processing frequency for groups

---
 eraser-base/src/main/jastadd/Item.jrag             | 10 +++++++++-
 eraser-base/src/main/jastadd/StateData.jrag        |  7 ++++---
 eraser-base/src/main/jastadd/eraser.parser         |  1 +
 eraser-base/src/main/jastadd/shem.relast           |  8 +++++---
 .../inf/st/eraser/parser/EraserParserHelper.java   | 14 ++++++++------
 .../java/de/tudresden/inf/st/eraser/RulesTest.java |  6 +-----
 6 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag
index 0afb11fc..abee42ae 100644
--- a/eraser-base/src/main/jastadd/Item.jrag
+++ b/eraser-base/src/main/jastadd/Item.jrag
@@ -302,12 +302,20 @@ aspect ItemHandling {
         logger.catching(e);
       }
     }
-    if (hasItemObserver() && this.getStateData().checkStateProcessingTime()) {
+    if (hasItemObserver() && this.getStateData().checkStateProcessingTime(getRelevantItemPerformance())) {
       this.getStateData().afterStateChangeProcessed();
       getItemObserver().apply();
     }
   }
 
+  protected ItemPerformance Item.getRelevantItemPerformance() {
+        ASTNode parent = getParent();
+        if (this.getItemPerformance()==null && parent instanceof Group) {
+          return ((Group)parent).getItemPerformance();
+        }
+        return this.getItemPerformance();
+  }
+
   //--- sendState ---
   protected void Item.sendState() throws Exception {
     for (MachineLearningModel model : getRelevantInMachineLearningModels()) {
diff --git a/eraser-base/src/main/jastadd/StateData.jrag b/eraser-base/src/main/jastadd/StateData.jrag
index bfb18d69..e7d32a8a 100644
--- a/eraser-base/src/main/jastadd/StateData.jrag
+++ b/eraser-base/src/main/jastadd/StateData.jrag
@@ -3,11 +3,11 @@ aspect StateData {
         this.setLastChangeDate(Instant.now());
     }
 
-    public boolean StateData.checkStateProcessingTime() {
-        if (this.getItemPerformance()==null) {
+    public boolean StateData.checkStateProcessingTime(ItemPerformance itemPerformance) {
+        if (itemPerformance==null) {
             return true;
         }
-        double frequency = this.getItemPerformance().getEventProcessingFrequency();
+        double frequency = itemPerformance.getEventProcessingFrequency();
         Instant lastStateChange = this.getLastChangeDate();
         if (lastStateChange==null) {
             return true;
@@ -16,4 +16,5 @@ aspect StateData {
         return lastStateChange.toEpochMilli() + (1/frequency)*1000 < Instant.now().toEpochMilli();
 
     }
+
 }
\ No newline at end of file
diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser
index 9789e576..6c37562b 100644
--- a/eraser-base/src/main/jastadd/eraser.parser
+++ b/eraser-base/src/main/jastadd/eraser.parser
@@ -153,6 +153,7 @@ Group group_body =
   |  AGGREGATION EQUALS TEXT.n group_body.g           {: return eph.setSimpleAggregationFunction(g, n); :}
   |  AGGREGATION EQUALS TEXT.n round_string_list.params group_body.g
     {: return eph.setParameterizedAggregationFunction(g, n, params); :}
+  |  PERFORMANCE EQUALS TEXT.n group_body.g           {: return eph.setPerformance(g, n); :}
   |                                                   {: return new Group(); :}
   ;
 
diff --git a/eraser-base/src/main/jastadd/shem.relast b/eraser-base/src/main/jastadd/shem.relast
index 14370271..ae6e8661 100644
--- a/eraser-base/src/main/jastadd/shem.relast
+++ b/eraser-base/src/main/jastadd/shem.relast
@@ -24,8 +24,10 @@ rel Channel.LinkedItem* <-> Item.Channel? ;
 
 Parameter : DescribableModelElement ::= <Type:ParameterValueType> [DefaultValue:ParameterDefaultValue] <Context:String> <Required:boolean> ;
 ParameterDefaultValue ::= <Value:String> ;
+abstract PerformanceElement : LabelledModelElement ;
+rel PerformanceElement.ItemPerformance -> ItemPerformance ;
 
-abstract Item : LabelledModelElement ::= <_fetched_data:boolean> MetaData:ItemMetaData* [ItemObserver] /StateData/;
+abstract Item : PerformanceElement ::= <_fetched_data:boolean> MetaData:ItemMetaData* [ItemObserver] /StateData/;
 rel Item.Category? -> ItemCategory ;
 
 
@@ -51,9 +53,9 @@ ItemMetaData ::= <Key:String> <Value:String> ;
 ItemCategory ::= <Name:String> ;
 
 StateData ::= <LastChangeDate:Instant> ;
-rel StateData.ItemPerformance -> ItemPerformance ;
 
-Group : LabelledModelElement ::= Group* Item* [AggregationFunction:GroupAggregationFunction] ;
+
+Group : PerformanceElement ::= Group* Item* [AggregationFunction:GroupAggregationFunction] ;
 abstract GroupAggregationFunction ;
 SimpleGroupAggregationFunction : GroupAggregationFunction ::= <FunctionName:SimpleGroupAggregationFunctionName> ;
 ParameterizedGroupAggregationFunction : GroupAggregationFunction ::= <FunctionName:ParameterizedGroupAggregationFunctionName>
diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java
index 375f20ff..68cb2ff5 100644
--- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java
+++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java
@@ -38,7 +38,7 @@ public class EraserParserHelper {
   private Map<Item, Iterable<String>> missingControllingListMap = new HashMap<>();
   private Map<Group, Iterable<String>> missingSubGroupListMap = new HashMap<>();
   private Map<Group, Iterable<String>> missingItemListMap = new HashMap<>();
-  private Map<Item, String> missingItemPerformanceMap = new HashMap<>();
+  private Map<PerformanceElement, String> missingItemPerformanceMap = new HashMap<>();
   private Map<ThingType, Iterable<String>> missingChannelTypeListMap = new HashMap<>();
   private Map<ThingType, Iterable<String>> missingParameterListMap = new HashMap<>();
 
@@ -115,8 +115,8 @@ public class EraserParserHelper {
     group.addItem(item);
   }
 
-  private void setPerformanceOnItem(Item item, ItemPerformance itemPerformance) {
-    item.getStateData().setItemPerformance(itemPerformance);
+  private void setPerformanceOnItem(PerformanceElement performanceElement, ItemPerformance itemPerformance) {
+    performanceElement.setItemPerformance(itemPerformance);
   }
 
   private void fillUnused() {
@@ -301,11 +301,13 @@ public class EraserParserHelper {
     return item;
   }
 
-  public Item setPerformance(Item item, String performanceName) {
-    missingItemPerformanceMap.put(item, performanceName);
-    return item;
+  public PerformanceElement setPerformance(PerformanceElement performanceElement, String performanceName) {
+    missingItemPerformanceMap.put(performanceElement, performanceName);
+    return performanceElement;
   }
 
+
+
   public Item setMetaData(Item item, StringKeyMap metaData) {
     for (AbstractMap.SimpleEntry<String, String> entry : metaData) {
       item.addMetaData(new ItemMetaData(entry.getKey(), entry.getValue()));
diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java
index 1c57da5f..16815c5f 100644
--- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java
+++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java
@@ -246,10 +246,6 @@ public class RulesTest {
     assertEquals(2, counter.get(item), "Change of item to 7 should not trigger the rule, check2 violated");
   }
 
-  private static void addItemToModel(SmartHomeEntityModel model, Item item) {
-    getDefaultGroup(model).addItem(item);
-  }
-
 
   @Test
   public void testTwoActions() {
@@ -676,7 +672,7 @@ public class RulesTest {
 
     ItemPerformance itemPerformance = new ItemPerformance();
     itemPerformance.setEventProcessingFrequency(10);
-    numberItem.getStateData().setItemPerformance(itemPerformance);
+    numberItem.setItemPerformance(itemPerformance);
 
     Rule rule = new Rule();
     CountingAction counter = new CountingAction();
-- 
GitLab