1*993b0882SAndroid Build Coastguard Worker /* 2*993b0882SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*993b0882SAndroid Build Coastguard Worker * 4*993b0882SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*993b0882SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*993b0882SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*993b0882SAndroid Build Coastguard Worker * 8*993b0882SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*993b0882SAndroid Build Coastguard Worker * 10*993b0882SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*993b0882SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*993b0882SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*993b0882SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*993b0882SAndroid Build Coastguard Worker * limitations under the License. 15*993b0882SAndroid Build Coastguard Worker */ 16*993b0882SAndroid Build Coastguard Worker 17*993b0882SAndroid Build Coastguard Worker #include "annotator/flatbuffer-utils.h" 18*993b0882SAndroid Build Coastguard Worker 19*993b0882SAndroid Build Coastguard Worker #include <memory> 20*993b0882SAndroid Build Coastguard Worker 21*993b0882SAndroid Build Coastguard Worker #include "utils/base/logging.h" 22*993b0882SAndroid Build Coastguard Worker #include "utils/flatbuffers/flatbuffers.h" 23*993b0882SAndroid Build Coastguard Worker #include "utils/flatbuffers/reflection.h" 24*993b0882SAndroid Build Coastguard Worker #include "flatbuffers/reflection.h" 25*993b0882SAndroid Build Coastguard Worker 26*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 { 27*993b0882SAndroid Build Coastguard Worker SwapFieldNamesForOffsetsInPath(ModelT * model)28*993b0882SAndroid Build Coastguard Workerbool SwapFieldNamesForOffsetsInPath(ModelT* model) { 29*993b0882SAndroid Build Coastguard Worker if (model->regex_model == nullptr || model->entity_data_schema.empty()) { 30*993b0882SAndroid Build Coastguard Worker // Nothing to do. 31*993b0882SAndroid Build Coastguard Worker return true; 32*993b0882SAndroid Build Coastguard Worker } 33*993b0882SAndroid Build Coastguard Worker const reflection::Schema* schema = 34*993b0882SAndroid Build Coastguard Worker LoadAndVerifyFlatbuffer<reflection::Schema>( 35*993b0882SAndroid Build Coastguard Worker model->entity_data_schema.data(), model->entity_data_schema.size()); 36*993b0882SAndroid Build Coastguard Worker 37*993b0882SAndroid Build Coastguard Worker for (std::unique_ptr<RegexModel_::PatternT>& pattern : 38*993b0882SAndroid Build Coastguard Worker model->regex_model->patterns) { 39*993b0882SAndroid Build Coastguard Worker for (std::unique_ptr<CapturingGroupT>& group : pattern->capturing_group) { 40*993b0882SAndroid Build Coastguard Worker if (group->entity_field_path == nullptr) { 41*993b0882SAndroid Build Coastguard Worker continue; 42*993b0882SAndroid Build Coastguard Worker } 43*993b0882SAndroid Build Coastguard Worker 44*993b0882SAndroid Build Coastguard Worker if (!SwapFieldNamesForOffsetsInPath(schema, 45*993b0882SAndroid Build Coastguard Worker group->entity_field_path.get())) { 46*993b0882SAndroid Build Coastguard Worker return false; 47*993b0882SAndroid Build Coastguard Worker } 48*993b0882SAndroid Build Coastguard Worker } 49*993b0882SAndroid Build Coastguard Worker } 50*993b0882SAndroid Build Coastguard Worker 51*993b0882SAndroid Build Coastguard Worker return true; 52*993b0882SAndroid Build Coastguard Worker } 53*993b0882SAndroid Build Coastguard Worker SwapFieldNamesForOffsetsInPathInSerializedModel(const std::string & model)54*993b0882SAndroid Build Coastguard Workerstd::string SwapFieldNamesForOffsetsInPathInSerializedModel( 55*993b0882SAndroid Build Coastguard Worker const std::string& model) { 56*993b0882SAndroid Build Coastguard Worker std::unique_ptr<ModelT> unpacked_model = UnPackModel(model.c_str()); 57*993b0882SAndroid Build Coastguard Worker TC3_CHECK(unpacked_model != nullptr); 58*993b0882SAndroid Build Coastguard Worker TC3_CHECK(SwapFieldNamesForOffsetsInPath(unpacked_model.get())); 59*993b0882SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder builder; 60*993b0882SAndroid Build Coastguard Worker FinishModelBuffer(builder, Model::Pack(builder, unpacked_model.get())); 61*993b0882SAndroid Build Coastguard Worker return std::string(reinterpret_cast<const char*>(builder.GetBufferPointer()), 62*993b0882SAndroid Build Coastguard Worker builder.GetSize()); 63*993b0882SAndroid Build Coastguard Worker } 64*993b0882SAndroid Build Coastguard Worker CreateDatetimeSerializedEntityData(const DatetimeParseResult & parse_result)65*993b0882SAndroid Build Coastguard Workerstd::string CreateDatetimeSerializedEntityData( 66*993b0882SAndroid Build Coastguard Worker const DatetimeParseResult& parse_result) { 67*993b0882SAndroid Build Coastguard Worker EntityDataT entity_data; 68*993b0882SAndroid Build Coastguard Worker entity_data.datetime.reset(new EntityData_::DatetimeT()); 69*993b0882SAndroid Build Coastguard Worker entity_data.datetime->time_ms_utc = parse_result.time_ms_utc; 70*993b0882SAndroid Build Coastguard Worker entity_data.datetime->granularity = 71*993b0882SAndroid Build Coastguard Worker static_cast<EntityData_::Datetime_::Granularity>( 72*993b0882SAndroid Build Coastguard Worker parse_result.granularity); 73*993b0882SAndroid Build Coastguard Worker 74*993b0882SAndroid Build Coastguard Worker for (const auto& c : parse_result.datetime_components) { 75*993b0882SAndroid Build Coastguard Worker EntityData_::Datetime_::DatetimeComponentT datetime_component; 76*993b0882SAndroid Build Coastguard Worker datetime_component.absolute_value = c.value; 77*993b0882SAndroid Build Coastguard Worker datetime_component.relative_count = c.relative_count; 78*993b0882SAndroid Build Coastguard Worker datetime_component.component_type = 79*993b0882SAndroid Build Coastguard Worker static_cast<EntityData_::Datetime_::DatetimeComponent_::ComponentType>( 80*993b0882SAndroid Build Coastguard Worker c.component_type); 81*993b0882SAndroid Build Coastguard Worker datetime_component.relation_type = 82*993b0882SAndroid Build Coastguard Worker EntityData_::Datetime_::DatetimeComponent_::RelationType_ABSOLUTE; 83*993b0882SAndroid Build Coastguard Worker if (c.relative_qualifier != 84*993b0882SAndroid Build Coastguard Worker DatetimeComponent::RelativeQualifier::UNSPECIFIED) { 85*993b0882SAndroid Build Coastguard Worker datetime_component.relation_type = 86*993b0882SAndroid Build Coastguard Worker EntityData_::Datetime_::DatetimeComponent_::RelationType_RELATIVE; 87*993b0882SAndroid Build Coastguard Worker } 88*993b0882SAndroid Build Coastguard Worker entity_data.datetime->datetime_component.emplace_back( 89*993b0882SAndroid Build Coastguard Worker new EntityData_::Datetime_::DatetimeComponentT(datetime_component)); 90*993b0882SAndroid Build Coastguard Worker } 91*993b0882SAndroid Build Coastguard Worker return PackFlatbuffer<EntityData>(&entity_data); 92*993b0882SAndroid Build Coastguard Worker } 93*993b0882SAndroid Build Coastguard Worker 94*993b0882SAndroid Build Coastguard Worker } // namespace libtextclassifier3 95