diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag index 0afb11fc40ea51c6220b8b285adaf9edb68daf02..abee42ae30cf081fd65b7b0d6ed8524e8877b3c7 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 bfb18d6996108bb1eaa13ec58651a4ca5eb816f3..e7d32a8af08a2edb9a4cfa29c2136aac19ff58fe 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 9789e576fd4534971f68222eb4cd32a285d6e252..6c37562bac17aac3c9b3d320164d6569322f07dc 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 14370271049a4fed01a80c6496101d42678670c8..ae6e866133ef91a58f8c582f6676c0c1a89aedf2 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 375f20ff4a0f28331cdb31187c524bd9886df0de..68cb2ff5ff87de1d79736392c8b50fc2e310db5f 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 1c57da5fc7e16dddc2cbc22150e243469743b237..16815c5f6bceef351dfa2dc14b8d66dfe0b4a6c2 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();