1048147e0Sopenharmony_ci/** 2048147e0Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3048147e0Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4048147e0Sopenharmony_ci * you may not use this file except in compliance with the License. 5048147e0Sopenharmony_ci * You may obtain a copy of the License at 6048147e0Sopenharmony_ci * 7048147e0Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8048147e0Sopenharmony_ci * 9048147e0Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10048147e0Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11048147e0Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12048147e0Sopenharmony_ci * See the License for the specific language governing permissions and 13048147e0Sopenharmony_ci * limitations under the License. 14048147e0Sopenharmony_ci */ 15048147e0Sopenharmony_ciimport dataShare from '@ohos.data.dataShare'; 16048147e0Sopenharmony_ciimport dataSharePredicates from '@ohos.data.dataSharePredicates'; 17048147e0Sopenharmony_ci 18048147e0Sopenharmony_ciimport BaseModel from './BaseModel'; 19048147e0Sopenharmony_ciimport common from '../data/commonData'; 20048147e0Sopenharmony_ciimport HiLog from '../utils/HiLog'; 21048147e0Sopenharmony_ciimport mmsTable from '../data/tableData'; 22048147e0Sopenharmony_ciimport LooseObject from '../data/LooseObject' 23048147e0Sopenharmony_ci 24048147e0Sopenharmony_ciconst TAG = 'ContactsModel'; 25048147e0Sopenharmony_ci 26048147e0Sopenharmony_ciexport default class ContactsModel extends BaseModel { 27048147e0Sopenharmony_ci public async queryContactDataByCondition(actionData, callback, context): Promise<void> { 28048147e0Sopenharmony_ci let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 29048147e0Sopenharmony_ci let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactDataCondition(actionData); 30048147e0Sopenharmony_ci let contactDataUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI; 31048147e0Sopenharmony_ci dataHelper.query(contactDataUri, condition, this.buildContactDataTablePartColumns()).then(resultSet => { 32048147e0Sopenharmony_ci let resultList: Array<LooseObject> = []; 33048147e0Sopenharmony_ci if (resultSet.rowCount > 0) { 34048147e0Sopenharmony_ci while (resultSet.goToNextRow()) { 35048147e0Sopenharmony_ci resultList.push(this.buildContactDataResult(resultSet)); 36048147e0Sopenharmony_ci } 37048147e0Sopenharmony_ci } 38048147e0Sopenharmony_ci callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList)); 39048147e0Sopenharmony_ci resultSet.close(); 40048147e0Sopenharmony_ci }).catch(error => { 41048147e0Sopenharmony_ci HiLog.e(TAG, 'queryContactDataByCondition fail, error: ' + JSON.stringify(error)); 42048147e0Sopenharmony_ci callback(this.encapsulateReturnCode(common.int.FAILURE)); 43048147e0Sopenharmony_ci }); 44048147e0Sopenharmony_ci } 45048147e0Sopenharmony_ci 46048147e0Sopenharmony_ci public async queryContactDataSizeByCondition(actionData, callback, context): Promise<void> { 47048147e0Sopenharmony_ci let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 48048147e0Sopenharmony_ci let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactDataCondition(actionData); 49048147e0Sopenharmony_ci let contactDataUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI; 50048147e0Sopenharmony_ci dataHelper.query(contactDataUri, condition, this.buildContactDataTablePartColumns()).then(resultSet => { 51048147e0Sopenharmony_ci callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount)); 52048147e0Sopenharmony_ci resultSet.close(); 53048147e0Sopenharmony_ci }).catch(error => { 54048147e0Sopenharmony_ci HiLog.e(TAG, 'queryContactDataSizeByCondition fail, error: ' + JSON.stringify(error)); 55048147e0Sopenharmony_ci callback(this.encapsulateReturnCode(common.int.FAILURE)); 56048147e0Sopenharmony_ci }); 57048147e0Sopenharmony_ci } 58048147e0Sopenharmony_ci 59048147e0Sopenharmony_ci public async queryContactByCondition(actionData, callback, context): Promise<void> { 60048147e0Sopenharmony_ci let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 61048147e0Sopenharmony_ci let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactCondition(actionData); 62048147e0Sopenharmony_ci let contactUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_URI; 63048147e0Sopenharmony_ci dataHelper.query(contactUri, condition, this.buildContactTablePartColumns()).then(resultSet => { 64048147e0Sopenharmony_ci let resultList: Array<LooseObject> = []; 65048147e0Sopenharmony_ci if (resultSet.rowCount > 0) { 66048147e0Sopenharmony_ci while (resultSet.goToNextRow()) { 67048147e0Sopenharmony_ci resultList.push(this.buildContactResult(resultSet)); 68048147e0Sopenharmony_ci } 69048147e0Sopenharmony_ci } 70048147e0Sopenharmony_ci callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList)); 71048147e0Sopenharmony_ci resultSet.close(); 72048147e0Sopenharmony_ci }).catch(error => { 73048147e0Sopenharmony_ci HiLog.e(TAG, 'queryContactByCondition fail, error: ' + JSON.stringify(error)); 74048147e0Sopenharmony_ci callback(this.encapsulateReturnCode(common.int.FAILURE)); 75048147e0Sopenharmony_ci }); 76048147e0Sopenharmony_ci } 77048147e0Sopenharmony_ci 78048147e0Sopenharmony_ci public async queryContactSizeByCondition(actionData, callback, context): Promise<void> { 79048147e0Sopenharmony_ci let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 80048147e0Sopenharmony_ci let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactCondition(actionData); 81048147e0Sopenharmony_ci let contactUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_URI; 82048147e0Sopenharmony_ci dataHelper.query(contactUri, condition, this.buildContactTablePartColumns()).then(resultSet => { 83048147e0Sopenharmony_ci callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount)); 84048147e0Sopenharmony_ci resultSet.close(); 85048147e0Sopenharmony_ci }).catch(error => { 86048147e0Sopenharmony_ci HiLog.e(TAG, 'queryContactSizeByCondition fail, error: ' + JSON.stringify(error)); 87048147e0Sopenharmony_ci callback(this.encapsulateReturnCode(common.int.FAILURE)); 88048147e0Sopenharmony_ci }); 89048147e0Sopenharmony_ci } 90048147e0Sopenharmony_ci 91048147e0Sopenharmony_ci public async queryRawContactSizeByCondition(actionData, callback, context): Promise<void> { 92048147e0Sopenharmony_ci let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 93048147e0Sopenharmony_ci let condition: dataSharePredicates.DataSharePredicates = this.buildQueryRawContactCondition(actionData); 94048147e0Sopenharmony_ci let rawContactUri: string = common.string.URI_ROW_CONTACTS + common.string.PROFILE_DATA_URI; 95048147e0Sopenharmony_ci dataHelper.query(rawContactUri, condition, this.buildRawContactTablePartColumns()).then(resultSet => { 96048147e0Sopenharmony_ci callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount)); 97048147e0Sopenharmony_ci resultSet.close(); 98048147e0Sopenharmony_ci }).catch(error => { 99048147e0Sopenharmony_ci HiLog.e(TAG, 'queryRawContactSizeByCondition fail, error: ' + JSON.stringify(error)); 100048147e0Sopenharmony_ci callback(this.encapsulateReturnCode(common.int.FAILURE)); 101048147e0Sopenharmony_ci }); 102048147e0Sopenharmony_ci } 103048147e0Sopenharmony_ci 104048147e0Sopenharmony_ci public async queryContactViewByCondition(actionData, callback, context): Promise<void> { 105048147e0Sopenharmony_ci let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 106048147e0Sopenharmony_ci let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactViewCondition(actionData); 107048147e0Sopenharmony_ci let searchContactViewUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_SEARCHE; 108048147e0Sopenharmony_ci dataHelper.query(searchContactViewUri, condition, this.buildRawContactViewPartColumns()).then(resultSet => { 109048147e0Sopenharmony_ci let resultList: Array<LooseObject> = []; 110048147e0Sopenharmony_ci if (resultSet.rowCount > 0) { 111048147e0Sopenharmony_ci while (resultSet.goToNextRow()) { 112048147e0Sopenharmony_ci resultList.push(this.buildContactViewResult(resultSet)); 113048147e0Sopenharmony_ci } 114048147e0Sopenharmony_ci } 115048147e0Sopenharmony_ci callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList)); 116048147e0Sopenharmony_ci resultSet.close(); 117048147e0Sopenharmony_ci }).catch(error => { 118048147e0Sopenharmony_ci HiLog.e(TAG, 'queryContactViewByCondition fail, error: ' + JSON.stringify(error)); 119048147e0Sopenharmony_ci callback(this.encapsulateReturnCode(common.int.FAILURE)); 120048147e0Sopenharmony_ci }); 121048147e0Sopenharmony_ci } 122048147e0Sopenharmony_ci 123048147e0Sopenharmony_ci private buildContactDataTablePartColumns(): Array<string> { 124048147e0Sopenharmony_ci // part of contact_data table columns 125048147e0Sopenharmony_ci return [ 126048147e0Sopenharmony_ci mmsTable.contactDataColumns.detailInfo, 127048147e0Sopenharmony_ci mmsTable.contactDataColumns.displayName, 128048147e0Sopenharmony_ci ]; 129048147e0Sopenharmony_ci } 130048147e0Sopenharmony_ci 131048147e0Sopenharmony_ci private buildContactTablePartColumns(): Array<string> { 132048147e0Sopenharmony_ci // part of contact table columns 133048147e0Sopenharmony_ci return [ 134048147e0Sopenharmony_ci mmsTable.contactColumns.id 135048147e0Sopenharmony_ci ]; 136048147e0Sopenharmony_ci } 137048147e0Sopenharmony_ci 138048147e0Sopenharmony_ci private buildRawContactTablePartColumns(): Array<string> { 139048147e0Sopenharmony_ci // part of raw_contact table columns 140048147e0Sopenharmony_ci return [ 141048147e0Sopenharmony_ci mmsTable.contactDataColumns.id 142048147e0Sopenharmony_ci ]; 143048147e0Sopenharmony_ci } 144048147e0Sopenharmony_ci 145048147e0Sopenharmony_ci private buildRawContactViewPartColumns(): Array<string> { 146048147e0Sopenharmony_ci // part of contact view table columns 147048147e0Sopenharmony_ci return [ 148048147e0Sopenharmony_ci mmsTable.searchContactView.detailInfo, 149048147e0Sopenharmony_ci mmsTable.searchContactView.displayName 150048147e0Sopenharmony_ci ]; 151048147e0Sopenharmony_ci } 152048147e0Sopenharmony_ci 153048147e0Sopenharmony_ci private buildContactDataResult(resultSet): LooseObject { 154048147e0Sopenharmony_ci let result: LooseObject = {}; 155048147e0Sopenharmony_ci result.detailInfo = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.detailInfo)); 156048147e0Sopenharmony_ci result.displayName = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.displayName)); 157048147e0Sopenharmony_ci return result; 158048147e0Sopenharmony_ci } 159048147e0Sopenharmony_ci 160048147e0Sopenharmony_ci private buildContactResult(resultSet): LooseObject { 161048147e0Sopenharmony_ci let result: LooseObject = {}; 162048147e0Sopenharmony_ci result.id = Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.contactColumns.id))); 163048147e0Sopenharmony_ci return result; 164048147e0Sopenharmony_ci } 165048147e0Sopenharmony_ci 166048147e0Sopenharmony_ci private buildContactViewResult(resultSet): LooseObject { 167048147e0Sopenharmony_ci let result: LooseObject = {}; 168048147e0Sopenharmony_ci result.detailInfo = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.detailInfo)); 169048147e0Sopenharmony_ci result.displayName = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.displayName)); 170048147e0Sopenharmony_ci return result; 171048147e0Sopenharmony_ci } 172048147e0Sopenharmony_ci 173048147e0Sopenharmony_ci private buildQueryContactDataCondition(actionData): dataSharePredicates.DataSharePredicates { 174048147e0Sopenharmony_ci let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 175048147e0Sopenharmony_ci condition.equalTo(mmsTable.contactDataColumns.typeId, '5'); 176048147e0Sopenharmony_ci if (actionData.hasDelete != null) { 177048147e0Sopenharmony_ci condition.and().equalTo(mmsTable.contactDataColumns.hasDelete, actionData.hasDelete); 178048147e0Sopenharmony_ci } 179048147e0Sopenharmony_ci if (actionData.contactIds != null && actionData.contactIds.length > 0) { 180048147e0Sopenharmony_ci condition.and().in(mmsTable.contactDataColumns.contactId, actionData.contactIds); 181048147e0Sopenharmony_ci } 182048147e0Sopenharmony_ci if (actionData.telephones != null && actionData.telephones.length > 0) { 183048147e0Sopenharmony_ci condition.and().in(mmsTable.contactDataColumns.detailInfo, actionData.telephones); 184048147e0Sopenharmony_ci } 185048147e0Sopenharmony_ci return condition; 186048147e0Sopenharmony_ci } 187048147e0Sopenharmony_ci 188048147e0Sopenharmony_ci private buildQueryContactCondition(actionData): dataSharePredicates.DataSharePredicates { 189048147e0Sopenharmony_ci let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 190048147e0Sopenharmony_ci condition.isNotNull(mmsTable.contactColumns.id); 191048147e0Sopenharmony_ci if (actionData.page != null && actionData.limit != null) { 192048147e0Sopenharmony_ci let offset: number = (actionData.page - 1) * actionData.limit; 193048147e0Sopenharmony_ci condition.and().limit(actionData.limit, offset); 194048147e0Sopenharmony_ci } 195048147e0Sopenharmony_ci if (actionData.telephone != null) { 196048147e0Sopenharmony_ci condition.and() 197048147e0Sopenharmony_ci .equalTo(mmsTable.searchContactView.contentType, 'phone') 198048147e0Sopenharmony_ci .beginWrap() 199048147e0Sopenharmony_ci .contains(mmsTable.searchContactView.displayName, actionData.telephone) 200048147e0Sopenharmony_ci .or() 201048147e0Sopenharmony_ci .contains(mmsTable.searchContactView.detailInfo, actionData.telephone) 202048147e0Sopenharmony_ci .endWrap(); 203048147e0Sopenharmony_ci } 204048147e0Sopenharmony_ci if (actionData.orderByTimeDesc != null) { 205048147e0Sopenharmony_ci condition.orderByDesc(mmsTable.contactColumns.lastestContactedTime); 206048147e0Sopenharmony_ci } 207048147e0Sopenharmony_ci return condition; 208048147e0Sopenharmony_ci } 209048147e0Sopenharmony_ci 210048147e0Sopenharmony_ci private buildQueryRawContactCondition(actionData): dataSharePredicates.DataSharePredicates { 211048147e0Sopenharmony_ci let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 212048147e0Sopenharmony_ci return condition; 213048147e0Sopenharmony_ci } 214048147e0Sopenharmony_ci 215048147e0Sopenharmony_ci private buildQueryContactViewCondition(actionData): dataSharePredicates.DataSharePredicates { 216048147e0Sopenharmony_ci let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 217048147e0Sopenharmony_ci condition.equalTo(mmsTable.searchContactView.contentType, 'phone') 218048147e0Sopenharmony_ci .beginWrap() 219048147e0Sopenharmony_ci .contains(mmsTable.searchContactView.displayName, actionData.telephone) 220048147e0Sopenharmony_ci .or() 221048147e0Sopenharmony_ci .contains(mmsTable.searchContactView.detailInfo, actionData.telephone) 222048147e0Sopenharmony_ci .endWrap(); 223048147e0Sopenharmony_ci return condition; 224048147e0Sopenharmony_ci } 225048147e0Sopenharmony_ci}