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