表
一个表就是一组有序排列的向量。本小节介绍表的创建、读取和添加的方式及使用示例。
创建表
API 提供两种创建表数据的方式:
- 通过提供每一列的名称和每一列的类型来创建表,方法声明如下:
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);
- 通过提供每一列的名称和每一列的向量来创建表,方法声明如下:
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 支持按列和按行两种读取方式:
- 按列读取:
可以通过如下方法来取出某列,每一列就是一个向量,从向量中读数据的方法可以参考:读取数据。
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列
- 按行读取。C++ API 提供两种按行读取表中数据的方式:
- 通过如下方法来取出某行中的所有数据,组成一个字典,key 就是列名,value 就是元素的值。
ConstantSP get(INDEX index) const; //取出第index行(index从0开始)
使用示例:
通过工具类 Result 按行读取,使用示例如下:DictionarySP row = tbl->get(0); std::cout << row->getMember("col1")->getInt() << std::endl; std::cout << row->getMember("col3")->getString() << std::endl;
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(); }
- 通过如下方法来取出某行中的所有数据,组成一个字典,key 就是列名,value 就是元素的值。
向表中添加数据
API 提供两种向表中添加数据的方式:
- 通过
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中只有一个元素,是另一个表
- 通过
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();