1/* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect, Assert} from 'deccjsunit/index'; 17import dataRdb from '@ohos.data.relationalStore'; 18import featureAbility from '@ohos.ability.featureAbility'; 19 20const TAG = "[RDB_RESULTSET_PERF]"; 21const CREATE_TABLE_TEST = "CREATE TABLE test (" + 22 "data01 TEXT, data02 INTEGER, data03 FLOAT, data04 BLOB, data05 BOOLEAN, " + 23 "data06 TEXT, data07 INTEGER, data08 FLOAT, data09 BLOB, data10 BOOLEAN, " + 24 "data11 TEXT, data12 INTEGER, data13 FLOAT, data14 BLOB, data15 BOOLEAN, " + 25 "data16 TEXT, data17 INTEGER, data18 FLOAT, data19 BLOB, data20 BOOLEAN" + 26 ");"; 27 28const FIELDS = ["data01", "data02", "data03", "data04", "data05", "data06", "data07", "data08", "data09", "data10", 29 "data11", "data12", "data13", "data14", "data15", "data16", "data17", "data18", "data19", "data20"] 30 31function CREATE_STRING(len) { 32 let result = ''; 33 for (let i = 0; i < len; i++) { 34 result += 'a'; 35 } 36 return result; 37} 38 39const CONST_STRING_VALUE = CREATE_STRING(127); 40 41function CREATE_UINT8_ARRAY(len) { 42 let result = new Uint8Array(len); 43 for (let i = 0; i < len; i++) { 44 result[i] = 1; 45 } 46 return result; 47} 48 49const CONST_UINT8_ARRAY = CREATE_UINT8_ARRAY(127); 50 51const DB_NAME = "GetValuesBucketPerf.db"; 52const STORE_CONFIG = { 53 name: DB_NAME, 54 securityLevel: dataRdb.SecurityLevel.S3 55} 56 57let context = featureAbility.getContext(); 58let rdbStore = undefined; 59const BASE_COUNT = 2000; // loop times 60 61describe('SceneGetValuesBucketPerf', function () { 62 beforeAll(async function () { 63 console.info(TAG + 'beforeAll'); 64 rdbStore = await dataRdb.getRdbStore(context, STORE_CONFIG); 65 await rdbStore.executeSql(CREATE_TABLE_TEST); 66 await prepareTestData(); 67 }) 68 69 beforeEach(async function () { 70 console.info(TAG + 'beforeEach'); 71 }) 72 73 afterEach(async function () { 74 console.info(TAG + 'afterEach'); 75 }) 76 77 afterAll(async function () { 78 console.info(TAG + 'afterAll'); 79 await rdbStore.executeSql("drop table test"); 80 rdbStore = null; 81 await dataRdb.deleteRdbStore(context, DB_NAME); 82 }) 83 84 async function prepareTestData() { 85 console.info(TAG + "prepare for query performance test"); 86 let valueBuckets = []; 87 let valueBucket = { 88 data01: CONST_STRING_VALUE, 89 data02: 10001, 90 data03: 101.5, 91 data04: CONST_UINT8_ARRAY, 92 data05: false, 93 data06: CONST_STRING_VALUE, 94 data07: 10002, 95 data08: 102.5, 96 data09: CONST_UINT8_ARRAY, 97 data10: true, 98 data11: CONST_STRING_VALUE, 99 data12: 10003, 100 data13: 103.5, 101 data14: CONST_UINT8_ARRAY, 102 data15: false, 103 data16: CONST_STRING_VALUE, 104 data17: 10004, 105 data18: 104.5, 106 data19: CONST_UINT8_ARRAY, 107 data20: true 108 } 109 for (let i = 0; i < BASE_COUNT; i++) { 110 valueBuckets.push(valueBucket); 111 } 112 await rdbStore.batchInsert("test", valueBuckets) 113 } 114 115 it('Scene_GetValuesBucket_0001', 0, async function (done) { 116 console.log(TAG + "************* Scene_GetValuesBucket_0001 start *************"); 117 let predicates = await new dataRdb.RdbPredicates("test") 118 let resultSet = await rdbStore.query(predicates) 119 expect(2000).assertEqual(resultSet.rowCount); 120 121 let startTime = new Date().getTime(); 122 let allValues = new Array(); 123 let i = 0; 124 while (resultSet.goToNextRow()) { 125 let values = resultSet.getRow(); 126 allValues[i++] = values; 127 } 128 resultSet.close(); 129 let endTime = new Date().getTime(); 130 let averageTime = (endTime - startTime); 131 console.info(TAG + " the Scene_GetValuesBucket_0001 average time is: " + averageTime + " ms"); 132 expect(2000).assertEqual(allValues.length); 133 expect(averageTime).assertLess(1000); 134 135 expect(CONST_STRING_VALUE).assertEqual(allValues[0]["data01"]); 136 done(); 137 console.log(TAG + "************* Scene_GetValuesBucket_0001 end *************"); 138 }) 139 140 /** 141 * @tc.name RDB Backup Restore test 142 * @tc.number SUB_DDM_RDB_JS_RdbBackupRestoreTest_0010 143 * @tc.desc RDB backup and restore function test 144 */ 145 it('Scene_GetValuesBucket_0002', 0, async function (done) { 146 console.log(TAG + "************* Scene_GetValuesBucket_0002 start *************"); 147 let predicates = await new dataRdb.RdbPredicates("test") 148 let resultSet = await rdbStore.query(predicates) 149 expect(2000).assertEqual(resultSet.rowCount); 150 151 let startTime = new Date().getTime(); 152 let allValues = new Array(2000); 153 154 let i = 0; 155 let indexes = new Array(20); 156 while (resultSet.goToNextRow()) { 157 let values = new Array(); 158 159 if (i == 0) { 160 for (let i = 0; i < 20; i++) { 161 indexes[i] = resultSet.getColumnIndex(FIELDS[i]); 162 } 163 } 164 165 for (let i = 0; i < 20; i++) { 166 switch (resultSet.getColumnType(indexes[i])) { 167 case 0: // TYPE_NULL 168 values[FIELDS[i]] = null; 169 break; 170 case 1: // TYPE_INTEGER 171 values[FIELDS[i]] = resultSet.getInt(indexes[i]); 172 break; 173 case 2: // TYPE_FLOAT 174 values[FIELDS[i]] = resultSet.getDouble(indexes[i]); 175 break; 176 case 3: // TYPE_STRING 177 values[FIELDS[i]] = resultSet.getString(indexes[i]); 178 break; 179 case 4: // TYPE_BLOB 180 values[FIELDS[i]] = resultSet.getBlob(indexes[i]); 181 break; 182 } 183 } 184 allValues[i++] = values; 185 } 186 resultSet.close(); 187 let endTime = new Date().getTime(); 188 let averageTime = (endTime - startTime); 189 console.info(TAG + " the Scene_GetValuesBucket_0002 average time is: " + averageTime + " ms"); 190 expect(2000).assertEqual(allValues.length); 191 expect(averageTime).assertLess(2000); 192 193 expect(CONST_STRING_VALUE).assertEqual(allValues[0]["data01"]); 194 done(); 195 console.log(TAG + "************* Scene_GetValuesBucket_0002 end *************"); 196 }) 197})