• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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 package com.android.dialer.calllog.datasources.util;
17 
18 import android.content.ContentValues;
19 import com.android.dialer.common.Assert;
20 import java.util.Iterator;
21 import java.util.List;
22 import java.util.Objects;
23 
24 /** Convenience class for aggregating row values. */
25 public class RowCombiner {
26   private final List<ContentValues> individualRowsSortedByTimestampDesc;
27   private final ContentValues combinedRow = new ContentValues();
28 
RowCombiner(List<ContentValues> individualRowsSortedByTimestampDesc)29   public RowCombiner(List<ContentValues> individualRowsSortedByTimestampDesc) {
30     Assert.checkArgument(!individualRowsSortedByTimestampDesc.isEmpty());
31     this.individualRowsSortedByTimestampDesc = individualRowsSortedByTimestampDesc;
32   }
33 
34   /** Use the most recent value for the specified column. */
useMostRecentInt(String columnName)35   public RowCombiner useMostRecentInt(String columnName) {
36     combinedRow.put(
37         columnName, individualRowsSortedByTimestampDesc.get(0).getAsInteger(columnName));
38     return this;
39   }
40 
41   /** Use the most recent value for the specified column. */
useMostRecentLong(String columnName)42   public RowCombiner useMostRecentLong(String columnName) {
43     combinedRow.put(columnName, individualRowsSortedByTimestampDesc.get(0).getAsLong(columnName));
44     return this;
45   }
46 
47   /** Use the most recent value for the specified column. */
useMostRecentString(String columnName)48   public RowCombiner useMostRecentString(String columnName) {
49     combinedRow.put(columnName, individualRowsSortedByTimestampDesc.get(0).getAsString(columnName));
50     return this;
51   }
52 
useMostRecentBlob(String columnName)53   public RowCombiner useMostRecentBlob(String columnName) {
54     combinedRow.put(
55         columnName, individualRowsSortedByTimestampDesc.get(0).getAsByteArray(columnName));
56     return this;
57   }
58 
59   /** Asserts that all column values for the given column name are the same, and uses it. */
useSingleValueString(String columnName)60   public RowCombiner useSingleValueString(String columnName) {
61     Iterator<ContentValues> iterator = individualRowsSortedByTimestampDesc.iterator();
62     String singleValue = iterator.next().getAsString(columnName);
63     while (iterator.hasNext()) {
64       String current = iterator.next().getAsString(columnName);
65       Assert.checkState(Objects.equals(singleValue, current), "Values different for " + columnName);
66     }
67     combinedRow.put(columnName, singleValue);
68     return this;
69   }
70 
71   /** Asserts that all column values for the given column name are the same, and uses it. */
useSingleValueLong(String columnName)72   public RowCombiner useSingleValueLong(String columnName) {
73     Iterator<ContentValues> iterator = individualRowsSortedByTimestampDesc.iterator();
74     Long singleValue = iterator.next().getAsLong(columnName);
75     while (iterator.hasNext()) {
76       Long current = iterator.next().getAsLong(columnName);
77       Assert.checkState(Objects.equals(singleValue, current), "Values different for " + columnName);
78     }
79     combinedRow.put(columnName, singleValue);
80     return this;
81   }
82 
83   /** Asserts that all column values for the given column name are the same, and uses it. */
useSingleValueInt(String columnName)84   public RowCombiner useSingleValueInt(String columnName) {
85     Iterator<ContentValues> iterator = individualRowsSortedByTimestampDesc.iterator();
86     Integer singleValue = iterator.next().getAsInteger(columnName);
87     while (iterator.hasNext()) {
88       Integer current = iterator.next().getAsInteger(columnName);
89       Assert.checkState(Objects.equals(singleValue, current), "Values different for " + columnName);
90     }
91     combinedRow.put(columnName, singleValue);
92     return this;
93   }
94 
95   /** Performs a bitwise OR on the specified column and yields the result. */
bitwiseOr(String columnName)96   public RowCombiner bitwiseOr(String columnName) {
97     int combinedValue = 0;
98     for (ContentValues val : individualRowsSortedByTimestampDesc) {
99       combinedValue |= val.getAsInteger(columnName);
100     }
101     combinedRow.put(columnName, combinedValue);
102     return this;
103   }
104 
combine()105   public ContentValues combine() {
106     return combinedRow;
107   }
108 }
109