一个表就是一组有序排列的向量。本小节介绍表的创建、读取和添加的方式及使用示例。

创建表

API 提供两种创建表数据的方式:

  1. 通过提供每一列的名称和每一列的类型来创建表,方法声明如下:
    static Table* createTable(const vector<string>& colNames, const vector<DATA_TYPE>& colTypes, INDEX size, INDEX capacity, const vector<int>& extraParams = {}); 

    参数:

    • colNames:表示每一列的名称。
    • colTypes:表示每一列的类型。
    • size:表示表的初始大小。
    • capacity:表示在创建表时预留 capacity 行数的空间。
    • extraParams:当表中存在 DECIMAL 类型的列时,该参数可用来传入 Decimal 的 scale。

    使用示例:

    vector<string> colNames{"col1", "col2", "col3"};
    vector<DATA_TYPE> colTypes{DT_INT, DT_BOOL, DT_STRING};     
    TableSP tbl = Util::createTable(colNames, colTypes, 0, 100); 
  2. 通过提供每一列的名称和每一列的向量来创建表,方法声明如下:
    static Table* createTable(const vector<string>& colNames, const vector<ConstantSP>& cols); 

    参数说明:

    • colNames:每一列的名称。
    • colTypes:每一列的向量。注意,要保证每一个向量的长度都相同。

    使用示例:

    vector<string> colNames{"col1", "col2", "col3"};
    vector<ConstantSP> cols;     
    cols.emplace_back(Util::createVector(DT_INT, 0));     
    cols.emplace_back(Util::createVector(DT_BOOL, 0));     
    cols.emplace_back(Util::createVector(DT_STRING, 0));     
    TableSP tbl = Util::createTable(colNames, cols); 

读取表数据

API 支持按列和按行两种读取方式:

  1. 按列读取:

    可以通过如下方法来取出某列,每一列就是一个向量,从向量中读数据的方法可以参考:读取数据

    ConstantSP getColumn(const string& name) const; //取出列名为name的那一列 
    ConstantSP getColumn(INDEX index) const;  //取出第index列(index从0开始) 

    使用示例:

    VectorSP col1 = tbl->getColumn(0);        // 获得第0列
    VectorSP col2 = tbl->getColumn("col2");   // 获取col2列 
  2. 按行读取。C++ API 提供两种按行读取表中数据的方式:
    • 通过如下方法来取出某行中的所有数据,组成一个字典,key 就是列名,value 就是元素的值。
      ConstantSP get(INDEX index) const; //取出第index行(index从0开始)

      使用示例:

      DictionarySP row = tbl->get(0);     
      std::cout << row->getMember("col1")->getInt() << std::endl;     
      std::cout << row->getMember("col3")->getString() << std::endl;
      通过工具类 Result 按行读取,使用示例如下:
      ResultSet resultSet(tbl);     
      while (!resultSet.isAfterLast()) {         
          int colIndex = 0;         
          std::cout << resultSet.getInt(colIndex++) << " ";         
          std::cout << int(resultSet.getBool(colIndex++)) << " ";
          std::cout << resultSet.getString(colIndex++) << std::endl;
          resultSet.next();     
      }  

向表中添加数据

API 提供两种向表中添加数据的方式:

  1. 通过 append 接口向表的末尾插入数据:
    bool append(vector<ConstantSP>& values, INDEX& insertedRows, string& errMsg);
    参数:
    • values:输入参数,values 的长度与表的列数相同,其中每个元素都是一个向量。注意,所有向量的长度应该相同,并且类型需要与表中对应的列相同;values 只有一个元素,是另一个表,注意表的结构要相同。
    • insertedRows:输出参数,表示成功插入的行数。
    • errMsg:输出参数,如果添加失败,该参数就算失败原因。

    返回值: 是否添加数据成功。

    示例代码:

    INDEX insertedRows;     
    std::string errorMsg;     
    VectorSP col0 = Util::createVector(DT_INT, 0);     
    VectorSP col1 = Util::createVector(DT_BOOL, 0);     
    VectorSP col2 = Util::createVector(DT_STRING, 0);     
    col0->append(Util::createInt(1));     
    col1->append(Util::createBool(true));     
    col2->append(Util::createString("123"));     
    vector<ConstantSP> values{col0, col1, col2};     
    tbl->append(values, insertedRows, errorMsg) //values是由三个VectorSP组成,每个VectorSP对应表中的一列     
    TableSP tbl2 = tbl->getValue();     
    values= {tbl2};     
    tbl->append(tempCols, insertedRows, errorMsg); //values中只有一个元素,是另一个表 
  2. 通过 getColumn 接口获得含有每一列数据的向量,可以向其中添加元素。在添加后调用 BasicTable::updateSize()更新表长度即可。

    示例代码:

    VectorSP col0 = tbl->getColumn(0);     
    VectorSP col1 = tbl->getColumn(1);     
    VectorSP col2 = tbl->getColumn(2);     
    col0->append(Util::createInt(1));     
    col1->append(Util::createBool(true));     
    col2->append(Util::createString("123")); 
    dynamic_cast<BasicTable*>(tbl.get())->updateSize();