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