>From Ian Maxon <[email protected]>:

Ian Maxon has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18174 )


Change subject: [ASTERIXDB-3356][RT] Add min/max cardinality to plan
......................................................................

[ASTERIXDB-3356][RT] Add min/max cardinality to plan

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
- Add min and max cardinality from profile to plan

Change-Id: Ibdacf4e6b156a3b6ef15b4420f4102c122f8af1d
---
M 
hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
1 file changed, 57 insertions(+), 13 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/74/18174/1

diff --git 
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
 
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
index d1a356c..36c33e6 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
@@ -228,19 +228,32 @@
     }

     private class OperatorProfile {
-        Map<String, Pair<Double, Double>> activities;
+        Map<String, Pair<Double, Double>> activityTimes;
+        Map<String, Pair<Long, Long>> activityCards;

         OperatorProfile() {
-            activities = new HashMap<>();
+            activityTimes = new HashMap<>();
+            activityCards = new HashMap<>();
+        }
+
+        void updateOperator(String extendedOpId, double time, long 
cardinality) {
+            updateMinMax(time, extendedOpId, activityTimes);
+            if (cardinality > 0) {
+                updateMinMax(cardinality, extendedOpId, activityCards);
+            }
         }

         void updateOperator(String extendedOpId, double time) {
-            Pair<Double, Double> times = 
activities.computeIfAbsent(extendedOpId, i -> new Pair(time, time));
-            if (times.getFirst() > time) {
-                times.setFirst(time);
+            updateMinMax(time, extendedOpId, activityTimes);
+        }
+
+        private <T extends Comparable<T>> void updateMinMax(T comp, String id, 
Map<String, Pair<T, T>> opMap) {
+            Pair<T, T> times = opMap.computeIfAbsent(id, i -> new Pair(comp, 
comp));
+            if (times.getFirst().compareTo(comp) > 0) {
+                times.setFirst(comp);
             }
-            if (times.getSecond() < time) {
-                times.setSecond(time);
+            if (times.getSecond().compareTo(comp) < 0) {
+                times.setSecond(comp);
             }
         }
     }
@@ -257,6 +270,11 @@
                 for (JsonNode counters : task.get("counters")) {
                     OperatorProfile info = 
profiledOps.computeIfAbsent(counters.get("runtime-id").asText(),
                             i -> new OperatorProfile());
+                    JsonNode card = counters.get("cardinality-out");
+                    if (card != null) {
+                        
info.updateOperator(acIdFromName(counters.get("name").asText()).getLocalId(),
+                                counters.get("run-time").asDouble(), 
counters.get("cardinality-out").asLong(-1));
+                    }
                     
info.updateOperator(acIdFromName(counters.get("name").asText()).getLocalId(),
                             counters.get("run-time").asDouble());
                 }
@@ -343,16 +361,26 @@
                 jsonGenerator.writeStringField("runtime-id", od);
                 OperatorProfile info = profile.get(od);
                 if (info != null) {
-                    if (info.activities.size() == 1) {
-                        Pair<Double, Double> minMax = 
info.activities.values().iterator().next();
+                    if (info.activityTimes.size() == 1) {
+                        Pair<Double, Double> minMax = 
info.activityTimes.values().iterator().next();
                         jsonGenerator.writeNumberField("min-time", 
minMax.first);
                         jsonGenerator.writeNumberField("max-time", 
minMax.second);
+                        if (info.activityCards.size() > 0) {
+                            Pair<Long, Long> minMaxCard = 
info.activityCards.values().iterator().next();
+                            jsonGenerator.writeNumberField("min-cardinality", 
minMaxCard.first);
+                            jsonGenerator.writeNumberField("max-cardinality", 
minMaxCard.second);
+                        }
                     } else {
                         jsonGenerator.writeObjectFieldStart("times");
-                        for (Map.Entry<String, Pair<Double, Double>> ac : 
info.activities.entrySet()) {
-                            jsonGenerator.writeObjectFieldStart(ac.getKey());
-                            jsonGenerator.writeNumberField("min-time", 
ac.getValue().first);
-                            jsonGenerator.writeNumberField("max-time", 
ac.getValue().second);
+                        for (String acId : info.activityTimes.keySet()) {
+                            jsonGenerator.writeObjectFieldStart(acId);
+                            jsonGenerator.writeNumberField("min-time", 
info.activityTimes.get(acId).first);
+                            jsonGenerator.writeNumberField("max-time", 
info.activityTimes.get(acId).second);
+                            Pair<Long, Long> cards = 
info.activityCards.get(acId);
+                            if (cards != null) {
+                                
jsonGenerator.writeNumberField("min-cardinality", 
info.activityCards.get(acId).first);
+                                
jsonGenerator.writeNumberField("max-cardinality", 
info.activityCards.get(acId).second);
+                            }
                             jsonGenerator.writeEndObject();
                         }
                         jsonGenerator.writeEndObject();

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18174
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings

Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: Ibdacf4e6b156a3b6ef15b4420f4102c122f8af1d
Gerrit-Change-Number: 18174
Gerrit-PatchSet: 1
Gerrit-Owner: Ian Maxon <[email protected]>
Gerrit-MessageType: newchange

Reply via email to