@@ -67,25 +67,7 @@ public long getCount() {
67
67
@ RestrictTo (RestrictTo .Scope .LIBRARY )
68
68
@ Nullable
69
69
public Object get (@ Nonnull AggregateField aggregateField ) {
70
- if (!data .containsKey (aggregateField .getAlias ())) {
71
- throw new IllegalArgumentException (
72
- "'"
73
- + aggregateField .getOperator ()
74
- + "("
75
- + aggregateField .getFieldPath ()
76
- + ")"
77
- + "' was not requested in the aggregation query." );
78
- }
79
- Value value = data .get (aggregateField .getAlias ());
80
- if (value .hasNullValue ()) {
81
- return null ;
82
- } else if (value .hasDoubleValue ()) {
83
- return value .getDoubleValue ();
84
- } else if (value .hasIntegerValue ()) {
85
- return value .getIntegerValue ();
86
- } else {
87
- throw new IllegalStateException ("Found aggregation result that is not an integer nor double" );
88
- }
70
+ return getInternal (aggregateField );
89
71
}
90
72
91
73
/**
@@ -98,18 +80,12 @@ public Object get(@Nonnull AggregateField aggregateField) {
98
80
/** @hide */
99
81
@ RestrictTo (RestrictTo .Scope .LIBRARY )
100
82
public long get (@ Nonnull AggregateField .CountAggregateField countAggregateField ) {
101
- Object value = get (( AggregateField ) countAggregateField );
83
+ Long value = getLong ( countAggregateField );
102
84
if (value == null ) {
103
85
throw new IllegalArgumentException (
104
86
"RunAggregationQueryResponse alias " + countAggregateField .getAlias () + " is null" );
105
- } else if (!(value instanceof Long )) {
106
- throw new IllegalArgumentException (
107
- "RunAggregationQueryResponse alias "
108
- + countAggregateField .getAlias ()
109
- + " has incorrect type: "
110
- + value .getClass ().getName ());
111
87
}
112
- return ( long ) value ;
88
+ return value ;
113
89
}
114
90
115
91
/**
@@ -126,7 +102,7 @@ public long get(@Nonnull AggregateField.CountAggregateField countAggregateField)
126
102
@ RestrictTo (RestrictTo .Scope .LIBRARY )
127
103
@ Nullable
128
104
public Double get (@ Nonnull AggregateField .AverageAggregateField averageAggregateField ) {
129
- return ( Double ) get (( AggregateField ) averageAggregateField );
105
+ return getDouble ( averageAggregateField );
130
106
}
131
107
132
108
/**
@@ -143,8 +119,8 @@ public Double get(@Nonnull AggregateField.AverageAggregateField averageAggregate
143
119
@ RestrictTo (RestrictTo .Scope .LIBRARY )
144
120
@ Nullable
145
121
public Double getDouble (@ Nonnull AggregateField aggregateField ) {
146
- Number result = ( Number ) get ( aggregateField );
147
- return result == null ? null : result .doubleValue ();
122
+ Number val = getTypedValue ( aggregateField , Number . class );
123
+ return val != null ? val .doubleValue () : null ;
148
124
}
149
125
150
126
/**
@@ -160,8 +136,44 @@ public Double getDouble(@Nonnull AggregateField aggregateField) {
160
136
@ RestrictTo (RestrictTo .Scope .LIBRARY )
161
137
@ Nullable
162
138
public Long getLong (@ Nonnull AggregateField aggregateField ) {
163
- Number result = (Number ) get (aggregateField );
164
- return result == null ? null : result .longValue ();
139
+ Number val = getTypedValue (aggregateField , Number .class );
140
+ return val != null ? val .longValue () : null ;
141
+ }
142
+
143
+ @ Nullable
144
+ private Object getInternal (@ Nonnull AggregateField aggregateField ) {
145
+ if (!data .containsKey (aggregateField .getAlias ())) {
146
+ throw new IllegalArgumentException (
147
+ "'"
148
+ + aggregateField .getOperator ()
149
+ + "("
150
+ + aggregateField .getFieldPath ()
151
+ + ")"
152
+ + "' was not requested in the aggregation query." );
153
+ }
154
+ Value value = data .get (aggregateField .getAlias ());
155
+ UserDataWriter userDataWriter =
156
+ new UserDataWriter (
157
+ query .getQuery ().firestore , DocumentSnapshot .ServerTimestampBehavior .DEFAULT );
158
+ return userDataWriter .convertValue (value );
159
+ }
160
+
161
+ @ Nullable
162
+ private <T > T getTypedValue (@ Nonnull AggregateField aggregateField , Class <T > clazz ) {
163
+ Object value = getInternal (aggregateField );
164
+ return castTypedValue (value , aggregateField , clazz );
165
+ }
166
+
167
+ @ Nullable
168
+ private <T > T castTypedValue (
169
+ Object value , @ Nonnull AggregateField aggregateField , Class <T > clazz ) {
170
+ if (value == null ) {
171
+ return null ;
172
+ } else if (!clazz .isInstance (value )) {
173
+ throw new RuntimeException (
174
+ "AggregateField '" + aggregateField .getAlias () + "' is not a " + clazz .getName ());
175
+ }
176
+ return clazz .cast (value );
165
177
}
166
178
167
179
/**
0 commit comments