index.h 2.7 KB
Newer Older
羽飞's avatar
羽飞 已提交
1
/* Copyright (c) 2021 OceanBase and/or its affiliates. All rights reserved.
羽飞's avatar
羽飞 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14
miniob is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
         http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details. */

//
// Created by Meiyi & Wangyunlai on 2021/5/11.
//

羽飞's avatar
羽飞 已提交
15
#pragma once
羽飞's avatar
羽飞 已提交
16 17 18 19

#include <stddef.h>
#include <vector>

羽飞's avatar
羽飞 已提交
20 21 22
#include "common/rc.h"
#include "storage/index/index_meta.h"
#include "storage/field/field_meta.h"
羽飞's avatar
羽飞 已提交
23
#include "storage/record/record_manager.h"
羽飞's avatar
羽飞 已提交
24 25 26

class IndexScanner;

羽飞's avatar
羽飞 已提交
27 28 29 30 31 32 33 34 35 36 37 38
/**
 * @brief 索引
 * @defgroup Index
 * @details 索引可能会有很多种实现,比如B+树、哈希表等,这里定义了一个基类,用于描述索引的基本操作。
 */

/**
 * @brief 索引基类
 * @ingroup Index
 */
class Index 
{
羽飞's avatar
羽飞 已提交
39 40 41 42 43 44 45 46 47
public:
  Index() = default;
  virtual ~Index() = default;

  const IndexMeta &index_meta() const
  {
    return index_meta_;
  }

羽飞's avatar
羽飞 已提交
48 49 50 51 52 53
  /**
   * @brief 插入一条数据
   * 
   * @param record 插入的记录,当前假设记录是定长的
   * @param[out] rid    插入的记录的位置
   */
羽飞's avatar
羽飞 已提交
54
  virtual RC insert_entry(const char *record, const RID *rid) = 0;
羽飞's avatar
羽飞 已提交
55 56 57 58 59 60 61

  /**
   * @brief 删除一条数据
   * 
   * @param record 删除的记录,当前假设记录是定长的
   * @param[in] rid   删除的记录的位置
   */
羽飞's avatar
羽飞 已提交
62 63
  virtual RC delete_entry(const char *record, const RID *rid) = 0;

羽飞's avatar
羽飞 已提交
64 65 66 67 68 69 70 71 72 73
  /**
   * @brief 创建一个索引数据的扫描器
   * 
   * @param left_key 要扫描的左边界
   * @param left_len 左边界的长度
   * @param left_inclusive 是否包含左边界
   * @param right_key 要扫描的右边界
   * @param right_len 右边界的长度
   * @param right_inclusive 是否包含右边界
   */
L
Longda Feng 已提交
74 75
  virtual IndexScanner *create_scanner(const char *left_key, int left_len, bool left_inclusive, const char *right_key,
      int right_len, bool right_inclusive) = 0;
羽飞's avatar
羽飞 已提交
76

羽飞's avatar
羽飞 已提交
77 78 79 80
  /**
   * @brief 同步索引数据到磁盘
   * 
   */
羽飞's avatar
羽飞 已提交
81 82 83 84 85 86
  virtual RC sync() = 0;

protected:
  RC init(const IndexMeta &index_meta, const FieldMeta &field_meta);

protected:
羽飞's avatar
羽飞 已提交
87 88
  IndexMeta index_meta_;  ///< 索引的元数据
  FieldMeta field_meta_;  ///< 当前实现仅考虑一个字段的索引
羽飞's avatar
羽飞 已提交
89 90
};

羽飞's avatar
羽飞 已提交
91 92 93 94 95 96
/**
 * @brief 索引扫描器
 * @ingroup Index
 */
class IndexScanner 
{
羽飞's avatar
羽飞 已提交
97 98 99 100 101 102 103 104 105 106 107
public:
  IndexScanner() = default;
  virtual ~IndexScanner() = default;

  /**
   * 遍历元素数据
   * 如果没有更多的元素,返回RECORD_EOF
   */
  virtual RC next_entry(RID *rid) = 0;
  virtual RC destroy() = 0;
};