1/* 2 * Copyright (C) 2022 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} from 'deccjsunit/index' 17import dataRdb from '@ohos.data.rdb'; 18 19const DEPT_TABLE = "CREATE TABLE IF NOT EXISTS dept" 20 + "(id INTEGER PRIMARY KEY , dName TEXT , loc TEXT)"; 21 22const JOB_TABLE = "CREATE TABLE IF NOT EXISTS job" 23 + "(id INTEGER PRIMARY KEY , jName TEXT , description TEXT)"; 24 25const EMP_TABLE = "CREATE TABLE IF NOT EXISTS emp" 26 + "(id INTEGER PRIMARY KEY ,eName TEXT, jobId INTEGER , " 27 + "mgr INTEGER, joinDate TEXT, salary REAL, bonus REAL, deptId INTEGER," 28 + "FOREIGN KEY (jobId) REFERENCES job (id) ON UPDATE NO ACTION ON DELETE CASCADE," 29 + "FOREIGN KEY (deptId) REFERENCES dept (id) ON UPDATE NO ACTION ON DELETE CASCADE)"; 30 31const SALARYGRADE_TABLE = "CREATE TABLE IF NOT EXISTS salarygrade" 32 + "(grade INTEGER PRIMARY KEY,loSalary INTEGER, hiSalary INTEGER)"; 33 34const STORE_CONFIG = { name: "RdbJoinBTest.db" } 35 36const CURRENT_STORE_VERSION = 1; 37 38const TAG = 'RDB_TEST '; 39 40var rdbStore = undefined; 41 42describe('rdbStorePredicatesJoinBTest', function () { 43 beforeAll(async function () { 44 console.info(TAG + 'beforeAll'); 45 console.info(TAG + 'beforeAll end'); 46 }) 47 48 beforeEach(async function () { 49 console.info(TAG + 'beforeEach'); 50 rdbStore = await dataRdb.getRdbStore(STORE_CONFIG, CURRENT_STORE_VERSION); 51 await generateJobTable(); 52 await generateSalarygradeTable(); 53 await generateDeptTable(); 54 await generateEmpTable(); 55 console.info(TAG + 'beforeEach end'); 56 }) 57 58 afterEach(async function () { 59 console.info(TAG + 'afterEach'); 60 rdbStore = null; 61 await dataRdb.deleteRdbStore("RdbJoinBTest.db"); 62 console.info(TAG + 'afterEach end'); 63 }) 64 65 afterAll(async function () { 66 console.info(TAG + 'afterAll'); 67 console.info(TAG + 'afterAll end'); 68 }) 69 70 async function generateDeptTable() { 71 console.info(TAG + 'generateDeptTable'); 72 await rdbStore.executeSql(DEPT_TABLE); 73 74 const depts = [ 75 {id:10, dName:"JiaoYanBU", loc:"BeiJing"}, 76 {id:20, dName:"XueGongBu", loc:"ShangHai"}, 77 {id:30, dName:"XiaoShouBu", loc:"GuangZhou"}, 78 {id:40, dName:"CaiWuBu", loc:"ShenZhen"}, 79 ]; 80 81 await rdbStore.batchInsert("dept", depts); 82 console.info(TAG + 'generateDeptTable end'); 83 } 84 85 async function generateJobTable() { 86 console.info(TAG + 'generateJobTable') 87 await rdbStore.executeSql(JOB_TABLE); 88 89 var jobs = [ 90 {id:1, jName:"Chairman", description:"ManageTheEntireCompany"}, 91 {id:2, jName:"Manager", description:"ManageEmployeesOfTheDepartment"}, 92 {id:3, jName:"Salesperson", description:"SellingProductsToCustomers"}, 93 {id:4, jName:"Clerk", description:"UseOfficeSoftware"}, 94 ] 95 96 await rdbStore.batchInsert("job", jobs); 97 console.info(TAG + 'generateJobTable end') 98 } 99 100 async function generateEmpTable() { 101 console.info(TAG + 'generateEmpTable') 102 await rdbStore.executeSql(EMP_TABLE); 103 104 var emps = [ 105 {id:1001, eName:"SunWuKong", jobId:4, mgr:1004, joinDate:"2000-12-17", salary:8000.00, bonus:null, deptId:20}, 106 {id:1002, eName:"LuJunYi", jobId:3, mgr:1006, joinDate:"2001-02-20", salary:16000.00, bonus:3000.00, deptId:30}, 107 {id:1003, eName:"LinChong", jobId:3, mgr:1006, joinDate:"2001-02-22", salary:12500.00, bonus:5000.00, deptId:30}, 108 {id:1004, eName:"TangCeng", jobId:2, mgr:1009, joinDate:"2001-04-02", salary:29750.00, bonus:null, deptId:20}, 109 {id:1005, eName:"LiKui", jobId:4, mgr:1006, joinDate:"2001-09-28", salary:12500.00, bonus:14000.00, deptId:30}, 110 {id:1006, eName:"SongJiang", jobId:2, mgr:1009, joinDate:"2001-05-01", salary:28500.00, bonus:null, deptId:30}, 111 {id:1007, eName:"LiuBei", jobId:2, mgr:1009, joinDate:"2001-09-01", salary:24500.00, bonus:null, deptId:10}, 112 {id:1008, eName:"ZhuBaJie", jobId:4, mgr:1004, joinDate:"2007-04-19", salary:30000.00, bonus:null, deptId:20}, 113 {id:1009, eName:"LuoGuanZhong", jobId:1, mgr:null, joinDate:"2001-11-17", salary:50000.00, bonus:null, deptId:10}, 114 {id:1010, eName:"WuYong", jobId:3, mgr:1006, joinDate:"2001-09-08", salary:15000.00, bonus:0.00, deptId:30}, 115 {id:1011, eName:"ShaCeng", jobId:4, mgr:1004, joinDate:"2007-05-23", salary:11000.00, bonus:null, deptId:20}, 116 {id:1012, eName:"LiKui", jobId:4, mgr:1006, joinDate:"2001-12-03", salary:9500.00, bonus:null, deptId:30}, 117 {id:1013, eName:"XiaoBaiLong", jobId:4, mgr:1004, joinDate:"2001-12-03", salary:30000.00, bonus:null, deptId:20}, 118 {id:1014, eName:"GuanYu", jobId:4, mgr:1007, joinDate:"2002-01-23", salary:13000.00, bonus:null, deptId:10}, 119 ]; 120 121 await rdbStore.batchInsert("emp", emps); 122 console.info(TAG + 'generateEmpTable end'); 123 } 124 125 126 async function generateSalarygradeTable() { 127 console.info(TAG + 'generateSalarygradeTable') 128 await rdbStore.executeSql(SALARYGRADE_TABLE); 129 130 var salarygrades = [ 131 {grade:1, loSalary:7000, hiSalary:12000}, 132 {grade:2, loSalary:12010, hiSalary:14000}, 133 {grade:3, loSalary:14010, hiSalary:20000}, 134 {grade:4, loSalary:20010, hiSalary:30000}, 135 {grade:5, loSalary:30010, hiSalary:99990}, 136 ]; 137 138 await rdbStore.batchInsert("salarygrade", salarygrades); 139 console.info(TAG + 'generateSalarygradeTable end') 140 } 141 142 console.log(TAG + "*************Unit Test Begin*************"); 143 /** 144 * @tc.name: testRdbJoinB001 145 * @tc.desc: normal testcase of Rdb_Cross_Join 146 * @tc.type: FUNC 147 * @tc.require: I4NZP6 148 */ 149 it('testRdbJoinB001', 0, async function (done) { 150 console.log(TAG + "testRdbJoinB001 begin."); 151 let resultSet = await rdbStore.querySql( 152 "SELECT * FROM emp CROSS JOIN dept ON emp.deptId = dept.id"); 153 154 expect(14).assertEqual(resultSet.rowCount); 155 expect(true).assertEqual(resultSet.goToFirstRow()); 156 expect(1001).assertEqual(resultSet.getInt(0)); 157 expect("SunWuKong").assertEqual(resultSet.getString(1)); 158 expect(4).assertEqual(resultSet.getInt(2)); 159 expect(1004).assertEqual(resultSet.getInt(3)); 160 expect("2000-12-17").assertEqual(resultSet.getString(4)); 161 expect(8000.00).assertEqual(resultSet.getDouble(5)); 162 expect(true).assertEqual(resultSet.isColumnNull(6)); 163 expect(20).assertEqual(resultSet.getInt(7)); 164 expect(20).assertEqual(resultSet.getInt(8)); 165 expect("XueGongBu").assertEqual(resultSet.getString(9)); 166 expect("ShangHai").assertEqual(resultSet.getString(10)); 167 resultSet.close(); 168 done(); 169 }) 170 171 /** 172 * @tc.name: testRdbJoinB002 173 * @tc.desc: normal testcase of Rdb_Inner_Join 174 * @tc.type: FUNC 175 * @tc.require: I4NZP6 176 */ 177 it('testRdbJoinB002', 0, async function (done) { 178 console.log(TAG + "testRdbJoinB002 begin."); 179 let resultSet = await rdbStore.querySql("SELECT t1.id, t1.eName, t1.salary, t2.jName, t2.description" + 180 " FROM emp t1 INNER JOIN job t2 ON t1.`jobId` = t2.`id` WHERE t1.eName = 'SunWuKong'") 181 182 expect(1).assertEqual(resultSet.rowCount); 183 expect(true).assertEqual(resultSet.goToFirstRow()); 184 expect(1001).assertEqual(resultSet.getInt(0)); 185 expect("SunWuKong").assertEqual(resultSet.getString(1)); 186 expect(8000.00).assertEqual(resultSet.getDouble(2)); 187 expect("Clerk").assertEqual(resultSet.getString(3)); 188 expect("UseOfficeSoftware").assertEqual(resultSet.getString(4)); 189 resultSet.close(); 190 done(); 191 }) 192 193 194 /** 195 * @tc.name: testRdbJoinB003 196 * @tc.desc: normal testcase of Rdb_Inner_Join 197 * @tc.type: FUNC 198 * @tc.require: I4NZP6 199 */ 200 it('testRdbJoinB003', 0, async function (done) { 201 console.log(TAG + "testRdbJoinB003 begin."); 202 let resultSet = await rdbStore.querySql("SELECT t1.eName, t1.salary, t2.* " + 203 "FROM emp t1 INNER JOIN salarygrade t2 WHERE t1.salary BETWEEN t2.losalary AND t2.hisalary") 204 205 expect(14).assertEqual(resultSet.rowCount); 206 expect(true).assertEqual(resultSet.goToFirstRow()); 207 expect("SunWuKong").assertEqual(resultSet.getString(0)); 208 expect(8000.00).assertEqual(resultSet.getDouble(1)); 209 expect(1).assertEqual(resultSet.getInt(2)); 210 expect(7000).assertEqual(resultSet.getInt(3)); 211 expect(12000).assertEqual(resultSet.getInt(4)); 212 resultSet.close(); 213 done(); 214 }) 215 216 /** 217 * @tc.name: testRdbJoinB004 218 * @tc.desc: normal testcase of Rdb_Inner_Join 219 * @tc.type: FUNC 220 * @tc.require: I4NZP6 221 */ 222 it('testRdbJoinB004', 0, async function (done) { 223 console.log(TAG + "testRdbJoinB004 begin."); 224 let resultSet = await rdbStore.querySql("SELECT t1.eName, t1.salary, t2.jName, t2.description, t3.dName, " + 225 "t3.loc, t4.grade FROM emp t1 INNER JOIN job t2 INNER JOIN dept t3 INNER JOIN salarygrade t4 " + 226 "ON t1.jobId = t2.id AND t1.deptId = t3.id AND t1.salary BETWEEN t4.loSalary AND t4.hiSalary"); 227 228 expect(14).assertEqual(resultSet.rowCount); 229 expect(true).assertEqual(resultSet.goToFirstRow()); 230 expect("SunWuKong").assertEqual(resultSet.getString(0)); 231 expect(8000.00).assertEqual(resultSet.getDouble(1)); 232 expect("Clerk").assertEqual(resultSet.getString(2)); 233 expect("UseOfficeSoftware").assertEqual(resultSet.getString(3)); 234 expect("XueGongBu").assertEqual(resultSet.getString(4)); 235 expect("ShangHai").assertEqual(resultSet.getString(5)); 236 expect(1).assertEqual(resultSet.getInt(6)); 237 resultSet.close(); 238 done(); 239 }) 240 241 /** 242 * @tc.name: testRdbJoinB005 243 * @tc.desc: normal testcase of Rdb_Left_Outer_Join 244 * @tc.type: FUNC 245 * @tc.require: I4NZP6 246 */ 247 it('testRdbJoinB005', 0, async function (done) { 248 console.log(TAG + "testRdbJoinB005 begin."); 249 let resultSet = await rdbStore.querySql( 250 "SELECT t1.eName, t1.mgr, t2.id, t2.eName FROM emp t1 LEFT OUTER JOIN emp t2 ON t1.mgr = t2.id"); 251 252 expect(14).assertEqual(resultSet.rowCount); 253 expect(true).assertEqual(resultSet.goToFirstRow()); 254 expect("SunWuKong").assertEqual(resultSet.getString(0)); 255 expect(1004).assertEqual(resultSet.getInt(1)); 256 expect(1004).assertEqual(resultSet.getInt(2)); 257 expect("TangCeng").assertEqual(resultSet.getString(3)); 258 resultSet.close(); 259 done(); 260 }) 261 262 console.log(TAG + "*************Unit Test End*************"); 263})