1729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen/*
2729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * Copyright (C) 2017 The Android Open Source Project
3729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen *
4729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * Licensed under the Apache License, Version 2.0 (the "License");
5729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * you may not use this file except in compliance with the License.
6729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * You may obtain a copy of the License at
7729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen *
8729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen *      http://www.apache.org/licenses/LICENSE-2.0
9729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen *
10729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * Unless required by applicable law or agreed to in writing, software
11729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * distributed under the License is distributed on an "AS IS" BASIS,
12729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * See the License for the specific language governing permissions and
14729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * limitations under the License.
15729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen */
16729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen#include "ConditionWizard.h"
179369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac#include <unordered_set>
18729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
19729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chennamespace android {
20729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chennamespace os {
21729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chennamespace statsd {
22729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
23729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chenusing std::map;
24729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chenusing std::string;
25729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chenusing std::vector;
26729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
278a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenConditionState ConditionWizard::query(const int index, const ConditionKey& parameters,
288a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                                      const vector<Matcher>& dimensionFields,
2913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                                      const bool isSubOutputDimensionFields,
3013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                                      const bool isPartialLink,
318a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                                      std::unordered_set<HashableDimensionKey>* dimensionKeySet) {
32729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    vector<ConditionState> cache(mAllConditions.size(), ConditionState::kNotEvaluated);
33729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
349369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    mAllConditions[index]->isConditionMet(
3513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        parameters, mAllConditions, dimensionFields, isSubOutputDimensionFields, isPartialLink,
3613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        cache, *dimensionKeySet);
37729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    return cache[index];
38729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen}
39729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
409369446f0b04945d6674550728ae81196d6fb5c2Yangster-macConditionState ConditionWizard::getMetConditionDimension(
418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        const int index, const vector<Matcher>& dimensionFields,
4213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        const bool isSubOutputDimensionFields,
438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        std::unordered_set<HashableDimensionKey>* dimensionsKeySet) const {
449369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return mAllConditions[index]->getMetConditionDimension(mAllConditions, dimensionFields,
4513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                                                           isSubOutputDimensionFields,
4613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                                                           *dimensionsKeySet);
479369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac}
489369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
49580ea321b16c71ddec515553761d6f37359bd3a0Yao Chenconst set<HashableDimensionKey>* ConditionWizard::getChangedToTrueDimensions(
50580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen        const int index) const {
51580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    return mAllConditions[index]->getChangedToTrueDimensions(mAllConditions);
52580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen}
53580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen
54580ea321b16c71ddec515553761d6f37359bd3a0Yao Chenconst set<HashableDimensionKey>* ConditionWizard::getChangedToFalseDimensions(
55580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen        const int index) const {
56580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    return mAllConditions[index]->getChangedToFalseDimensions(mAllConditions);
57580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen}
58580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen
5913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsterbool ConditionWizard::IsChangedDimensionTrackable(const int index) {
6013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    if (index >= 0 && index < (int)mAllConditions.size()) {
6113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        return mAllConditions[index]->IsChangedDimensionTrackable();
6213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    } else {
6313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        return false;
6413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    }
6513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
6613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
6713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsterbool ConditionWizard::IsSimpleCondition(const int index) {
6813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    if (index >= 0 && index < (int)mAllConditions.size()) {
6913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        return mAllConditions[index]->IsSimpleCondition();
7013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    } else {
7113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        return false;
7213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    }
7313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
7413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
7513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsterbool ConditionWizard::equalOutputDimensions(const int index, const vector<Matcher>& dimensions) {
7613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    if (index >= 0 && index < (int)mAllConditions.size()) {
7713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        return mAllConditions[index]->equalOutputDimensions(mAllConditions, dimensions);
7813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    } else {
7913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        return false;
8013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    }
8113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
8213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
83729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen}  // namespace statsd
84729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen}  // namespace os
85729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen}  // namespace android