Skip to content

Commit c8acc5c

Browse files
committed
Introduce totals field in the visualization Bucket
1 parent 7080734 commit c8acc5c

File tree

4 files changed

+125
-18
lines changed

4 files changed

+125
-18
lines changed

gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/Bucket.java

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
import com.fasterxml.jackson.annotation.JsonInclude;
1212
import com.fasterxml.jackson.annotation.JsonProperty;
1313
import com.gooddata.sdk.model.executeafm.afm.LocallyIdentifiable;
14+
import com.gooddata.sdk.model.executeafm.resultspec.TotalItem;
1415

1516
import java.io.Serializable;
17+
import java.util.ArrayList;
1618
import java.util.List;
1719
import java.util.Objects;
1820

@@ -26,17 +28,33 @@ public class Bucket implements Serializable, LocallyIdentifiable {
2628
private static final long serialVersionUID = -7718720886547680021L;
2729
private final String localIdentifier;
2830
private final List<BucketItem> items;
31+
private final List<TotalItem> totals;
32+
33+
/**
34+
* Creates new instance of bucket without totals
35+
*
36+
* @param localIdentifier local identifier of bucket
37+
* @param items list of {@link BucketItem}s for this bucket
38+
*/
39+
public Bucket(@JsonProperty("localIdentifier") final String localIdentifier,
40+
@JsonProperty("items") final List<BucketItem> items) {
41+
this(localIdentifier, items, null);
42+
}
2943

3044
/**
3145
* Creates new instance of bucket
46+
*
3247
* @param localIdentifier local identifier of bucket
33-
* @param items list of {@link BucketItem}s for this bucket
48+
* @param items list of {@link BucketItem}s for this bucket
49+
* @param totals list of {@link TotalItem}s for this bucket
3450
*/
3551
@JsonCreator
3652
public Bucket(@JsonProperty("localIdentifier") final String localIdentifier,
37-
@JsonProperty("items") final List<BucketItem> items) {
53+
@JsonProperty("items") final List<BucketItem> items,
54+
@JsonProperty("totals") List<TotalItem> totals) {
3855
this.localIdentifier = localIdentifier;
3956
this.items = items;
57+
this.totals = totals;
4058
}
4159

4260
/**
@@ -53,6 +71,13 @@ public List<BucketItem> getItems() {
5371
return items;
5472
}
5573

74+
/**
75+
* @return list of defined {@link TotalItem}s
76+
*/
77+
public List<TotalItem> getTotals() {
78+
return totals;
79+
}
80+
5681
@JsonIgnore
5782
VisualizationAttribute getOnlyAttribute() {
5883
if (getItems() != null && getItems().size() == 1) {
@@ -67,15 +92,18 @@ VisualizationAttribute getOnlyAttribute() {
6792

6893
@Override
6994
public boolean equals(Object o) {
70-
if (this == o) return true;
71-
if (o == null || getClass() != o.getClass()) return false;
95+
if (this == o)
96+
return true;
97+
if (o == null || getClass() != o.getClass())
98+
return false;
7299
Bucket bucket = (Bucket) o;
73-
return Objects.equals(localIdentifier, bucket.localIdentifier) &&
74-
Objects.equals(items, bucket.items);
100+
return Objects.equals(localIdentifier, bucket.localIdentifier)
101+
&& Objects.equals(items, bucket.items)
102+
&& Objects.equals(totals, bucket.totals);
75103
}
76104

77105
@Override
78106
public int hashCode() {
79-
return Objects.hash(localIdentifier, items);
107+
return Objects.hash(localIdentifier, items, totals);
80108
}
81109
}

gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/visualization/VisualizationObject.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.gooddata.sdk.model.executeafm.Execution;
2525
import com.gooddata.sdk.model.executeafm.afm.filter.ExtendedFilter;
2626
import com.gooddata.sdk.model.executeafm.resultspec.ResultSpec;
27+
import com.gooddata.sdk.model.executeafm.resultspec.TotalItem;
2728
import com.gooddata.sdk.model.md.AbstractObj;
2829
import com.gooddata.sdk.model.md.Meta;
2930
import com.gooddata.sdk.model.md.Queryable;
@@ -77,6 +78,14 @@ public List<Measure> getMeasures() {
7778
return content.getMeasures();
7879
}
7980

81+
/**
82+
* @return all totals from all buckets in visualization object
83+
*/
84+
@JsonIgnore
85+
public List<TotalItem> getTotals() {
86+
return content.getTotals();
87+
}
88+
8089
/**
8190
* Get measure by local identifier or null if not found
8291
* @param localIdentifier of measure
@@ -391,6 +400,14 @@ public List<Measure> getMeasures() {
391400
.collect(toList());
392401
}
393402

403+
@JsonIgnore
404+
public List<TotalItem> getTotals() {
405+
return buckets.stream()
406+
.filter(bucket -> bucket.getTotals() != null)
407+
.flatMap(bucket -> bucket.getTotals().stream())
408+
.collect(toList());
409+
}
410+
394411
@JsonIgnore
395412
public String getVisualizationClassUri() {
396413
return visualizationClass.getUri();

gooddata-java-model/src/test/groovy/com/gooddata/sdk/model/md/visualization/BucketTest.groovy

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
package com.gooddata.sdk.model.md.visualization
77

88
import com.gooddata.sdk.model.executeafm.UriObjQualifier
9+
import com.gooddata.sdk.model.executeafm.resultspec.TotalItem
10+
import com.gooddata.sdk.model.md.report.Total
911
import nl.jqno.equalsverifier.EqualsVerifier
1012
import org.apache.commons.lang3.SerializationUtils
1113
import spock.lang.Shared
@@ -18,6 +20,7 @@ import static spock.util.matcher.HamcrestSupport.that
1820
class BucketTest extends Specification {
1921
private static final String NO_ITEMS_BUCKET = "md/visualization/noItemsBucket.json"
2022
private static final String MIXED_BUCKET = "md/visualization/mixedBucket.json"
23+
private static final String MIXED_BUCKET_WITH_TOTALS = "md/visualization/mixedBucketWithTotals.json"
2124
private static final String ATTRIBUTE_BUCKET = "md/visualization/attributeBucket.json"
2225
private static final String MEASURE_BUCKET = "md/visualization/measureBucket.json"
2326
private static final String MULTIPLE_ATTRIBUTES_BUCKET = "md/visualization/multipleAttributesBucket.json"
@@ -32,19 +35,41 @@ class BucketTest extends Specification {
3235
that new Bucket("noItems", new ArrayList<BucketItem>()), jsonEquals(noItemsBucket)
3336
}
3437

35-
@SuppressWarnings("GrDeprecatedAPIUsage")
3638
def "should serialize full"() {
3739
expect:
38-
that new Bucket("attributeBucket", [
39-
new VisualizationAttribute(new UriObjQualifier("/uri/to/displayForm"), "attribute", "Attribute Alias"),
40-
new Measure(
41-
new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure"), "sum", false, []),
42-
"measure",
43-
"Measure Alias",
44-
"Measure",
45-
null
46-
)
47-
]), jsonEquals(mixedBucket)
40+
that new Bucket(
41+
"attributeBucket",
42+
[
43+
new VisualizationAttribute(new UriObjQualifier("/uri/to/displayForm"), "attribute", "Attribute Alias"),
44+
new Measure(
45+
new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure"), "sum", false, []),
46+
"measure",
47+
"Measure Alias",
48+
"Measure",
49+
null
50+
)
51+
] as List<BucketItem>
52+
), jsonEquals(mixedBucket)
53+
}
54+
55+
def "should serialize full with totals"() {
56+
expect:
57+
that new Bucket(
58+
"attributeBucket",
59+
[
60+
new VisualizationAttribute(new UriObjQualifier("/uri/to/displayForm"), "attribute", "Attribute Alias"),
61+
new Measure(
62+
new VOSimpleMeasureDefinition(new UriObjQualifier("/uri/to/measure"), "sum", false, []),
63+
"measure",
64+
"Measure Alias",
65+
"Measure",
66+
null
67+
)
68+
] as List<BucketItem>,
69+
[
70+
new TotalItem("measure", Total.NAT, "attribute")
71+
]
72+
), jsonEquals(readObjectFromResource("/$MIXED_BUCKET_WITH_TOTALS", Bucket.class))
4873
}
4974

5075
def "should return only attribute from bucket"() {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{
2+
"localIdentifier": "attributeBucket",
3+
"items": [
4+
{
5+
"visualizationAttribute": {
6+
"localIdentifier": "attribute",
7+
"displayForm": {
8+
"uri": "/uri/to/displayForm"
9+
},
10+
"alias": "Attribute Alias"
11+
}
12+
}, {
13+
"measure": {
14+
"localIdentifier": "measure",
15+
"title": "Measure",
16+
"alias": "Measure Alias",
17+
"definition": {
18+
"measureDefinition": {
19+
"item": {
20+
"uri": "/uri/to/measure"
21+
},
22+
"aggregation": "sum",
23+
"computeRatio": false,
24+
"filters": []
25+
}
26+
}
27+
}
28+
}
29+
],
30+
"totals": [
31+
{
32+
"measureIdentifier": "measure",
33+
"type": "nat",
34+
"attributeIdentifier": "attribute"
35+
}
36+
]
37+
}

0 commit comments

Comments
 (0)