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