// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_ASH_COMPONENTS_FILE_MANAGER_INDEXING_TERM_TABLE_H_
#define CHROMEOS_ASH_COMPONENTS_FILE_MANAGER_INDEXING_TERM_TABLE_H_
#include <string>
#include "base/memory/raw_ptr.h"
#include "sql/database.h"
namespace ash::file_manager {
// Stores a mapping from term IDs to an terms. A term term is a combination of
// a token and a field name. The main job of this table is to provide a unique
// ID for, say "label:starred" and "content:starred" terms. The token table
// provides a unique value for "starred". However, we need to be able to
// distinguish between "starred" being used a, say, label, vs it being part of
// a content. This is what this table does.
class TermTable {
public:
// Creates a table that maps term IDs to terms. An term consists of the field
// name and a token ID.
explicit TermTable(sql::Database* db);
~TermTable();
TermTable(const TermTable&) = delete;
TermTable& operator=(const TermTable&) = delete;
// Initializes the table. Returns true on success, and false on failure.
bool Init();
// Returns the ID corresponding to the given term. If the term cannot be
// located, the method returns -1.
int64_t GetTermId(const std::string& field_name, int64_t term_id) const;
// Returns the ID corresponding to the term. If the term cannot be located,
// a new ID is allocated and returned.
int64_t GetOrCreateTermId(const std::string& field_name, int64_t term_id);
// Attempts to remove the given term by its ID from the database. If not
// present, this method returns -1. Otherwise, it returns the `term_id`.
int64_t DeleteTermById(int64_t term_id);
private:
// The pointer to a database owned by the whoever created this table.
raw_ptr<sql::Database> db_;
};
} // namespace ash::file_manager
#endif // CHROMEOS_ASH_COMPONENTS_FILE_MANAGER_INDEXING_TERM_TABLE_H_