blob: 048d53409161838a3dccca3fa57c8cc3fde7ac60 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "SessionDataSet.h"
#include <stdexcept>
#include <boost/date_time/gregorian/gregorian.hpp>
RowRecord::RowRecord(int64_t timestamp) {
this->timestamp = timestamp;
}
RowRecord::RowRecord(int64_t timestamp, const std::vector<Field>& fields)
: timestamp(timestamp), fields(fields) {
}
RowRecord::RowRecord(const std::vector<Field>& fields)
: timestamp(-1), fields(fields) {
}
RowRecord::RowRecord() {
this->timestamp = -1;
}
void RowRecord::addField(const Field& f) {
this->fields.push_back(f);
}
std::string RowRecord::toString() {
std::string ret;
if (this->timestamp != -1) {
ret.append(std::to_string(timestamp));
ret.append("\t");
}
for (size_t i = 0; i < fields.size(); i++) {
if (i != 0) {
ret.append("\t");
}
TSDataType::TSDataType dataType = fields[i].dataType;
switch (dataType) {
case TSDataType::BOOLEAN:
if (!fields[i].boolV.is_initialized()) {
ret.append("null");
} else {
ret.append(fields[i].boolV.value() ? "true" : "false");
}
break;
case TSDataType::INT32:
if (!fields[i].intV.is_initialized()) {
ret.append("null");
} else {
ret.append(std::to_string(fields[i].intV.value()));
}
break;
case TSDataType::DATE:
if (!fields[i].dateV.is_initialized()) {
ret.append("null");
} else {
ret.append(boost::gregorian::to_iso_extended_string(fields[i].dateV.value()));
}
break;
case TSDataType::TIMESTAMP:
case TSDataType::INT64:
if (!fields[i].longV.is_initialized()) {
ret.append("null");
} else {
ret.append(std::to_string(fields[i].longV.value()));
}
break;
case TSDataType::FLOAT:
if (!fields[i].floatV.is_initialized()) {
ret.append("null");
} else {
ret.append(std::to_string(fields[i].floatV.value()));
}
break;
case TSDataType::DOUBLE:
if (!fields[i].doubleV.is_initialized()) {
ret.append("null");
} else {
ret.append(std::to_string(fields[i].doubleV.value()));
}
break;
case TSDataType::BLOB:
case TSDataType::STRING:
case TSDataType::TEXT:
if (!fields[i].stringV.is_initialized()) {
ret.append("null");
} else {
ret.append(fields[i].stringV.value());
}
break;
default:
break;
}
}
ret.append("\n");
return ret;
}
bool SessionDataSet::hasNext() {
if (iotdbRpcDataSet_->hasCachedRecord()) {
return true;
}
return iotdbRpcDataSet_->next();
}
shared_ptr<RowRecord> SessionDataSet::next() {
if (!iotdbRpcDataSet_->hasCachedRecord() && !hasNext()) {
return nullptr;
}
iotdbRpcDataSet_->setHasCachedRecord(false);
return constructRowRecordFromValueArray();
}
int SessionDataSet::getFetchSize() {
return iotdbRpcDataSet_->getFetchSize();
}
void SessionDataSet::setFetchSize(int fetchSize) {
return iotdbRpcDataSet_->setFetchSize(fetchSize);
}
const std::vector<std::string>& SessionDataSet::getColumnNames() const {
return iotdbRpcDataSet_->getColumnNameList();
}
const std::vector<std::string>& SessionDataSet::getColumnTypeList() const {
return iotdbRpcDataSet_->getColumnTypeList();
}
void SessionDataSet::closeOperationHandle(bool forceClose) {
iotdbRpcDataSet_->close(forceClose);
}
bool SessionDataSet::DataIterator::next() {
return iotdbRpcDataSet_->next();
}
bool SessionDataSet::DataIterator::isNull(const std::string& columnName) {
return iotdbRpcDataSet_->isNullByColumnName(columnName);
}
bool SessionDataSet::DataIterator::isNullByIndex(int32_t columnIndex) {
return iotdbRpcDataSet_->isNullByIndex(columnIndex);
}
boost::optional<bool> SessionDataSet::DataIterator::getBooleanByIndex(int32_t columnIndex) {
return iotdbRpcDataSet_->getBooleanByIndex(columnIndex);
}
boost::optional<bool> SessionDataSet::DataIterator::getBoolean(const std::string& columnName) {
return iotdbRpcDataSet_->getBoolean(columnName);
}
boost::optional<double> SessionDataSet::DataIterator::getDoubleByIndex(int32_t columnIndex) {
return iotdbRpcDataSet_->getDoubleByIndex(columnIndex);
}
boost::optional<double> SessionDataSet::DataIterator::getDouble(const std::string& columnName) {
return iotdbRpcDataSet_->getDouble(columnName);
}
boost::optional<float> SessionDataSet::DataIterator::getFloatByIndex(int32_t columnIndex) {
return iotdbRpcDataSet_->getFloatByIndex(columnIndex);
}
boost::optional<float> SessionDataSet::DataIterator::getFloat(const std::string& columnName) {
return iotdbRpcDataSet_->getFloat(columnName);
}
boost::optional<int32_t> SessionDataSet::DataIterator::getIntByIndex(int32_t columnIndex) {
return iotdbRpcDataSet_->getIntByIndex(columnIndex);
}
boost::optional<int32_t> SessionDataSet::DataIterator::getInt(const std::string& columnName) {
return iotdbRpcDataSet_->getInt(columnName);
}
boost::optional<int64_t> SessionDataSet::DataIterator::getLongByIndex(int32_t columnIndex) {
return iotdbRpcDataSet_->getLongByIndex(columnIndex);
}
boost::optional<int64_t> SessionDataSet::DataIterator::getLong(const std::string& columnName) {
return iotdbRpcDataSet_->getLong(columnName);
}
boost::optional<std::string> SessionDataSet::DataIterator::getStringByIndex(int32_t columnIndex) {
return iotdbRpcDataSet_->getStringByIndex(columnIndex);
}
boost::optional<std::string> SessionDataSet::DataIterator::getString(const std::string& columnName) {
return iotdbRpcDataSet_->getString(columnName);
}
boost::optional<int64_t> SessionDataSet::DataIterator::getTimestampByIndex(int32_t columnIndex) {
return iotdbRpcDataSet_->getTimestampByIndex(columnIndex);
}
boost::optional<int64_t> SessionDataSet::DataIterator::getTimestamp(const std::string& columnName) {
return iotdbRpcDataSet_->getTimestamp(columnName);
}
boost::optional<boost::gregorian::date> SessionDataSet::DataIterator::getDateByIndex(int32_t columnIndex) {
return iotdbRpcDataSet_->getDateByIndex(columnIndex);
}
boost::optional<boost::gregorian::date> SessionDataSet::DataIterator::getDate(const std::string& columnName) {
return iotdbRpcDataSet_->getDate(columnName);
}
int32_t SessionDataSet::DataIterator::findColumn(const std::string& columnName) {
return iotdbRpcDataSet_->findColumn(columnName);
}
const std::vector<std::string>& SessionDataSet::DataIterator::getColumnNames() const {
return iotdbRpcDataSet_->getColumnNameList();
}
const std::vector<std::string>& SessionDataSet::DataIterator::getColumnTypeList() const {
return iotdbRpcDataSet_->getColumnTypeList();
}
shared_ptr<RowRecord> SessionDataSet::constructRowRecordFromValueArray() {
std::vector<Field> outFields;
for (int i = iotdbRpcDataSet_->getValueColumnStartIndex(); i < iotdbRpcDataSet_->getColumnSize(); i++) {
Field field;
std::string columnName = iotdbRpcDataSet_->getColumnNameList().at(i);
if (!iotdbRpcDataSet_->isNullByColumnName(columnName)) {
TSDataType::TSDataType dataType = iotdbRpcDataSet_->getDataType(columnName);
field.dataType = dataType;
switch (dataType) {
case TSDataType::BOOLEAN:
field.boolV = iotdbRpcDataSet_->getBoolean(columnName);
break;
case TSDataType::INT32:
field.intV = iotdbRpcDataSet_->getInt(columnName);
break;
case TSDataType::DATE:
field.dateV = iotdbRpcDataSet_->getDate(columnName);
break;
case TSDataType::INT64:
case TSDataType::TIMESTAMP:
field.longV = iotdbRpcDataSet_->getLong(columnName);
break;
case TSDataType::FLOAT:
field.floatV = iotdbRpcDataSet_->getFloat(columnName);
break;
case TSDataType::DOUBLE:
field.doubleV = iotdbRpcDataSet_->getDouble(columnName);
break;
case TSDataType::TEXT:
case TSDataType::BLOB:
case TSDataType::STRING:
field.stringV = iotdbRpcDataSet_->getBinary(columnName)->getStringValue();
break;
default:
throw UnSupportedDataTypeException("Data type %s is not supported." + dataType);
}
}
outFields.emplace_back(field);
}
return std::make_shared<RowRecord>(iotdbRpcDataSet_->getCurrentRowTime(), outFields);
}