1caf339d004fad667748b68912c254df4e75cdc5aYao Chen/*
2caf339d004fad667748b68912c254df4e75cdc5aYao Chen * Copyright (C) 2017 The Android Open Source Project
3caf339d004fad667748b68912c254df4e75cdc5aYao Chen *
4caf339d004fad667748b68912c254df4e75cdc5aYao Chen * Licensed under the Apache License, Version 2.0 (the "License");
5caf339d004fad667748b68912c254df4e75cdc5aYao Chen * you may not use this file except in compliance with the License.
6caf339d004fad667748b68912c254df4e75cdc5aYao Chen * You may obtain a copy of the License at
7caf339d004fad667748b68912c254df4e75cdc5aYao Chen *
8caf339d004fad667748b68912c254df4e75cdc5aYao Chen *      http://www.apache.org/licenses/LICENSE-2.0
9caf339d004fad667748b68912c254df4e75cdc5aYao Chen *
10caf339d004fad667748b68912c254df4e75cdc5aYao Chen * Unless required by applicable law or agreed to in writing, software
11caf339d004fad667748b68912c254df4e75cdc5aYao Chen * distributed under the License is distributed on an "AS IS" BASIS,
12caf339d004fad667748b68912c254df4e75cdc5aYao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13caf339d004fad667748b68912c254df4e75cdc5aYao Chen * See the License for the specific language governing permissions and
14caf339d004fad667748b68912c254df4e75cdc5aYao Chen * limitations under the License.
15caf339d004fad667748b68912c254df4e75cdc5aYao Chen */
16caf339d004fad667748b68912c254df4e75cdc5aYao Chen
175110bedd787835d4dbc809b7977285cac364bdefYao Chen#define DEBUG false  // STOPSHIP if true
189fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#include "Log.h"
19caf339d004fad667748b68912c254df4e75cdc5aYao Chen
20caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "SimpleConditionTracker.h"
21b356151e63140085cb96fa16804ee18b3862a4fcYao Chen#include "guardrail/StatsdStats.h"
229fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato
239fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace android {
249fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace os {
259fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace statsd {
269fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato
27729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chenusing std::map;
28caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::string;
29caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::unique_ptr;
30caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::unordered_map;
31caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::vector;
32caf339d004fad667748b68912c254df4e75cdc5aYao Chen
33caf339d004fad667748b68912c254df4e75cdc5aYao ChenSimpleConditionTracker::SimpleConditionTracker(
3494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        const ConfigKey& key, const int64_t& id, const int index,
3512d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        const SimplePredicate& simplePredicate,
3694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        const unordered_map<int64_t, int>& trackerNameIndexMap)
3713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    : ConditionTracker(id, index), mConfigKey(key), mContainANYPositionInInternalDimensions(false) {
3894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    VLOG("creating SimpleConditionTracker %lld", (long long)mConditionId);
3912d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon    mCountNesting = simplePredicate.count_nesting();
40caf339d004fad667748b68912c254df4e75cdc5aYao Chen
4112d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon    if (simplePredicate.has_start()) {
4212d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        auto pair = trackerNameIndexMap.find(simplePredicate.start());
43caf339d004fad667748b68912c254df4e75cdc5aYao Chen        if (pair == trackerNameIndexMap.end()) {
4494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("Start matcher %lld not found in the config", (long long)simplePredicate.start());
45caf339d004fad667748b68912c254df4e75cdc5aYao Chen            return;
46caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
47caf339d004fad667748b68912c254df4e75cdc5aYao Chen        mStartLogMatcherIndex = pair->second;
48caf339d004fad667748b68912c254df4e75cdc5aYao Chen        mTrackerIndex.insert(mStartLogMatcherIndex);
49caf339d004fad667748b68912c254df4e75cdc5aYao Chen    } else {
50caf339d004fad667748b68912c254df4e75cdc5aYao Chen        mStartLogMatcherIndex = -1;
51caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
52caf339d004fad667748b68912c254df4e75cdc5aYao Chen
5312d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon    if (simplePredicate.has_stop()) {
5412d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        auto pair = trackerNameIndexMap.find(simplePredicate.stop());
55caf339d004fad667748b68912c254df4e75cdc5aYao Chen        if (pair == trackerNameIndexMap.end()) {
5694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("Stop matcher %lld not found in the config", (long long)simplePredicate.stop());
57caf339d004fad667748b68912c254df4e75cdc5aYao Chen            return;
58caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
59caf339d004fad667748b68912c254df4e75cdc5aYao Chen        mStopLogMatcherIndex = pair->second;
604b1468538fa7b95ec8e7cbc742e99a5c1d63085bYao Chen        mTrackerIndex.insert(mStopLogMatcherIndex);
61caf339d004fad667748b68912c254df4e75cdc5aYao Chen    } else {
62caf339d004fad667748b68912c254df4e75cdc5aYao Chen        mStopLogMatcherIndex = -1;
63caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
64caf339d004fad667748b68912c254df4e75cdc5aYao Chen
6512d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon    if (simplePredicate.has_stop_all()) {
6612d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        auto pair = trackerNameIndexMap.find(simplePredicate.stop_all());
67caf339d004fad667748b68912c254df4e75cdc5aYao Chen        if (pair == trackerNameIndexMap.end()) {
6894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("Stop all matcher %lld found in the config", (long long)simplePredicate.stop_all());
69caf339d004fad667748b68912c254df4e75cdc5aYao Chen            return;
70caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
71caf339d004fad667748b68912c254df4e75cdc5aYao Chen        mStopAllLogMatcherIndex = pair->second;
72caf339d004fad667748b68912c254df4e75cdc5aYao Chen        mTrackerIndex.insert(mStopAllLogMatcherIndex);
73caf339d004fad667748b68912c254df4e75cdc5aYao Chen    } else {
74caf339d004fad667748b68912c254df4e75cdc5aYao Chen        mStopAllLogMatcherIndex = -1;
75caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
76caf339d004fad667748b68912c254df4e75cdc5aYao Chen
778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (simplePredicate.has_dimensions()) {
788a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        translateFieldMatcher(simplePredicate.dimensions(), &mOutputDimensions);
798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if (mOutputDimensions.size() > 0) {
808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            mSliced = true;
818a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            mDimensionTag = mOutputDimensions[0].mMatcher.getTag();
828a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
8313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        mContainANYPositionInInternalDimensions = HasPositionANY(simplePredicate.dimensions());
845154a379303ab90a2b2914676a4441917a329b5dYao Chen    }
855154a379303ab90a2b2914676a4441917a329b5dYao Chen
8612d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon    if (simplePredicate.initial_value() == SimplePredicate_InitialValue_FALSE) {
87967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        mInitialValue = ConditionState::kFalse;
88967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    } else {
89967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        mInitialValue = ConditionState::kUnknown;
90967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    }
91967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen
92967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    mNonSlicedConditionState = mInitialValue;
93967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen
9413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    if (!mSliced) {
9513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        mUnSlicedPart = mInitialValue;
9613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    }
9713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
98caf339d004fad667748b68912c254df4e75cdc5aYao Chen    mInitialized = true;
99caf339d004fad667748b68912c254df4e75cdc5aYao Chen}
100caf339d004fad667748b68912c254df4e75cdc5aYao Chen
101caf339d004fad667748b68912c254df4e75cdc5aYao ChenSimpleConditionTracker::~SimpleConditionTracker() {
102caf339d004fad667748b68912c254df4e75cdc5aYao Chen    VLOG("~SimpleConditionTracker()");
103caf339d004fad667748b68912c254df4e75cdc5aYao Chen}
104caf339d004fad667748b68912c254df4e75cdc5aYao Chen
10512d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafonbool SimpleConditionTracker::init(const vector<Predicate>& allConditionConfig,
106caf339d004fad667748b68912c254df4e75cdc5aYao Chen                                  const vector<sp<ConditionTracker>>& allConditionTrackers,
10794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                                  const unordered_map<int64_t, int>& conditionIdIndexMap,
108caf339d004fad667748b68912c254df4e75cdc5aYao Chen                                  vector<bool>& stack) {
109caf339d004fad667748b68912c254df4e75cdc5aYao Chen    // SimpleConditionTracker does not have dependency on other conditions, thus we just return
110caf339d004fad667748b68912c254df4e75cdc5aYao Chen    // if the initialization was successful.
111caf339d004fad667748b68912c254df4e75cdc5aYao Chen    return mInitialized;
112caf339d004fad667748b68912c254df4e75cdc5aYao Chen}
113caf339d004fad667748b68912c254df4e75cdc5aYao Chen
114580ea321b16c71ddec515553761d6f37359bd3a0Yao Chenvoid SimpleConditionTracker::dumpState() {
115580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    VLOG("%lld DUMP:", (long long)mConditionId);
116580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    for (const auto& pair : mSlicedConditionState) {
11713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        VLOG("\t%s : %d", pair.first.toString().c_str(), pair.second);
118967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    }
119580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen
120580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    VLOG("Changed to true keys: \n");
121580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    for (const auto& key : mLastChangedToTrueDimensions) {
122580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen        VLOG("%s", key.toString().c_str());
123580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    }
124580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    VLOG("Changed to false keys: \n");
125580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    for (const auto& key : mLastChangedToFalseDimensions) {
126580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen        VLOG("%s", key.toString().c_str());
127580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    }
128967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen}
129967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen
130967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chenvoid SimpleConditionTracker::handleStopAll(std::vector<ConditionState>& conditionCache,
131967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                                           std::vector<bool>& conditionChangedCache) {
132967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    // Unless the default condition is false, and there was nothing started, otherwise we have
133967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    // triggered a condition change.
134967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    conditionChangedCache[mIndex] =
135967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            (mInitialValue == ConditionState::kFalse && mSlicedConditionState.empty()) ? false
136967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                                                                                           : true;
137967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen
138580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    for (const auto& cond : mSlicedConditionState) {
139580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen        if (cond.second > 0) {
140580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            mLastChangedToFalseDimensions.insert(cond.first);
141580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen        }
142580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    }
143580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen
144967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    // After StopAll, we know everything has stopped. From now on, default condition is false.
145967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    mInitialValue = ConditionState::kFalse;
146967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    mSlicedConditionState.clear();
147967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    conditionCache[mIndex] = ConditionState::kFalse;
14813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    if (!mSliced) {
14913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        mUnSlicedPart = ConditionState::kFalse;
15013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    }
151967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen}
152967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen
153b356151e63140085cb96fa16804ee18b3862a4fcYao Chenbool SimpleConditionTracker::hitGuardRail(const HashableDimensionKey& newKey) {
154b356151e63140085cb96fa16804ee18b3862a4fcYao Chen    if (!mSliced || mSlicedConditionState.find(newKey) != mSlicedConditionState.end()) {
155b356151e63140085cb96fa16804ee18b3862a4fcYao Chen        // if the condition is not sliced or the key is not new, we are good!
156b356151e63140085cb96fa16804ee18b3862a4fcYao Chen        return false;
157b356151e63140085cb96fa16804ee18b3862a4fcYao Chen    }
158b356151e63140085cb96fa16804ee18b3862a4fcYao Chen    // 1. Report the tuple count if the tuple count > soft limit
159b356151e63140085cb96fa16804ee18b3862a4fcYao Chen    if (mSlicedConditionState.size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) {
160b356151e63140085cb96fa16804ee18b3862a4fcYao Chen        size_t newTupleCount = mSlicedConditionState.size() + 1;
16194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        StatsdStats::getInstance().noteConditionDimensionSize(mConfigKey, mConditionId, newTupleCount);
162b356151e63140085cb96fa16804ee18b3862a4fcYao Chen        // 2. Don't add more tuples, we are above the allowed threshold. Drop the data.
163b356151e63140085cb96fa16804ee18b3862a4fcYao Chen        if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) {
16494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGE("Predicate %lld dropping data for dimension key %s",
16513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                (long long)mConditionId, newKey.toString().c_str());
166b356151e63140085cb96fa16804ee18b3862a4fcYao Chen            return true;
167b356151e63140085cb96fa16804ee18b3862a4fcYao Chen        }
168b356151e63140085cb96fa16804ee18b3862a4fcYao Chen    }
169b356151e63140085cb96fa16804ee18b3862a4fcYao Chen    return false;
170b356151e63140085cb96fa16804ee18b3862a4fcYao Chen}
171b356151e63140085cb96fa16804ee18b3862a4fcYao Chen
172967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chenvoid SimpleConditionTracker::handleConditionEvent(const HashableDimensionKey& outputKey,
1738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                                                  bool matchStart, ConditionState* conditionCache,
1748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                                                  bool* conditionChangedCache) {
175967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    bool changed = false;
176967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    auto outputIt = mSlicedConditionState.find(outputKey);
177967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    ConditionState newCondition;
178b356151e63140085cb96fa16804ee18b3862a4fcYao Chen    if (hitGuardRail(outputKey)) {
1798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        (*conditionChangedCache) = false;
180b356151e63140085cb96fa16804ee18b3862a4fcYao Chen        // Tells the caller it's evaluated.
1818a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        (*conditionCache) = ConditionState::kUnknown;
182b356151e63140085cb96fa16804ee18b3862a4fcYao Chen        return;
183b356151e63140085cb96fa16804ee18b3862a4fcYao Chen    }
184967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    if (outputIt == mSlicedConditionState.end()) {
185967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        // We get a new output key.
186967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        newCondition = matchStart ? ConditionState::kTrue : ConditionState::kFalse;
187967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        if (matchStart && mInitialValue != ConditionState::kTrue) {
18813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            mSlicedConditionState[outputKey] = 1;
189967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            changed = true;
190580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            mLastChangedToTrueDimensions.insert(outputKey);
191967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        } else if (mInitialValue != ConditionState::kFalse) {
192967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            // it's a stop and we don't have history about it.
193967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            // If the default condition is not false, it means this stop is valuable to us.
19413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            mSlicedConditionState[outputKey] = 0;
195580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            mLastChangedToFalseDimensions.insert(outputKey);
196967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            changed = true;
197967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        }
198967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    } else {
199967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        // we have history about this output key.
200967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        auto& startedCount = outputIt->second;
201967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        // assign the old value first.
202967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        newCondition = startedCount > 0 ? ConditionState::kTrue : ConditionState::kFalse;
203967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        if (matchStart) {
204967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            if (startedCount == 0) {
205580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                mLastChangedToTrueDimensions.insert(outputKey);
206967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                // This condition for this output key will change from false -> true
207967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                changed = true;
208967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            }
209967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen
210967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            // it's ok to do ++ here, even if we don't count nesting. The >1 counts will be treated
211967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            // as 1 if not counting nesting.
212967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            startedCount++;
213967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            newCondition = ConditionState::kTrue;
214967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        } else {
215967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            // This is a stop event.
216967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            if (startedCount > 0) {
217967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                if (mCountNesting) {
218967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                    startedCount--;
219967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                    if (startedCount == 0) {
220967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                        newCondition = ConditionState::kFalse;
221967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                    }
222967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                } else {
223967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                    // not counting nesting, so ignore the number of starts, stop now.
224967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                    startedCount = 0;
225967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                    newCondition = ConditionState::kFalse;
226967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                }
227967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                // if everything has stopped for this output key, condition true -> false;
228967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                if (startedCount == 0) {
229580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                    mLastChangedToFalseDimensions.insert(outputKey);
230967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                    changed = true;
231967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                }
232967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            }
233967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen
234967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            // if default condition is false, it means we don't need to keep the false values.
235967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            if (mInitialValue == ConditionState::kFalse && startedCount == 0) {
236967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen                mSlicedConditionState.erase(outputIt);
23713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                VLOG("erase key %s", outputKey.toString().c_str());
238967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen            }
239967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        }
240967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    }
241967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen
242967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    // dump all dimensions for debugging
243967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    if (DEBUG) {
244580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen        dumpState();
245729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    }
246967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen
2478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    (*conditionChangedCache) = changed;
2488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    (*conditionCache) = newCondition;
24913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
25094e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    VLOG("SimplePredicate %lld nonSlicedChange? %d", (long long)mConditionId,
251967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen         conditionChangedCache[mIndex] == true);
252729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen}
253729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
2549369446f0b04945d6674550728ae81196d6fb5c2Yangster-macvoid SimpleConditionTracker::evaluateCondition(
2559369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        const LogEvent& event,
2569369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        const vector<MatchingState>& eventMatcherValues,
2579369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        const vector<sp<ConditionTracker>>& mAllConditions,
2589369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        vector<ConditionState>& conditionCache,
2599369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        vector<bool>& conditionChangedCache) {
260caf339d004fad667748b68912c254df4e75cdc5aYao Chen    if (conditionCache[mIndex] != ConditionState::kNotEvaluated) {
261caf339d004fad667748b68912c254df4e75cdc5aYao Chen        // it has been evaluated.
26294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        VLOG("Yes, already evaluated, %lld %d",
26394e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            (long long)mConditionId, conditionCache[mIndex]);
264967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        return;
265caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
266580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    mLastChangedToTrueDimensions.clear();
267580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    mLastChangedToFalseDimensions.clear();
268caf339d004fad667748b68912c254df4e75cdc5aYao Chen
269c18abedfe29eb51fec14797ecf0bb101d22900b2David Chen    if (mStopAllLogMatcherIndex >= 0 && mStopAllLogMatcherIndex < int(eventMatcherValues.size()) &&
270967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        eventMatcherValues[mStopAllLogMatcherIndex] == MatchingState::kMatched) {
271967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        handleStopAll(conditionCache, conditionChangedCache);
272967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        return;
273967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    }
274729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
275967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    int matchedState = -1;
276caf339d004fad667748b68912c254df4e75cdc5aYao Chen    // Note: The order to evaluate the following start, stop, stop_all matters.
277caf339d004fad667748b68912c254df4e75cdc5aYao Chen    // The priority of overwrite is stop_all > stop > start.
278caf339d004fad667748b68912c254df4e75cdc5aYao Chen    if (mStartLogMatcherIndex >= 0 &&
279caf339d004fad667748b68912c254df4e75cdc5aYao Chen        eventMatcherValues[mStartLogMatcherIndex] == MatchingState::kMatched) {
280967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        matchedState = 1;
281caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
282caf339d004fad667748b68912c254df4e75cdc5aYao Chen
283caf339d004fad667748b68912c254df4e75cdc5aYao Chen    if (mStopLogMatcherIndex >= 0 &&
284caf339d004fad667748b68912c254df4e75cdc5aYao Chen        eventMatcherValues[mStopLogMatcherIndex] == MatchingState::kMatched) {
285967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        matchedState = 0;
286729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    }
287729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
288967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen    if (matchedState < 0) {
289d41c4220d06875cea2d19a7991c3227bd56ea611Yao Chen        // The event doesn't match this condition. So we just report existing condition values.
290967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        conditionChangedCache[mIndex] = false;
291d41c4220d06875cea2d19a7991c3227bd56ea611Yao Chen        if (mSliced) {
292427d372552490a2c5ac4041fe345b15f69451f57Yao Chen            // if the condition result is sliced. The overall condition is true if any of the sliced
293427d372552490a2c5ac4041fe345b15f69451f57Yao Chen            // condition is true
2949369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac            conditionCache[mIndex] = mInitialValue;
295427d372552490a2c5ac4041fe345b15f69451f57Yao Chen            for (const auto& slicedCondition : mSlicedConditionState) {
296427d372552490a2c5ac4041fe345b15f69451f57Yao Chen                if (slicedCondition.second > 0) {
297427d372552490a2c5ac4041fe345b15f69451f57Yao Chen                    conditionCache[mIndex] = ConditionState::kTrue;
298427d372552490a2c5ac4041fe345b15f69451f57Yao Chen                    break;
299427d372552490a2c5ac4041fe345b15f69451f57Yao Chen                }
300427d372552490a2c5ac4041fe345b15f69451f57Yao Chen            }
301d41c4220d06875cea2d19a7991c3227bd56ea611Yao Chen        } else {
3027c334a129e93e405a72e8299a1cd928af079d14fYangster            const auto& itr = mSlicedConditionState.find(DEFAULT_DIMENSION_KEY);
3037c334a129e93e405a72e8299a1cd928af079d14fYangster            if (itr == mSlicedConditionState.end()) {
3047c334a129e93e405a72e8299a1cd928af079d14fYangster                // condition not sliced, but we haven't seen the matched start or stop yet. so
3057c334a129e93e405a72e8299a1cd928af079d14fYangster                // return initial value.
3067c334a129e93e405a72e8299a1cd928af079d14fYangster                conditionCache[mIndex] = mInitialValue;
3077c334a129e93e405a72e8299a1cd928af079d14fYangster            } else {
3087c334a129e93e405a72e8299a1cd928af079d14fYangster                // return the cached condition.
3097c334a129e93e405a72e8299a1cd928af079d14fYangster                conditionCache[mIndex] =
3107c334a129e93e405a72e8299a1cd928af079d14fYangster                        itr->second > 0 ? ConditionState::kTrue : ConditionState::kFalse;
3117c334a129e93e405a72e8299a1cd928af079d14fYangster            }
31213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            mUnSlicedPart = conditionCache[mIndex];
313d41c4220d06875cea2d19a7991c3227bd56ea611Yao Chen        }
3147c334a129e93e405a72e8299a1cd928af079d14fYangster
315967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen        return;
316729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    }
317729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
3188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    ConditionState overallState = mInitialValue;
3198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    bool overallChanged = false;
3208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (mOutputDimensions.size() == 0) {
3228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        handleConditionEvent(DEFAULT_DIMENSION_KEY, matchedState == 1, &overallState,
3238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                             &overallChanged);
32413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    } else if (!mContainANYPositionInInternalDimensions) {
32513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        HashableDimensionKey outputValue;
32613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        filterValues(mOutputDimensions, event.getValues(), &outputValue);
32713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
32813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        // If this event has multiple nodes in the attribution chain,  this log event probably will
32913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        // generate multiple dimensions. If so, we will find if the condition changes for any
33013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        // dimension and ask the corresponding metric producer to verify whether the actual sliced
33113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        // condition has changed or not.
33213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        // A high level assumption is that a predicate is either sliced or unsliced. We will never
33313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        // have both sliced and unsliced version of a predicate.
33413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        handleConditionEvent(outputValue, matchedState == 1, &overallState, &overallChanged);
3352087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    } else {
336e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac        ALOGE("The condition tracker should not be sliced by ANY position matcher.");
3372087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    }
3388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    conditionCache[mIndex] = overallState;
3398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    conditionChangedCache[mIndex] = overallChanged;
34013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    if (!mSliced) {
34113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        mUnSlicedPart = overallState;
34213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    }
343729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen}
344729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
345729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chenvoid SimpleConditionTracker::isConditionMet(
3468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        const ConditionKey& conditionParameters, const vector<sp<ConditionTracker>>& allConditions,
34713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        const vector<Matcher>& dimensionFields,
34813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        const bool isSubOutputDimensionFields,
34913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        const bool isPartialLink,
35013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        vector<ConditionState>& conditionCache,
3518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        std::unordered_set<HashableDimensionKey>& dimensionsKeySet) const {
3528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3539369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    if (conditionCache[mIndex] != ConditionState::kNotEvaluated) {
3549369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        // it has been evaluated.
3559369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        VLOG("Yes, already evaluated, %lld %d",
3569369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac            (long long)mConditionId, conditionCache[mIndex]);
3579369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        return;
3589369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    }
35994e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    const auto pair = conditionParameters.find(mConditionId);
360967b2051fe17fa3c38d248a556f8c4ff21a573a7Yao Chen
3619369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    if (pair == conditionParameters.end()) {
3629369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        ConditionState conditionState = ConditionState::kNotEvaluated;
3638a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if (dimensionFields.size() > 0 && dimensionFields[0].mMatcher.getTag() == mDimensionTag) {
3649369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac            conditionState = conditionState | getMetConditionDimension(
36513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                allConditions, dimensionFields, isSubOutputDimensionFields, dimensionsKeySet);
3669369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        } else {
3679369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac            conditionState = conditionState | mInitialValue;
3689369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac            if (!mSliced) {
3699369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac                const auto& itr = mSlicedConditionState.find(DEFAULT_DIMENSION_KEY);
3709369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac                if (itr != mSlicedConditionState.end()) {
3719369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac                    ConditionState sliceState =
3729369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac                        itr->second > 0 ? ConditionState::kTrue : ConditionState::kFalse;
3739369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac                    conditionState = conditionState | sliceState;
3749369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac                }
3759369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac            }
3769369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        }
3779369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        conditionCache[mIndex] = conditionState;
378729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen        return;
379729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    }
3802087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
3812087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    ConditionState conditionState = ConditionState::kNotEvaluated;
38213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    const HashableDimensionKey& key = pair->second;
38313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    if (isPartialLink) {
38413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        // For unseen key, check whether the require dimensions are subset of sliced condition
38513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        // output.
38613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        conditionState = conditionState | mInitialValue;
38713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        for (const auto& slice : mSlicedConditionState) {
38813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            ConditionState sliceState =
38913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                slice.second > 0 ? ConditionState::kTrue : ConditionState::kFalse;
39013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            if (slice.first.contains(key)) {
39113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                conditionState = conditionState | sliceState;
39213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                if (sliceState == ConditionState::kTrue && dimensionFields.size() > 0) {
39313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                    if (isSubOutputDimensionFields) {
39413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                        HashableDimensionKey dimensionKey;
39513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                        filterValues(dimensionFields, slice.first.getValues(), &dimensionKey);
39613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                        dimensionsKeySet.insert(dimensionKey);
39713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                    } else {
39813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                        dimensionsKeySet.insert(slice.first);
39913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                    }
40013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                }
40113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            }
40213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        }
40313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    } else {
4042087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        auto startedCountIt = mSlicedConditionState.find(key);
40513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        conditionState = conditionState | mInitialValue;
4062087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        if (startedCountIt != mSlicedConditionState.end()) {
4079369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac            ConditionState sliceState =
4089369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac                startedCountIt->second > 0 ? ConditionState::kTrue : ConditionState::kFalse;
4099369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac            conditionState = conditionState | sliceState;
4108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            if (sliceState == ConditionState::kTrue && dimensionFields.size() > 0) {
41113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                if (isSubOutputDimensionFields) {
41213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                    HashableDimensionKey dimensionKey;
41313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                    filterValues(dimensionFields, startedCountIt->first.getValues(), &dimensionKey);
41413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                    dimensionsKeySet.insert(dimensionKey);
41513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                } else {
41613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                    dimensionsKeySet.insert(startedCountIt->first);
4175503f5caae9496585da928a85c563ee28e683496Yangster-mac                }
4185503f5caae9496585da928a85c563ee28e683496Yangster-mac            }
4192087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        }
42013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
42113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    }
4222087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    conditionCache[mIndex] = conditionState;
42394e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    VLOG("Predicate %lld return %d", (long long)mConditionId, conditionCache[mIndex]);
424caf339d004fad667748b68912c254df4e75cdc5aYao Chen}
425caf339d004fad667748b68912c254df4e75cdc5aYao Chen
4269369446f0b04945d6674550728ae81196d6fb5c2Yangster-macConditionState SimpleConditionTracker::getMetConditionDimension(
4279369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        const std::vector<sp<ConditionTracker>>& allConditions,
4288a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        const vector<Matcher>& dimensionFields,
42913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        const bool isSubOutputDimensionFields,
4308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        std::unordered_set<HashableDimensionKey>& dimensionsKeySet) const {
4319369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    ConditionState conditionState = mInitialValue;
4328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (dimensionFields.size() == 0 || mOutputDimensions.size() == 0 ||
4338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        dimensionFields[0].mMatcher.getTag() != mOutputDimensions[0].mMatcher.getTag()) {
4349369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        const auto& itr = mSlicedConditionState.find(DEFAULT_DIMENSION_KEY);
4359369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        if (itr != mSlicedConditionState.end()) {
4369369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac            ConditionState sliceState =
4379369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac                itr->second > 0 ? ConditionState::kTrue : ConditionState::kFalse;
4389369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac            conditionState = conditionState | sliceState;
4399369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        }
4409369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        return conditionState;
4419369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    }
4429369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
4439369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    for (const auto& slice : mSlicedConditionState) {
4449369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        ConditionState sliceState =
4459369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac            slice.second > 0 ? ConditionState::kTrue : ConditionState::kFalse;
4469369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        conditionState = conditionState | sliceState;
4478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
4488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if (sliceState == ConditionState::kTrue && dimensionFields.size() > 0) {
44913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            if (isSubOutputDimensionFields) {
45013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                HashableDimensionKey dimensionKey;
45113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                filterValues(dimensionFields, slice.first.getValues(), &dimensionKey);
45213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                dimensionsKeySet.insert(dimensionKey);
45313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            } else {
45413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                dimensionsKeySet.insert(slice.first);
45513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            }
4569369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        }
4579369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    }
4589369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return conditionState;
4599369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac}
4609369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
461caf339d004fad667748b68912c254df4e75cdc5aYao Chen}  // namespace statsd
462caf339d004fad667748b68912c254df4e75cdc5aYao Chen}  // namespace os
463caf339d004fad667748b68912c254df4e75cdc5aYao Chen}  // namespace android
464