summaryrefslogtreecommitdiff
path: root/cmds/statsd/src/dimension.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cmds/statsd/src/dimension.cpp')
-rw-r--r--cmds/statsd/src/dimension.cpp400
1 files changed, 0 insertions, 400 deletions
diff --git a/cmds/statsd/src/dimension.cpp b/cmds/statsd/src/dimension.cpp
deleted file mode 100644
index 8a2e87128319..000000000000
--- a/cmds/statsd/src/dimension.cpp
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Log.h"
-
-#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
-#include "frameworks/base/cmds/statsd/src/statsd_internal.pb.h"
-#include "dimension.h"
-
-
-namespace android {
-namespace os {
-namespace statsd {
-
-const DimensionsValue* getSingleLeafValue(const DimensionsValue* value) {
- if (value->value_case() == DimensionsValue::ValueCase::kValueTuple) {
- return getSingleLeafValue(&value->value_tuple().dimensions_value(0));
- } else {
- return value;
- }
-}
-
-DimensionsValue getSingleLeafValue(const DimensionsValue& value) {
- const DimensionsValue* leafValue = getSingleLeafValue(&value);
- return *leafValue;
-}
-
-void appendLeafNodeToTree(const Field& field,
- const DimensionsValue& value,
- DimensionsValue* parentValue) {
- if (field.child_size() <= 0) {
- *parentValue = value;
- parentValue->set_field(field.field());
- return;
- }
- parentValue->set_field(field.field());
- int idx = -1;
- for (int i = 0; i < parentValue->mutable_value_tuple()->dimensions_value_size(); ++i) {
- if (parentValue->mutable_value_tuple()->dimensions_value(i).field() ==
- field.child(0).field()) {
- idx = i;
- }
- }
- if (idx < 0) {
- parentValue->mutable_value_tuple()->add_dimensions_value();
- idx = parentValue->mutable_value_tuple()->dimensions_value_size() - 1;
- }
- appendLeafNodeToTree(
- field.child(0), value,
- parentValue->mutable_value_tuple()->mutable_dimensions_value(idx));
-}
-
-void appendLeafNodeToTrees(const Field& field,
- const DimensionsValue& node,
- std::vector<DimensionsValue>* rootTrees) {
- if (rootTrees == nullptr) {
- return;
- }
- if (rootTrees->empty()) {
- DimensionsValue tree;
- appendLeafNodeToTree(field, node, &tree);
- rootTrees->push_back(tree);
- } else {
- for (size_t i = 0; i < rootTrees->size(); ++i) {
- appendLeafNodeToTree(field, node, &rootTrees->at(i));
- }
- }
-}
-
-namespace {
-
-void findDimensionsValues(
- const FieldValueMap& fieldValueMap,
- const FieldMatcher& matcher,
- Field* rootField,
- Field* leafField,
- std::vector<DimensionsValue>* rootDimensionsValues);
-
-void findNonRepeatedDimensionsValues(
- const FieldValueMap& fieldValueMap,
- const FieldMatcher& matcher,
- Field* rootField,
- Field* leafField,
- std::vector<DimensionsValue>* rootValues) {
- if (matcher.child_size() > 0) {
- Field* newLeafField = leafField->add_child();
- for (const auto& childMatcher : matcher.child()) {
- newLeafField->set_field(childMatcher.field());
- findDimensionsValues(fieldValueMap, childMatcher, rootField, newLeafField, rootValues);
- }
- leafField->clear_child();
- } else {
- auto ret = fieldValueMap.equal_range(*rootField);
- int found = 0;
- for (auto it = ret.first; it != ret.second; ++it) {
- found++;
- }
- // Not found.
- if (found <= 0) {
- return;
- }
- if (found > 1) {
- ALOGE("Found multiple values for optional field.");
- return;
- }
- appendLeafNodeToTrees(*rootField, ret.first->second, rootValues);
- }
-}
-
-void findRepeatedDimensionsValues(const FieldValueMap& fieldValueMap,
- const FieldMatcher& matcher,
- Field* rootField,
- Field* leafField,
- std::vector<DimensionsValue>* rootValues) {
- if (matcher.position() == Position::FIRST) {
- leafField->set_position_index(0);
- findNonRepeatedDimensionsValues(fieldValueMap, matcher, rootField, leafField, rootValues);
- leafField->clear_position_index();
- } else {
- auto itLower = fieldValueMap.lower_bound(*rootField);
- if (itLower == fieldValueMap.end()) {
- return;
- }
- const int leafFieldNum = leafField->field();
- leafField->set_field(leafFieldNum + 1);
- auto itUpper = fieldValueMap.lower_bound(*rootField);
- // Resets the field number.
- leafField->set_field(leafFieldNum);
-
- switch (matcher.position()) {
- case Position::LAST:
- {
- itUpper--;
- if (itUpper != fieldValueMap.end()) {
- int last_index = getPositionByReferenceField(*rootField, itUpper->first);
- if (last_index < 0) {
- return;
- }
- leafField->set_position_index(last_index);
- findNonRepeatedDimensionsValues(
- fieldValueMap, matcher, rootField, leafField, rootValues);
- leafField->clear_position_index();
- }
- }
- break;
- case Position::ANY:
- {
- std::set<int> indexes;
- for (auto it = itLower; it != itUpper; ++it) {
- int index = getPositionByReferenceField(*rootField, it->first);
- if (index >= 0) {
- indexes.insert(index);
- }
- }
- if (!indexes.empty()) {
- std::vector<DimensionsValue> allValues;
- for (const int index : indexes) {
- leafField->set_position_index(index);
- std::vector<DimensionsValue> newValues = *rootValues;
- findNonRepeatedDimensionsValues(
- fieldValueMap, matcher, rootField, leafField, &newValues);
- allValues.insert(allValues.end(), newValues.begin(), newValues.end());
- leafField->clear_position_index();
- }
- rootValues->clear();
- rootValues->insert(rootValues->end(), allValues.begin(), allValues.end());
- }
- }
- break;
- default:
- break;
- }
- }
-}
-
-void findDimensionsValues(
- const FieldValueMap& fieldValueMap,
- const FieldMatcher& matcher,
- Field* rootField,
- Field* leafField,
- std::vector<DimensionsValue>* rootDimensionsValues) {
- if (!matcher.has_position()) {
- findNonRepeatedDimensionsValues(fieldValueMap, matcher, rootField, leafField,
- rootDimensionsValues);
- } else {
- findRepeatedDimensionsValues(fieldValueMap, matcher, rootField, leafField,
- rootDimensionsValues);
- }
-}
-
-} // namespace
-
-void findDimensionsValues(
- const FieldValueMap& fieldValueMap,
- const FieldMatcher& matcher,
- std::vector<DimensionsValue>* rootDimensionsValues) {
- Field rootField;
- buildSimpleAtomField(matcher.field(), &rootField);
- findDimensionsValues(fieldValueMap, matcher, &rootField, &rootField, rootDimensionsValues);
-}
-
-void buildSimpleAtomFieldMatcher(const int tagId, FieldMatcher* matcher) {
- matcher->set_field(tagId);
-}
-
-void buildSimpleAtomFieldMatcher(const int tagId, const int fieldNum, FieldMatcher* matcher) {
- matcher->set_field(tagId);
- matcher->add_child()->set_field(fieldNum);
-}
-
-constexpr int ATTRIBUTION_FIELD_NUM_IN_ATOM_PROTO = 1;
-constexpr int UID_FIELD_NUM_IN_ATTRIBUTION_NODE_PROTO = 1;
-constexpr int TAG_FIELD_NUM_IN_ATTRIBUTION_NODE_PROTO = 2;
-
-void buildAttributionUidFieldMatcher(const int tagId, const Position position,
- FieldMatcher* matcher) {
- matcher->set_field(tagId);
- auto child = matcher->add_child();
- child->set_field(ATTRIBUTION_FIELD_NUM_IN_ATOM_PROTO);
- child->set_position(position);
- child->add_child()->set_field(UID_FIELD_NUM_IN_ATTRIBUTION_NODE_PROTO);
-}
-
-void buildAttributionTagFieldMatcher(const int tagId, const Position position,
- FieldMatcher* matcher) {
- matcher->set_field(tagId);
- FieldMatcher* child = matcher->add_child();
- child->set_field(ATTRIBUTION_FIELD_NUM_IN_ATOM_PROTO);
- child->set_position(position);
- child->add_child()->set_field(TAG_FIELD_NUM_IN_ATTRIBUTION_NODE_PROTO);
-}
-
-void buildAttributionFieldMatcher(const int tagId, const Position position, FieldMatcher* matcher) {
- matcher->set_field(tagId);
- FieldMatcher* child = matcher->add_child();
- child->set_field(ATTRIBUTION_FIELD_NUM_IN_ATOM_PROTO);
- child->set_position(position);
- child->add_child()->set_field(UID_FIELD_NUM_IN_ATTRIBUTION_NODE_PROTO);
- child->add_child()->set_field(TAG_FIELD_NUM_IN_ATTRIBUTION_NODE_PROTO);
-}
-
-void DimensionsValueToString(const DimensionsValue& value, std::string *flattened) {
- if (!value.has_field()) {
- return;
- }
- *flattened += std::to_string(value.field());
- *flattened += ":";
- switch (value.value_case()) {
- case DimensionsValue::ValueCase::kValueStr:
- *flattened += value.value_str();
- break;
- case DimensionsValue::ValueCase::kValueInt:
- *flattened += std::to_string(value.value_int());
- break;
- case DimensionsValue::ValueCase::kValueLong:
- *flattened += std::to_string(value.value_long());
- break;
- case DimensionsValue::ValueCase::kValueBool:
- *flattened += std::to_string(value.value_bool());
- break;
- case DimensionsValue::ValueCase::kValueFloat:
- *flattened += std::to_string(value.value_float());
- break;
- case DimensionsValue::ValueCase::kValueTuple:
- {
- *flattened += "{";
- for (int i = 0; i < value.value_tuple().dimensions_value_size(); ++i) {
- DimensionsValueToString(value.value_tuple().dimensions_value(i), flattened);
- *flattened += "|";
- }
- *flattened += "}";
- }
- break;
- case DimensionsValue::ValueCase::VALUE_NOT_SET:
- break;
- }
-}
-
-std::string DimensionsValueToString(const DimensionsValue& value) {
- std::string flatten;
- DimensionsValueToString(value, &flatten);
- return flatten;
-}
-
-bool IsSubDimension(const DimensionsValue& dimension, const DimensionsValue& sub) {
- if (dimension.field() != sub.field()) {
- return false;
- }
- if (dimension.value_case() != sub.value_case()) {
- return false;
- }
- switch (dimension.value_case()) {
- case DimensionsValue::ValueCase::kValueStr:
- return dimension.value_str() == sub.value_str();
- case DimensionsValue::ValueCase::kValueInt:
- return dimension.value_int() == sub.value_int();
- case DimensionsValue::ValueCase::kValueLong:
- return dimension.value_long() == sub.value_long();
- case DimensionsValue::ValueCase::kValueBool:
- return dimension.value_bool() == sub.value_bool();
- case DimensionsValue::ValueCase::kValueFloat:
- return dimension.value_float() == sub.value_float();
- case DimensionsValue::ValueCase::kValueTuple: {
- if (dimension.value_tuple().dimensions_value_size() <
- sub.value_tuple().dimensions_value_size()) {
- return false;
- }
- bool allSub = true;
- for (int i = 0; allSub && i < sub.value_tuple().dimensions_value_size(); ++i) {
- bool isSub = false;
- for (int j = 0; !isSub &&
- j < dimension.value_tuple().dimensions_value_size(); ++j) {
- isSub |= IsSubDimension(dimension.value_tuple().dimensions_value(j),
- sub.value_tuple().dimensions_value(i));
- }
- allSub &= isSub;
- }
- return allSub;
- }
- break;
- case DimensionsValue::ValueCase::VALUE_NOT_SET:
- return false;
- default:
- return false;
- }
-}
-
-long getLongFromDimenValue(const DimensionsValue& dimensionValue) {
- switch (dimensionValue.value_case()) {
- case DimensionsValue::ValueCase::kValueInt:
- return dimensionValue.value_int();
- case DimensionsValue::ValueCase::kValueLong:
- return dimensionValue.value_long();
- case DimensionsValue::ValueCase::kValueBool:
- return dimensionValue.value_bool() ? 1 : 0;
- case DimensionsValue::ValueCase::kValueFloat:
- return (int64_t)dimensionValue.value_float();
- case DimensionsValue::ValueCase::kValueTuple:
- case DimensionsValue::ValueCase::kValueStr:
- case DimensionsValue::ValueCase::VALUE_NOT_SET:
- return 0;
- }
-}
-
-bool getSubDimension(const DimensionsValue& dimension, const FieldMatcher& matcher,
- DimensionsValue* subDimension) {
- if (!matcher.has_field()) {
- return false;
- }
- if (matcher.field() != dimension.field()) {
- return false;
- }
- if (matcher.child_size() <= 0) {
- if (dimension.value_case() == DimensionsValue::ValueCase::kValueTuple ||
- dimension.value_case() == DimensionsValue::ValueCase::VALUE_NOT_SET) {
- return false;
- }
- *subDimension = dimension;
- return true;
- } else {
- if (dimension.value_case() != DimensionsValue::ValueCase::kValueTuple) {
- return false;
- }
- bool found_value = true;
- auto value_tuple = dimension.value_tuple();
- subDimension->set_field(dimension.field());
- for (int i = 0; found_value && i < matcher.child_size(); ++i) {
- int j = 0;
- for (; j < value_tuple.dimensions_value_size(); ++j) {
- if (value_tuple.dimensions_value(j).field() == matcher.child(i).field()) {
- break;
- }
- }
- if (j < value_tuple.dimensions_value_size()) {
- found_value &= getSubDimension(value_tuple.dimensions_value(j), matcher.child(i),
- subDimension->mutable_value_tuple()->add_dimensions_value());
- } else {
- found_value = false;
- }
- }
- return found_value;
- }
-}
-
-} // namespace statsd
-} // namespace os
-} // namespace android