• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.healthconnect.storage.request;
18 
19 import static android.health.connect.Constants.DEFAULT_LONG;
20 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_UNKNOWN;
21 
22 import static com.android.server.healthconnect.storage.utils.WhereClauses.LogicalOperator.AND;
23 
24 import android.annotation.Nullable;
25 import android.health.connect.Constants;
26 import android.health.connect.datatypes.RecordTypeIdentifier;
27 import android.util.Slog;
28 
29 import com.android.server.healthconnect.storage.utils.StorageUtils;
30 import com.android.server.healthconnect.storage.utils.WhereClauses;
31 
32 import java.util.Collections;
33 import java.util.List;
34 import java.util.Objects;
35 
36 /**
37  * No need to have delete-requests for child tables as ideally they should be following cascaded
38  * deletes. If not please rethink the table structure and if possible remove the parent-child
39  * relationship.
40  *
41  * @hide
42  */
43 public class DeleteTableRequest {
44 
45     private static final String TAG = "HealthConnectDelete";
46     private final String mTableName;
47     @RecordTypeIdentifier.RecordType private final int mRecordType;
48 
49     @Nullable private String mIdColumnName;
50     @Nullable private String mPackageColumnName;
51     @Nullable private String mTimeColumnName;
52     @Nullable private List<Long> mPackageFilters;
53     private long mStartTime = DEFAULT_LONG;
54     private long mEndTime = DEFAULT_LONG;
55     @Nullable private List<String> mIds;
56     private final WhereClauses mExtraWhereClauses = new WhereClauses(AND);
57 
DeleteTableRequest(String tableName, @RecordTypeIdentifier.RecordType int recordType)58     public DeleteTableRequest(String tableName, @RecordTypeIdentifier.RecordType int recordType) {
59         mTableName = tableName;
60         mRecordType = recordType;
61     }
62 
DeleteTableRequest(String tableName)63     public DeleteTableRequest(String tableName) {
64         Objects.requireNonNull(tableName);
65 
66         mTableName = tableName;
67         mRecordType = RECORD_TYPE_UNKNOWN;
68     }
69 
70     @Nullable
getPackageColumnName()71     public String getPackageColumnName() {
72         return mPackageColumnName;
73     }
74 
setIdColumnName(String idColumnName)75     public DeleteTableRequest setIdColumnName(String idColumnName) {
76         mIdColumnName = idColumnName;
77         return this;
78     }
79 
setIds(String idColumnName, List<String> ids)80     public DeleteTableRequest setIds(String idColumnName, List<String> ids) {
81         mIds = ids.stream().map(StorageUtils::getNormalisedString).toList();
82         mIdColumnName = idColumnName;
83         return this;
84     }
85 
setId(String idColumnName, String id)86     public DeleteTableRequest setId(String idColumnName, String id) {
87         mIds = Collections.singletonList(StorageUtils.getNormalisedString(id));
88         mIdColumnName = idColumnName;
89         return this;
90     }
91 
getRecordType()92     public int getRecordType() {
93         return mRecordType;
94     }
95 
96     @Nullable
getIdColumnName()97     public String getIdColumnName() {
98         return mIdColumnName;
99     }
100 
101     @Nullable
getIds()102     public List<String> getIds() {
103         return mIds;
104     }
105 
getTableName()106     public String getTableName() {
107         return mTableName;
108     }
109 
setPackageColumnName(String packageColumnName)110     public DeleteTableRequest setPackageColumnName(String packageColumnName) {
111         mPackageColumnName = packageColumnName;
112         return this;
113     }
114 
setPackageFilter( String packageColumnName, List<Long> packageFilters)115     public DeleteTableRequest setPackageFilter(
116             String packageColumnName, List<Long> packageFilters) {
117         mPackageFilters = packageFilters;
118         mPackageColumnName = packageColumnName;
119         return this;
120     }
121 
122     /** Adds an extra {@link WhereClauses} that filters the rows to be deleted. */
addExtraWhereClauses(WhereClauses whereClauses)123     public DeleteTableRequest addExtraWhereClauses(WhereClauses whereClauses) {
124         mExtraWhereClauses.addNestedWhereClauses(whereClauses);
125         return this;
126     }
127 
getDeleteCommand()128     public String getDeleteCommand() {
129         return "DELETE FROM " + mTableName + getWhereCommand();
130     }
131 
getReadCommand()132     public String getReadCommand() {
133         return "SELECT "
134                 + mIdColumnName
135                 + ", "
136                 + mPackageColumnName
137                 + " FROM "
138                 + mTableName
139                 + getWhereCommand();
140     }
141 
getWhereCommand()142     private String getWhereCommand() {
143         WhereClauses whereClauses = new WhereClauses(AND);
144         whereClauses.addNestedWhereClauses(mExtraWhereClauses);
145         whereClauses.addWhereInLongsClause(mPackageColumnName, mPackageFilters);
146         whereClauses.addWhereBetweenTimeClause(mTimeColumnName, mStartTime, mEndTime);
147         whereClauses.addWhereInClauseWithoutQuotes(mIdColumnName, mIds);
148 
149         if (Constants.DEBUG) {
150             Slog.d(
151                     TAG,
152                     "delete query: tableName: "
153                             + mTableName
154                             + " whereClause: "
155                             + whereClauses.get(true));
156         }
157 
158         return whereClauses.get(true);
159     }
160 
setTimeFilter(String timeColumnName, long startTime, long endTime)161     public DeleteTableRequest setTimeFilter(String timeColumnName, long startTime, long endTime) {
162         Objects.requireNonNull(timeColumnName);
163 
164         // Return if the params will result in no impact on the query
165         if (startTime < 0 || endTime < startTime) {
166             return this;
167         }
168 
169         mStartTime = startTime;
170         mEndTime = endTime;
171         mTimeColumnName = timeColumnName;
172 
173         return this;
174     }
175 }
176