Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8410675c authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "condition dimension query."

parents 07f35aa6 5503f5ca
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@

#include "SimpleConditionTracker.h"
#include "guardrail/StatsdStats.h"
#include "dimension.h"

#include <log/logprint.h>

@@ -171,12 +172,12 @@ void SimpleConditionTracker::handleConditionEvent(const HashableDimensionKey& ou
        // We get a new output key.
        newCondition = matchStart ? ConditionState::kTrue : ConditionState::kFalse;
        if (matchStart && mInitialValue != ConditionState::kTrue) {
            mSlicedConditionState[outputKey] = 1;
            mSlicedConditionState.insert(std::make_pair(outputKey, 1));
            changed = true;
        } else if (mInitialValue != ConditionState::kFalse) {
            // it's a stop and we don't have history about it.
            // If the default condition is not false, it means this stop is valuable to us.
            mSlicedConditionState[outputKey] = 0;
            mSlicedConditionState.insert(std::make_pair(outputKey, 0));
            changed = true;
        }
    } else {
@@ -341,9 +342,25 @@ void SimpleConditionTracker::isConditionMet(
            conditionState = conditionState |
                    (startedCountIt->second > 0 ? ConditionState::kTrue : ConditionState::kFalse);
        } else {
            // For unseen key, check whether the require dimensions are subset of sliced condition
            // output.
            bool seenDimension = false;
            for (const auto& slice : mSlicedConditionState) {
                if (IsSubDimension(slice.first.getDimensionsValue(),
                                   key.getDimensionsValue())) {
                    seenDimension = true;
                    conditionState = conditionState |
                        (slice.second > 0 ? ConditionState::kTrue : ConditionState::kFalse);
                }
                if (conditionState == ConditionState::kTrue) {
                    break;
                }
            }
            if (!seenDimension) {
                conditionState = conditionState | mInitialValue;
            }
        }
    }
    conditionCache[mIndex] = conditionState;
    VLOG("Predicate %lld return %d", (long long)mConditionId, conditionCache[mIndex]);
}
+5 −3
Original line number Diff line number Diff line
@@ -331,13 +331,15 @@ bool IsSubDimension(const DimensionsValue& dimension, const DimensionsValue& sub
        case DimensionsValue::ValueCase::kValueFloat:
            return dimension.value_float() == sub.value_float();
        case DimensionsValue::ValueCase::kValueTuple: {
            if (dimension.value_tuple().dimensions_value_size() < sub.value_tuple().dimensions_value_size()) {
            if (dimension.value_tuple().dimensions_value_size() <
                sub.value_tuple().dimensions_value_size()) {
                return false;
            }
            bool allSub = true;
            for (int i = 0; i < sub.value_tuple().dimensions_value_size(); ++i) {
            for (int i = 0; allSub && i < sub.value_tuple().dimensions_value_size(); ++i) {
                bool isSub = false;
                for (int j = 0; !isSub && j < dimension.value_tuple().dimensions_value_size(); ++j) {
                for (int j = 0; !isSub &&
                        j < dimension.value_tuple().dimensions_value_size(); ++j) {
                    isSub |= IsSubDimension(dimension.value_tuple().dimensions_value(j),
                                            sub.value_tuple().dimensions_value(i));
                }
+1 −1
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ StatsdConfig CreateStatsdConfig() {
    auto isSyncingPredicate = CreateIsSyncingPredicate();
    *isSyncingPredicate.mutable_simple_predicate()->mutable_dimensions() =
        CreateDimensions(
            android::util::SYNC_STATE_CHANGED, {1 /* uid field */});
            android::util::SYNC_STATE_CHANGED, {1 /* uid field */, 2 /* name field*/});

    auto isInBackgroundPredicate = CreateIsInBackgroundPredicate();
    *isInBackgroundPredicate.mutable_simple_predicate()->mutable_dimensions() =