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
179fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#include "Log.h"
189fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato
19caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "condition_util.h"
20caf339d004fad667748b68912c254df4e75cdc5aYao Chen
21caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include <log/event_tag_map.h>
22caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include <log/log_event_list.h>
23caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include <log/logprint.h>
24caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include <utils/Errors.h>
25caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include <unordered_map>
26729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen#include "../matchers/matcher_util.h"
27caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "ConditionTracker.h"
28caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
29caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "stats_util.h"
30caf339d004fad667748b68912c254df4e75cdc5aYao Chen
319fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace android {
329fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace os {
339fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace statsd {
349fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato
35caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::set;
36caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::string;
37caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::unordered_map;
38caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::vector;
39caf339d004fad667748b68912c254df4e75cdc5aYao Chen
40caf339d004fad667748b68912c254df4e75cdc5aYao Chen
41caf339d004fad667748b68912c254df4e75cdc5aYao ChenConditionState evaluateCombinationCondition(const std::vector<int>& children,
42caf339d004fad667748b68912c254df4e75cdc5aYao Chen                                            const LogicalOperation& operation,
43caf339d004fad667748b68912c254df4e75cdc5aYao Chen                                            const std::vector<ConditionState>& conditionCache) {
44caf339d004fad667748b68912c254df4e75cdc5aYao Chen    ConditionState newCondition;
45caf339d004fad667748b68912c254df4e75cdc5aYao Chen
46caf339d004fad667748b68912c254df4e75cdc5aYao Chen    bool hasUnknown = false;
47caf339d004fad667748b68912c254df4e75cdc5aYao Chen    bool hasFalse = false;
48caf339d004fad667748b68912c254df4e75cdc5aYao Chen    bool hasTrue = false;
49caf339d004fad667748b68912c254df4e75cdc5aYao Chen
50caf339d004fad667748b68912c254df4e75cdc5aYao Chen    for (auto childIndex : children) {
51caf339d004fad667748b68912c254df4e75cdc5aYao Chen        ConditionState childState = conditionCache[childIndex];
52caf339d004fad667748b68912c254df4e75cdc5aYao Chen        if (childState == ConditionState::kUnknown) {
53caf339d004fad667748b68912c254df4e75cdc5aYao Chen            hasUnknown = true;
54caf339d004fad667748b68912c254df4e75cdc5aYao Chen            break;
55caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
56caf339d004fad667748b68912c254df4e75cdc5aYao Chen        if (childState == ConditionState::kFalse) {
57caf339d004fad667748b68912c254df4e75cdc5aYao Chen            hasFalse = true;
58caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
59caf339d004fad667748b68912c254df4e75cdc5aYao Chen        if (childState == ConditionState::kTrue) {
60caf339d004fad667748b68912c254df4e75cdc5aYao Chen            hasTrue = true;
61caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
62caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
63caf339d004fad667748b68912c254df4e75cdc5aYao Chen
64caf339d004fad667748b68912c254df4e75cdc5aYao Chen    // If any child condition is in unknown state, the condition is unknown too.
65caf339d004fad667748b68912c254df4e75cdc5aYao Chen    if (hasUnknown) {
66caf339d004fad667748b68912c254df4e75cdc5aYao Chen        return ConditionState::kUnknown;
67caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
68caf339d004fad667748b68912c254df4e75cdc5aYao Chen
69caf339d004fad667748b68912c254df4e75cdc5aYao Chen    switch (operation) {
70caf339d004fad667748b68912c254df4e75cdc5aYao Chen        case LogicalOperation::AND: {
71caf339d004fad667748b68912c254df4e75cdc5aYao Chen            newCondition = hasFalse ? ConditionState::kFalse : ConditionState::kTrue;
72caf339d004fad667748b68912c254df4e75cdc5aYao Chen            break;
73caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
74caf339d004fad667748b68912c254df4e75cdc5aYao Chen        case LogicalOperation::OR: {
75caf339d004fad667748b68912c254df4e75cdc5aYao Chen            newCondition = hasTrue ? ConditionState::kTrue : ConditionState::kFalse;
76caf339d004fad667748b68912c254df4e75cdc5aYao Chen            break;
77caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
78caf339d004fad667748b68912c254df4e75cdc5aYao Chen        case LogicalOperation::NOT:
79caf339d004fad667748b68912c254df4e75cdc5aYao Chen            newCondition = (conditionCache[children[0]] == ConditionState::kFalse)
80caf339d004fad667748b68912c254df4e75cdc5aYao Chen                                   ? ConditionState::kTrue
81caf339d004fad667748b68912c254df4e75cdc5aYao Chen                                   : ConditionState::kFalse;
82caf339d004fad667748b68912c254df4e75cdc5aYao Chen            break;
83caf339d004fad667748b68912c254df4e75cdc5aYao Chen        case LogicalOperation::NAND:
84caf339d004fad667748b68912c254df4e75cdc5aYao Chen            newCondition = hasFalse ? ConditionState::kTrue : ConditionState::kFalse;
85caf339d004fad667748b68912c254df4e75cdc5aYao Chen            break;
86caf339d004fad667748b68912c254df4e75cdc5aYao Chen        case LogicalOperation::NOR:
87caf339d004fad667748b68912c254df4e75cdc5aYao Chen            newCondition = hasTrue ? ConditionState::kFalse : ConditionState::kTrue;
88caf339d004fad667748b68912c254df4e75cdc5aYao Chen            break;
89cfed20bce8a66bde6ad0d74a44fc0a2764b2886dStefan Lafon        case LogicalOperation::LOGICAL_OPERATION_UNSPECIFIED:
90cfed20bce8a66bde6ad0d74a44fc0a2764b2886dStefan Lafon            newCondition = ConditionState::kFalse;
91cfed20bce8a66bde6ad0d74a44fc0a2764b2886dStefan Lafon            break;
92caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
93caf339d004fad667748b68912c254df4e75cdc5aYao Chen    return newCondition;
94caf339d004fad667748b68912c254df4e75cdc5aYao Chen}
95caf339d004fad667748b68912c254df4e75cdc5aYao Chen
962087716f2bdca90c7c3034d556ac12911bd8018eYangster-macConditionState operator|(ConditionState l, ConditionState r) {
972087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return l >= r ? l : r;
982087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
99caf339d004fad667748b68912c254df4e75cdc5aYao Chen}  // namespace statsd
100caf339d004fad667748b68912c254df4e75cdc5aYao Chen}  // namespace os
101caf339d004fad667748b68912c254df4e75cdc5aYao Chen}  // namespace android
102