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