1bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi/*
2bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * Copyright (C) 2017 The Android Open Source Project
3bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi *
4bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * Licensed under the Apache License, Version 2.0 (the "License");
5bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * you may not use this file except in compliance with the License.
6bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * You may obtain a copy of the License at
7bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi *
8bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi *      http://www.apache.org/licenses/LICENSE-2.0
9bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi *
10bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * Unless required by applicable law or agreed to in writing, software
11bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * distributed under the License is distributed on an "AS IS" BASIS,
12bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * See the License for the specific language governing permissions and
14bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * limitations under the License.
15bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi */
16bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
17bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include "common/memory_image/data-store.h"
18bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
19bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include "util/base/logging.h"
20bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
21bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifinamespace libtextclassifier {
22bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifinamespace nlp_core {
23bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifinamespace memory_image {
24bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
25bda09f1da39ce38a5ece4757b82a64776e53214cMatt SharifiDataStore::DataStore(StringPiece bytes)
26bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    : reader_(bytes.data(), bytes.size()) {
27bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  if (!reader_.success_status()) {
28bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    TC_LOG(ERROR) << "Unable to successfully initialize DataStore.";
29bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
30bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi}
31bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
32bda09f1da39ce38a5ece4757b82a64776e53214cMatt SharifiDataBlobView DataStore::GetData(const std::string &name) const {
33bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  if (!reader_.success_status()) {
34bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    TC_LOG(ERROR) << "DataStore::GetData(" << name << ") "
35bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi                  << "called on invalid DataStore; will return empty data "
36bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi                  << "chunk";
37bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return DataBlobView();
38bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
39bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
40bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  const auto &entries = reader_.trimmed_proto().entries();
41bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  const auto &it = entries.find(name);
42bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  if (it == entries.end()) {
43bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    TC_LOG(ERROR) << "Unknown key: " << name
44bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi                  << "; will return empty data chunk";
45bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return DataBlobView();
46bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
47bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
48bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  const DataStoreEntryBytes &entry_bytes = it->second;
49bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  if (!entry_bytes.has_blob_index()) {
50bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    TC_LOG(ERROR) << "DataStoreEntryBytes with no blob_index; "
51bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi                  << "will return empty data chunk.";
52bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return DataBlobView();
53bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
54bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
55bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  int blob_index = entry_bytes.blob_index();
56bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  return reader_.data_blob_view(blob_index);
57bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi}
58bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
59bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi}  // namespace memory_image
60bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi}  // namespace nlp_core
61bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi}  // namespace libtextclassifier
62