| /* |
| * 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 "Session.h" |
| |
| using namespace std; |
| |
| Session *session; |
| |
| #define DEFAULT_ROW_NUMBER 1000000 |
| |
| void createAlignedTimeseries() { |
| string alignedDeviceId = "root.sg1.d1"; |
| vector<string> measurements = {"s1", "s2", "s3"}; |
| vector<string> alignedTimeseries = {"root.sg1.d1.s1", "root.sg1.d1.s2", "root.sg1.d1.s3"}; |
| vector<TSDataType::TSDataType> dataTypes = {TSDataType::INT32, TSDataType::DOUBLE, TSDataType::BOOLEAN}; |
| vector<TSEncoding::TSEncoding> encodings = {TSEncoding::PLAIN, TSEncoding::GORILLA, TSEncoding::RLE}; |
| vector<CompressionType::CompressionType> compressors = { |
| CompressionType::SNAPPY, CompressionType::UNCOMPRESSED, CompressionType::SNAPPY}; |
| for (const string ×eries: alignedTimeseries) { |
| if (session->checkTimeseriesExists(timeseries)) { |
| session->deleteTimeseries(timeseries); |
| } |
| } |
| session->createAlignedTimeseries(alignedDeviceId, measurements, dataTypes, encodings, compressors); |
| } |
| |
| void createSchemaTemplate() { |
| if (!session->checkTemplateExists("template1")) { |
| Template temp("template1", false); |
| |
| InternalNode iNodeD99("d99", true); |
| |
| MeasurementNode mNodeS1("s1", TSDataType::INT32, TSEncoding::RLE, CompressionType::SNAPPY); |
| MeasurementNode mNodeS2("s2", TSDataType::INT64, TSEncoding::RLE, CompressionType::SNAPPY); |
| MeasurementNode mNodeD99S1("s1", TSDataType::DOUBLE, TSEncoding::RLE, CompressionType::SNAPPY); |
| MeasurementNode mNodeD99S2("s2", TSDataType::BOOLEAN, TSEncoding::RLE, CompressionType::SNAPPY); |
| |
| iNodeD99.addChild(mNodeD99S1); |
| iNodeD99.addChild(mNodeD99S2); |
| |
| temp.addToTemplate(iNodeD99); |
| temp.addToTemplate(mNodeS1); |
| temp.addToTemplate(mNodeS2); |
| |
| session->createSchemaTemplate(temp); |
| session->setSchemaTemplate("template1", "root.sg3.d1"); |
| } |
| } |
| |
| void ActivateTemplate() { |
| session->executeNonQueryStatement("insert into root.sg3.d1(timestamp,s1, s2) values(200, 1, 1);"); |
| } |
| |
| void showDevices() { |
| unique_ptr<SessionDataSet> dataSet = session->executeQueryStatement("show devices with database"); |
| for (const string &name: dataSet->getColumnNames()) { |
| cout << name << " "; |
| } |
| cout << endl; |
| |
| dataSet->setFetchSize(1024); |
| while (dataSet->hasNext()) { |
| cout << dataSet->next()->toString(); |
| } |
| cout << endl; |
| |
| dataSet->closeOperationHandle(); |
| } |
| |
| void showTimeseries() { |
| unique_ptr<SessionDataSet> dataSet = session->executeQueryStatement("show timeseries"); |
| for (const string &name: dataSet->getColumnNames()) { |
| cout << name << " "; |
| } |
| cout << endl; |
| |
| dataSet->setFetchSize(1024); |
| while (dataSet->hasNext()) { |
| cout << dataSet->next()->toString(); |
| } |
| cout << endl; |
| |
| dataSet->closeOperationHandle(); |
| } |
| |
| void insertAlignedRecord() { |
| string deviceId = "root.sg1.d1"; |
| vector<string> measurements; |
| measurements.emplace_back("s1"); |
| measurements.emplace_back("s2"); |
| measurements.emplace_back("s3"); |
| |
| for (int64_t time = 0; time < 10; time++) { |
| vector<string> values; |
| values.emplace_back("1"); |
| values.emplace_back("1.0"); |
| values.emplace_back("true"); |
| session->insertAlignedRecord(deviceId, time, measurements, values); |
| } |
| } |
| |
| void insertAlignedRecords() { |
| string deviceId = "root.sg1.d1"; |
| vector<string> measurements; |
| measurements.emplace_back("s1"); |
| measurements.emplace_back("s2"); |
| measurements.emplace_back("s3"); |
| |
| vector<string> deviceIds; |
| vector<vector<string>> measurementsList; |
| vector<vector<string>> valuesList; |
| vector<int64_t> timestamps; |
| |
| for (int64_t time = 10; time < 20; time++) { |
| vector<string> values; |
| values.emplace_back("1"); |
| values.emplace_back("1.0"); |
| values.emplace_back("true"); |
| |
| deviceIds.push_back(deviceId); |
| measurementsList.push_back(measurements); |
| valuesList.push_back(values); |
| timestamps.push_back(time); |
| if (time != 10 && time % 10 == 0) { |
| session->insertAlignedRecords(deviceIds, timestamps, measurementsList, valuesList); |
| deviceIds.clear(); |
| measurementsList.clear(); |
| valuesList.clear(); |
| timestamps.clear(); |
| } |
| } |
| |
| session->insertAlignedRecords(deviceIds, timestamps, measurementsList, valuesList); |
| } |
| |
| void insertAlignedTablet() { |
| pair<string, TSDataType::TSDataType> pairA("s1", TSDataType::INT32); |
| pair<string, TSDataType::TSDataType> pairB("s2", TSDataType::DOUBLE); |
| pair<string, TSDataType::TSDataType> pairC("s3", TSDataType::DOUBLE); |
| vector<pair<string, TSDataType::TSDataType>> schemas; |
| schemas.push_back(pairA); |
| schemas.push_back(pairB); |
| schemas.push_back(pairC); |
| |
| Tablet tablet("root.sg2.d2", schemas, 100000); |
| tablet.setAligned(true); |
| |
| for (int64_t time = 0; time < DEFAULT_ROW_NUMBER; time++) { |
| size_t row = tablet.rowSize++; |
| tablet.timestamps[row] = time; |
| int randVal1 = 123456; |
| double randVal2 = 123456.1234; |
| double randVal3 = 123456.1234; |
| tablet.addValue(0, row, &randVal1); |
| tablet.addValue(1, row, &randVal2); |
| tablet.addValue(2, row, &randVal3); |
| if (tablet.rowSize == tablet.maxRowNumber) { |
| session->insertTablet(tablet, true); |
| tablet.reset(); |
| } |
| } |
| |
| if (tablet.rowSize != 0) { |
| session->insertTablet(tablet); |
| tablet.reset(); |
| } |
| } |
| |
| void insertAlignedTablets() { |
| pair<string, TSDataType::TSDataType> pairA("s1", TSDataType::INT32); |
| pair<string, TSDataType::TSDataType> pairB("s2", TSDataType::DOUBLE); |
| pair<string, TSDataType::TSDataType> pairC("s3", TSDataType::BOOLEAN); |
| vector<pair<string, TSDataType::TSDataType>> schemas; |
| schemas.push_back(pairA); |
| schemas.push_back(pairB); |
| schemas.push_back(pairC); |
| |
| Tablet tablet1("root.sg1.d1", schemas, 100); |
| Tablet tablet2("root.sg1.d2", schemas, 100); |
| Tablet tablet3("root.sg1.d3", schemas, 100); |
| |
| unordered_map<string, Tablet *> tabletMap; |
| tabletMap["root.sg1.d1"] = &tablet1; |
| tabletMap["root.sg1.d2"] = &tablet2; |
| tabletMap["root.sg1.d3"] = &tablet3; |
| |
| for (int64_t time = 0; time < 20; time++) { |
| size_t row1 = tablet1.rowSize++; |
| size_t row2 = tablet2.rowSize++; |
| size_t row3 = tablet3.rowSize++; |
| tablet1.timestamps[row1] = time; |
| tablet2.timestamps[row2] = time; |
| tablet3.timestamps[row3] = time; |
| |
| int randVal11 = rand(); |
| int randVal12 = rand(); |
| int randVal13 = rand(); |
| tablet1.addValue(0, row1, &randVal11); |
| tablet2.addValue(0, row2, &randVal12); |
| tablet3.addValue(0, row3, &randVal13); |
| |
| double randVal21 = rand() / 99.9; |
| double randVal22 = rand() / 99.9; |
| double randVal23 = rand() / 99.9; |
| tablet1.addValue(1, row1, &randVal21); |
| tablet2.addValue(1, row2, &randVal22); |
| tablet3.addValue(1, row3, &randVal23); |
| |
| bool randVal31 = (bool)(rand() % 2); |
| bool randVal32 = (bool)(rand() % 2); |
| bool randVal33 = (bool)(rand() % 2); |
| tablet1.addValue(2, row1, &randVal31); |
| tablet2.addValue(2, row2, &randVal32); |
| tablet3.addValue(2, row3, &randVal33); |
| |
| if (tablet1.rowSize == tablet1.maxRowNumber) { |
| session->insertAlignedTablets(tabletMap, true); |
| |
| tablet1.reset(); |
| tablet2.reset(); |
| tablet3.reset(); |
| } |
| } |
| |
| if (tablet1.rowSize != 0) { |
| session->insertAlignedTablets(tabletMap, true); |
| tablet1.reset(); |
| tablet2.reset(); |
| tablet3.reset(); |
| } |
| } |
| |
| void insertNullableTabletWithAlignedTimeseries() { |
| pair<string, TSDataType::TSDataType> pairA("s1", TSDataType::INT32); |
| pair<string, TSDataType::TSDataType> pairB("s2", TSDataType::INT64); |
| pair<string, TSDataType::TSDataType> pairC("s3", TSDataType::BOOLEAN); |
| vector<pair<string, TSDataType::TSDataType>> schemas; |
| schemas.push_back(pairA); |
| schemas.push_back(pairB); |
| schemas.push_back(pairC); |
| |
| Tablet tablet("root.sg1.d4", schemas, 20); |
| tablet.setAligned(true); |
| |
| for (int64_t time = 0; time < 20; time++) { |
| size_t row = tablet.rowSize++; |
| tablet.timestamps[row] = time; |
| for (int i = 0; i < 3; i++) { |
| int randVal1 = rand(); |
| int64_t randVal2 = rand(); |
| bool randVal3 = (bool)(rand() % 2); |
| if (i == 0) { |
| tablet.addValue(i, row, &randVal1); |
| } else if (i == 1) { |
| tablet.addValue(i, row, &randVal2); |
| } else { |
| tablet.addValue(i, row, &randVal3); |
| } |
| // mark null value |
| if ((row % 3) == (unsigned int) i) { |
| tablet.bitMaps[i].mark(row); |
| } |
| } |
| if (tablet.rowSize == tablet.maxRowNumber) { |
| session->insertTablet(tablet, true); |
| tablet.reset(); |
| } |
| } |
| |
| if (tablet.rowSize != 0) { |
| session->insertTablet(tablet); |
| tablet.reset(); |
| } |
| } |
| |
| void query() { |
| unique_ptr<SessionDataSet> dataSet = session->executeQueryStatement("select * from root.sg1.**"); |
| cout << "timestamp" << " "; |
| for (const string &name: dataSet->getColumnNames()) { |
| cout << name << " "; |
| } |
| cout << endl; |
| |
| dataSet->setFetchSize(1024); |
| while (dataSet->hasNext()) { |
| cout << dataSet->next()->toString(); |
| } |
| cout << endl; |
| |
| dataSet->closeOperationHandle(); |
| } |
| |
| void deleteData() { |
| string path = "root.**"; |
| int64_t deleteTime = 49; |
| session->deleteData(path, deleteTime); |
| } |
| |
| void deleteTimeseries() { |
| vector<string> paths; |
| vector<string> alignedTimeseries = {"root.sg1.d1.s1", "root.sg1.d1.s2", "root.sg1.d1.s3", "root.sg1.d1.s4", |
| "root.sg1.d2.s1", "root.sg1.d2.s2", "root.sg1.d2.s3", |
| "root.sg1.d3.s1", "root.sg1.d3.s2", "root.sg1.d3.s3", |
| "root.sg1.d4.s1", "root.sg1.d4.s2", "root.sg1.d4.s3", |
| "root.sg2.d2.s1", "root.sg2.d2.s2", "root.sg2.d2.s3", }; |
| for (const string ×eries: alignedTimeseries) { |
| if (session->checkTimeseriesExists(timeseries)) { |
| paths.push_back(timeseries); |
| } |
| } |
| session->deleteTimeseries(paths); |
| } |
| |
| void deleteStorageGroups() { |
| vector<string> storageGroups; |
| storageGroups.emplace_back("root.sg1"); |
| storageGroups.emplace_back("root.sg2"); |
| session->deleteStorageGroups(storageGroups); |
| } |
| |
| |
| int main() { |
| LOG_LEVEL = LEVEL_DEBUG; |
| |
| session = new Session("127.0.0.1", 6667, "root", "root"); |
| |
| cout << "session open\n" << endl; |
| session->open(false); |
| |
| cout << "setStorageGroup\n" << endl; |
| try { |
| session->setStorageGroup("root.sg1"); |
| } |
| catch (IoTDBException &e) { |
| string errorMessage(e.what()); |
| if (errorMessage.find("StorageGroupAlreadySetException") == string::npos) { |
| cout << errorMessage << endl; |
| //throw e; |
| } |
| } |
| |
| cout << "createAlignedTimeseries\n" << endl; |
| createAlignedTimeseries(); |
| |
| cout << "createSchemaTemplate\n" << endl; |
| createSchemaTemplate(); |
| |
| cout << "ActivateTemplate\n" << endl; |
| ActivateTemplate(); |
| |
| cout << "showDevices\n" << endl; |
| showDevices(); |
| |
| cout << "showTimeseries\n" << endl; |
| showTimeseries(); |
| |
| cout << "insertAlignedRecord\n" << endl; |
| insertAlignedRecord(); |
| |
| cout << "insertAlignedRecords\n" << endl; |
| insertAlignedRecords(); |
| |
| cout << "insertAlignedTablet" << endl; |
| cout << "Insert " << DEFAULT_ROW_NUMBER << " records." << endl; |
| time_t now1 = time(0); |
| insertAlignedTablet(); |
| time_t now2 = time(0); |
| time_t useTime = now2 - now1; |
| cout << "Use time: " << useTime << "s.\n" << endl; |
| |
| cout << "insertAlignedTablets\n" << endl; |
| insertAlignedTablets(); |
| |
| cout << "insertNullableTabletWithAlignedTimeseries\n" << endl; |
| insertNullableTabletWithAlignedTimeseries(); |
| |
| cout << "query\n" << endl; |
| query(); |
| |
| cout << "deleteData\n" << endl; |
| deleteData(); |
| |
| cout << "deleteTimeseries\n" << endl; |
| deleteTimeseries(); |
| |
| cout << "deleteStorageGroups\n" << endl; |
| deleteStorageGroups(); |
| |
| cout << "session close\n" << endl; |
| session->close(); |
| |
| delete session; |
| |
| cout << "finished\n" << endl; |
| return 0; |
| } |