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})