• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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 android.annotation.IntDef;
20 import android.annotation.NonNull;
21 
22 import com.android.server.healthconnect.storage.utils.SqlJoin;
23 
24 import java.lang.annotation.Retention;
25 import java.lang.annotation.RetentionPolicy;
26 import java.util.ArrayList;
27 import java.util.List;
28 import java.util.Objects;
29 
30 /**
31  * Collection of parameters of {@link AggregateTableRequest}.
32  *
33  * @hide
34  */
35 public class AggregateParams {
36     private final String mTableName;
37 
38     // Column used for time filtering. Start time for interval records.
39     private String mTimeColumnName;
40     private final List<String> mColumnsToFetch;
41     private SqlJoin mJoin;
42 
43     // Additional column used for time filtering. End time for interval records,
44     // null for other records.
45     private String mExtraTimeColumnName = null;
46 
47     private String mTimeOffsetColumnName;
48 
49     private PriorityAggregationExtraParams mPriorityAggregationExtraParams;
50 
AggregateParams(String tableName, List<String> columnsToFetch, String timeColumnName)51     public AggregateParams(String tableName, List<String> columnsToFetch, String timeColumnName) {
52         this(tableName, columnsToFetch, timeColumnName, null);
53     }
54 
AggregateParams(String tableName, List<String> columnsToFetch)55     public AggregateParams(String tableName, List<String> columnsToFetch) {
56         this(tableName, columnsToFetch, null, null);
57     }
58 
AggregateParams( String tableName, List<String> columnsToFetch, String timeColumnName, Class<?> priorityColumnDataType)59     public AggregateParams(
60             String tableName,
61             List<String> columnsToFetch,
62             String timeColumnName,
63             Class<?> priorityColumnDataType) {
64         // We ignore constructor time column parameter as it's set separately.
65         this(tableName, columnsToFetch, priorityColumnDataType);
66     }
67 
AggregateParams( String tableName, List<String> columnsToFetch, Class<?> priorityColumnDataType)68     public AggregateParams(
69             String tableName, List<String> columnsToFetch, Class<?> priorityColumnDataType) {
70         mTableName = tableName;
71         mColumnsToFetch = new ArrayList<>();
72         mColumnsToFetch.addAll(columnsToFetch);
73 
74         // TODO(b/277776749): remove dependency on columns orders
75         mPriorityAggregationExtraParams =
76                 new PriorityAggregationExtraParams(columnsToFetch.get(0), priorityColumnDataType);
77     }
78 
getJoin()79     public SqlJoin getJoin() {
80         return mJoin;
81     }
82 
getTableName()83     public String getTableName() {
84         return mTableName;
85     }
86 
getTimeColumnName()87     public String getTimeColumnName() {
88         return mTimeColumnName;
89     }
90 
getExtraTimeColumnName()91     public String getExtraTimeColumnName() {
92         return mExtraTimeColumnName;
93     }
94 
getColumnsToFetch()95     public List<String> getColumnsToFetch() {
96         return mColumnsToFetch;
97     }
98 
getTimeOffsetColumnName()99     public String getTimeOffsetColumnName() {
100         return mTimeOffsetColumnName;
101     }
102 
103     /** Sets join type. */
setJoin(SqlJoin join)104     public AggregateParams setJoin(SqlJoin join) {
105         mJoin = join;
106         return this;
107     }
108 
setTimeColumnName(String columnName)109     public AggregateParams setTimeColumnName(String columnName) {
110         mTimeColumnName = columnName;
111         return this;
112     }
113 
114     /** Appends additional columns to fetch. */
appendAdditionalColumns(List<String> additionColumns)115     public AggregateParams appendAdditionalColumns(List<String> additionColumns) {
116         mColumnsToFetch.addAll(additionColumns);
117         return this;
118     }
119 
120     /** Sets params for priority aggregation. */
setPriorityAggregationExtraParams( PriorityAggregationExtraParams extraParams)121     public AggregateParams setPriorityAggregationExtraParams(
122             PriorityAggregationExtraParams extraParams) {
123         mPriorityAggregationExtraParams = extraParams;
124         return this;
125     }
126 
127     /** Returns params for priority aggregation. */
getPriorityAggregationExtraParams()128     public PriorityAggregationExtraParams getPriorityAggregationExtraParams() {
129         return mPriorityAggregationExtraParams;
130     }
131 
132     /** Sets params for priority aggregation. */
setExtraTimeColumn(String extraTimeColumn)133     public AggregateParams setExtraTimeColumn(String extraTimeColumn) {
134         mExtraTimeColumnName = extraTimeColumn;
135         return this;
136     }
137 
setOffsetColumnToFetch(@onNull String mainTimeColumnOffset)138     public AggregateParams setOffsetColumnToFetch(@NonNull String mainTimeColumnOffset) {
139         Objects.requireNonNull(mainTimeColumnOffset);
140         mTimeOffsetColumnName = mainTimeColumnOffset;
141         return this;
142     }
143 
144     /** Collections of parameters of priority AggregationRequest. */
145     public static class PriorityAggregationExtraParams {
146 
147         public static final int VALUE_TYPE_LONG = 0;
148         public static final int VALUE_TYPE_DOUBLE = 1;
149 
150         /** @hide */
151         @IntDef({
152             VALUE_TYPE_LONG,
153             VALUE_TYPE_DOUBLE,
154         })
155         @Retention(RetentionPolicy.SOURCE)
156         public @interface ValueColumnType {}
157 
158         @ValueColumnType private int mColumnToAggregateType;
159 
160         private String mColumnToAggregateName;
161         private String mExcludeIntervalEndColumnName;
162         private String mExcludeIntervalStartColumnName;
163 
PriorityAggregationExtraParams( String excludeIntervalStartColumnName, String excludeIntervalEndColumnName)164         public PriorityAggregationExtraParams(
165                 String excludeIntervalStartColumnName, String excludeIntervalEndColumnName) {
166             mExcludeIntervalStartColumnName = excludeIntervalStartColumnName;
167             mExcludeIntervalEndColumnName = excludeIntervalEndColumnName;
168         }
169 
PriorityAggregationExtraParams( String columnToAggregateName, Class<?> aggregationType)170         public PriorityAggregationExtraParams(
171                 String columnToAggregateName, Class<?> aggregationType) {
172             mColumnToAggregateName = columnToAggregateName;
173             // TODO(b/277776749): use intdef instead of unlimited Class<?>
174             mColumnToAggregateType =
175                     (aggregationType == Long.class ? VALUE_TYPE_LONG : VALUE_TYPE_DOUBLE);
176         }
177 
getExcludeIntervalStartColumnName()178         public String getExcludeIntervalStartColumnName() {
179             return mExcludeIntervalStartColumnName;
180         }
181 
getExcludeIntervalEndColumnName()182         public String getExcludeIntervalEndColumnName() {
183             return mExcludeIntervalEndColumnName;
184         }
185 
186         @ValueColumnType
getColumnToAggregateType()187         public int getColumnToAggregateType() {
188             return mColumnToAggregateType;
189         }
190 
getColumnToAggregateName()191         public String getColumnToAggregateName() {
192             return mColumnToAggregateName;
193         }
194 
195     }
196 }
197