18a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen/*
28a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * Copyright (C) 2018 The Android Open Source Project
38a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *
48a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * Licensed under the Apache License, Version 2.0 (the "License");
58a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * you may not use this file except in compliance with the License.
68a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * You may obtain a copy of the License at
78a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *
88a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *      http://www.apache.org/licenses/LICENSE-2.0
98a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *
108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * Unless required by applicable law or agreed to in writing, software
118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * distributed under the License is distributed on an "AS IS" BASIS,
128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * See the License for the specific language governing permissions and
148a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * limitations under the License.
158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen */
168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#define DEBUG false
188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#include "Log.h"
198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#include "FieldValue.h"
208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#include "HashableDimensionKey.h"
218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chennamespace android {
238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chennamespace os {
248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chennamespace statsd {
258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
264c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chenint32_t getEncodedField(int32_t pos[], int32_t depth, bool includeDepth) {
274c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen    int32_t field = 0;
284c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen    for (int32_t i = 0; i <= depth; i++) {
294c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen        int32_t shiftBits = 8 * (kMaxLogDepth - i);
304c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen        field |= (pos[i] << shiftBits);
314c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen    }
324c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen
334c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen    if (includeDepth) {
344c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen        field |= (depth << 24);
354c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen    }
364c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen    return field;
374c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen}
384c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen
394c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chenint32_t encodeMatcherMask(int32_t mask[], int32_t depth) {
404c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen    return getEncodedField(mask, depth, false) | 0xff000000;
414c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen}
424c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen
438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenbool Field::matches(const Matcher& matcher) const {
448a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (mTag != matcher.mMatcher.getTag()) {
458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return false;
468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if ((mField & matcher.mMask) == matcher.mMatcher.getField()) {
488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return true;
498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
51e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    if (matcher.hasAllPositionMatcher() &&
52e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac        (mField & (matcher.mMask & kClearAllPositionMatcherMask)) == matcher.mMatcher.getField()) {
53e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac        return true;
54e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    }
55e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac
568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    return false;
574c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen}
588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
598a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenvoid translateFieldMatcher(int tag, const FieldMatcher& matcher, int depth, int* pos, int* mask,
608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                           std::vector<Matcher>* output) {
618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (depth > kMaxLogDepth) {
628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        ALOGE("depth > 2");
638a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return;
648a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
668a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    pos[depth] = matcher.field();
678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    mask[depth] = 0x7f;
688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
698a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (matcher.has_position()) {
708a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        depth++;
718a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if (depth > 2) {
728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return;
738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        switch (matcher.position()) {
75e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac            case Position::ALL:
76e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac                pos[depth] = 0x00;
77e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac                mask[depth] = 0x7f;
78e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac                break;
798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            case Position::ANY:
808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                pos[depth] = 0;
818a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                mask[depth] = 0;
828a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                break;
838a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            case Position::FIRST:
848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                pos[depth] = 1;
858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                mask[depth] = 0x7f;
868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                break;
878a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            case Position::LAST:
888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                pos[depth] = 0x80;
898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                mask[depth] = 0x80;
908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                break;
918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            case Position::POSITION_UNKNOWN:
928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                pos[depth] = 0;
938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                mask[depth] = 0;
948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                break;
958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
968a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
978a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
988a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (matcher.child_size() == 0) {
998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        output->push_back(Matcher(Field(tag, pos, depth), encodeMatcherMask(mask, depth)));
1008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    } else {
1018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        for (const auto& child : matcher.child()) {
1028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            translateFieldMatcher(tag, child, depth + 1, pos, mask, output);
1038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
1048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
1058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
1068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
1078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenvoid translateFieldMatcher(const FieldMatcher& matcher, std::vector<Matcher>* output) {
1088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int pos[] = {1, 1, 1};
1098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int mask[] = {0x7f, 0x7f, 0x7f};
1108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int tag = matcher.field();
1118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    for (const auto& child : matcher.child()) {
1128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        translateFieldMatcher(tag, child, 0, pos, mask, output);
1138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
1148a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
1158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
1168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenbool isAttributionUidField(const FieldValue& value) {
1178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int field = value.mField.getField() & 0xff007f;
1188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (field == 0x10001 && value.mValue.getType() == INT) {
1198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return true;
1208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
1218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    return false;
1228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
1238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
1248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenbool isAttributionUidField(const Field& field, const Value& value) {
1258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int f = field.getField() & 0xff007f;
1268a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (f == 0x10001 && value.getType() == INT) {
1278a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return true;
1288a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
1298a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    return false;
1308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
1318a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
1328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenValue::Value(const Value& from) {
1338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    type = from.getType();
1348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    switch (type) {
1358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case INT:
1368a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            int_value = from.int_value;
1378a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            break;
1388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case LONG:
1398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            long_value = from.long_value;
1408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            break;
1418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case FLOAT:
1428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            float_value = from.float_value;
1438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            break;
1448a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case STRING:
1458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            str_value = from.str_value;
1468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            break;
147f520492279ce5c0a029c36b5251031a66f1413fbYangster-mac        default:
148f520492279ce5c0a029c36b5251031a66f1413fbYangster-mac            break;
1498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
1508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
1518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
1528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenstd::string Value::toString() const {
1538a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    switch (type) {
1548a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case INT:
1558a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return std::to_string(int_value) + "[I]";
1568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case LONG:
1578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return std::to_string(long_value) + "[L]";
1588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case FLOAT:
1598a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return std::to_string(float_value) + "[F]";
1608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case STRING:
1618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return str_value + "[S]";
162f520492279ce5c0a029c36b5251031a66f1413fbYangster-mac        default:
163f520492279ce5c0a029c36b5251031a66f1413fbYangster-mac            return "[UNKNOWN]";
1648a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
1658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
1668a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
1678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenbool Value::operator==(const Value& that) const {
1688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (type != that.getType()) return false;
1698a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
1708a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    switch (type) {
1718a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case INT:
1728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return int_value == that.int_value;
1738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case LONG:
1748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return long_value == that.long_value;
1758a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case FLOAT:
1768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return float_value == that.float_value;
1778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case STRING:
1788a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return str_value == that.str_value;
179f520492279ce5c0a029c36b5251031a66f1413fbYangster-mac        default:
180f520492279ce5c0a029c36b5251031a66f1413fbYangster-mac            return false;
1818a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
1828a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
1838a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
1848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenbool Value::operator!=(const Value& that) const {
1858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (type != that.getType()) return true;
1868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    switch (type) {
1878a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case INT:
1888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return int_value != that.int_value;
1898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case LONG:
1908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return long_value != that.long_value;
1918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case FLOAT:
1928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return float_value != that.float_value;
1938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case STRING:
1948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return str_value != that.str_value;
195f520492279ce5c0a029c36b5251031a66f1413fbYangster-mac        default:
196f520492279ce5c0a029c36b5251031a66f1413fbYangster-mac            return false;
1978a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
1988a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
1998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenbool Value::operator<(const Value& that) const {
2018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (type != that.getType()) return type < that.getType();
2028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    switch (type) {
2048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case INT:
2058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return int_value < that.int_value;
2068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case LONG:
2078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return long_value < that.long_value;
2088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case FLOAT:
2098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return float_value < that.float_value;
2108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case STRING:
2118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return str_value < that.str_value;
2128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        default:
2138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return false;
2148a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
2158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
2168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
21713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsterbool equalDimensions(const std::vector<Matcher>& dimension_a,
21813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                     const std::vector<Matcher>& dimension_b) {
21913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    bool eq = dimension_a.size() == dimension_b.size();
22013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    for (size_t i = 0; eq && i < dimension_a.size(); ++i) {
22113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        if (dimension_b[i] != dimension_a[i]) {
22213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            eq = false;
22313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        }
22413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    }
22513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    return eq;
22613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
22713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
22813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsterbool HasPositionANY(const FieldMatcher& matcher) {
22913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    if (matcher.has_position() && matcher.position() == Position::ANY) {
23013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        return true;
23113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    }
23213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    for (const auto& child : matcher.child()) {
23313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        if (HasPositionANY(child)) {
23413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            return true;
23513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        }
23613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    }
23713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    return false;
23813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
23913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
2409def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macbool HasPositionALL(const FieldMatcher& matcher) {
2419def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    if (matcher.has_position() && matcher.position() == Position::ALL) {
2429def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        return true;
2439def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
2449def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    for (const auto& child : matcher.child()) {
2459def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        if (HasPositionALL(child)) {
2469def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            return true;
2479def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
2489def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
2499def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    return false;
2509def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac}
2519def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac
2528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}  // namespace statsd
2538a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}  // namespace os
2548a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}  // namespace android