Skip to content

Commit 2682da8

Browse files
committed
Include totals in VisualizationObject to AFM ResultSpec conversion
1 parent c8acc5c commit 2682da8

File tree

3 files changed

+164
-3
lines changed

3 files changed

+164
-3
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
import com.gooddata.sdk.model.executeafm.resultspec.Dimension;
2525
import com.gooddata.sdk.model.executeafm.resultspec.ResultSpec;
2626
import com.gooddata.sdk.model.executeafm.resultspec.SortItem;
27+
import com.gooddata.sdk.model.executeafm.resultspec.TotalItem;
2728

2829
import java.util.ArrayList;
30+
import java.util.HashSet;
2931
import java.util.List;
3032
import java.util.function.Function;
3133
import java.util.stream.Collectors;
@@ -216,12 +218,16 @@ private static List<Dimension> getDimensionsForTable(final VisualizationObject v
216218
List<Dimension> dimensions = new ArrayList<>();
217219

218220
List<VisualizationAttribute> attributes = visualizationObject.getAttributes();
221+
List<TotalItem> totals = visualizationObject.getTotals();
219222

220223
if (!attributes.isEmpty()) {
221-
dimensions.add(new Dimension(attributes.stream()
224+
final Dimension attributeDimension = new Dimension(attributes.stream()
222225
.map(VisualizationAttribute::getLocalIdentifier)
223-
.collect(toList())
224-
));
226+
.collect(toList()));
227+
if (!totals.isEmpty()) {
228+
attributeDimension.setTotals(new HashSet<>(totals));
229+
}
230+
dimensions.add(attributeDimension);
225231
} else {
226232
dimensions.add(new Dimension(new ArrayList<>()));
227233
}

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.gooddata.sdk.model.executeafm.resultspec.MeasureLocatorItem
2626
import com.gooddata.sdk.model.executeafm.resultspec.MeasureSortItem
2727
import com.gooddata.sdk.model.executeafm.resultspec.ResultSpec
2828
import com.gooddata.sdk.model.executeafm.resultspec.SortItem
29+
import com.gooddata.sdk.model.executeafm.resultspec.TotalItem
2930
import spock.lang.Specification
3031
import spock.lang.Unroll
3132

@@ -48,6 +49,7 @@ class VisualizationConverterTest extends Specification {
4849
private static final String MULTIPLE_ATTRIBUTE_BUCKETS = "md/visualization/multipleAttributeBucketsVisualization.json"
4950
private static final String STACKED_COLUMN_CHART = "md/visualization/stackedColumnChart.json"
5051
private static final String LINE_CHART = "md/visualization/lineChart.json"
52+
private static final String TABLE_WITH_TOTALS = "md/visualization/complexTableWithTotals.json"
5153

5254
@SuppressWarnings("GrDeprecatedAPIUsage")
5355
def "should convert complex"() {
@@ -119,6 +121,42 @@ class VisualizationConverterTest extends Specification {
119121
)
120122
}
121123

124+
def "should generate result spec for complex table with totals"() {
125+
when:
126+
VisualizationObject vo = readObjectFromResource("/$TABLE_WITH_TOTALS", VisualizationObject)
127+
Function getter = { vizObject ->
128+
Stub(VisualizationClass) {
129+
getVisualizationType() >> VisualizationType.TABLE
130+
getUri() >> vo.getVisualizationClassUri()
131+
}
132+
}
133+
ResultSpec converted = convertToResultSpec(vo, getter)
134+
then:
135+
that converted, jsonEquals(
136+
// pivot table is simplified to a basic table (2 dimensions: measureGroup and attributes)
137+
new ResultSpec([
138+
new Dimension(
139+
[
140+
"e4bb25477bca4fb2a29a4b80d94568d4",
141+
"9008f5d33b3e41279402a25e2f05d0c9",
142+
"023641d306f84921be39d0aa1d6464db",
143+
"a22843f5d77f48b4938ccfb460eb8be4",
144+
"a77983fcc9574f6bad6be1d3cb08bf71"
145+
],
146+
[
147+
new TotalItem("fd0164f14ec2444b9b5a7140ce059036", "nat", "e4bb25477bca4fb2a29a4b80d94568d4"),
148+
new TotalItem("fd0164f14ec2444b9b5a7140ce059036", "nat", "9008f5d33b3e41279402a25e2f05d0c9"),
149+
new TotalItem("fd0164f14ec2444b9b5a7140ce059036", "nat", "a22843f5d77f48b4938ccfb460eb8be4"),
150+
new TotalItem("fd0164f14ec2444b9b5a7140ce059036", "nat", "a77983fcc9574f6bad6be1d3cb08bf71"),
151+
new TotalItem("fd0164f14ec2444b9b5a7140ce059036", "sum", "e4bb25477bca4fb2a29a4b80d94568d4"),
152+
new TotalItem("fd0164f14ec2444b9b5a7140ce059036", "nat", "023641d306f84921be39d0aa1d6464db")
153+
] as Set<TotalItem>
154+
),
155+
new Dimension(["measureGroup"], null)
156+
], [new AttributeSortItem("asc", "e4bb25477bca4fb2a29a4b80d94568d4", null)])
157+
)
158+
}
159+
122160
@Unroll
123161
def "should generate result spec for #type"() {
124162
given:
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
{
2+
"visualizationObject": {
3+
"content": {
4+
"buckets": [
5+
{
6+
"localIdentifier": "measures",
7+
"items": [
8+
{
9+
"measure": {
10+
"definition": {
11+
"measureDefinition": {
12+
"item": {
13+
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/9211"
14+
}
15+
}
16+
},
17+
"title": "_Close [BOP]",
18+
"localIdentifier": "fd0164f14ec2444b9b5a7140ce059036"
19+
}
20+
}
21+
]
22+
},
23+
{
24+
"items": [
25+
{
26+
"visualizationAttribute": {
27+
"displayForm": {
28+
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/1024"
29+
},
30+
"localIdentifier": "e4bb25477bca4fb2a29a4b80d94568d4"
31+
}
32+
},
33+
{
34+
"visualizationAttribute": {
35+
"displayForm": {
36+
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/1028"
37+
},
38+
"localIdentifier": "9008f5d33b3e41279402a25e2f05d0c9"
39+
}
40+
},
41+
{
42+
"visualizationAttribute": {
43+
"displayForm": {
44+
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/1086"
45+
},
46+
"localIdentifier": "023641d306f84921be39d0aa1d6464db"
47+
}
48+
}
49+
],
50+
"totals": [
51+
{
52+
"measureIdentifier": "fd0164f14ec2444b9b5a7140ce059036",
53+
"attributeIdentifier": "e4bb25477bca4fb2a29a4b80d94568d4",
54+
"type": "sum"
55+
},
56+
{
57+
"measureIdentifier": "fd0164f14ec2444b9b5a7140ce059036",
58+
"attributeIdentifier": "e4bb25477bca4fb2a29a4b80d94568d4",
59+
"type": "nat"
60+
},
61+
{
62+
"measureIdentifier": "fd0164f14ec2444b9b5a7140ce059036",
63+
"attributeIdentifier": "9008f5d33b3e41279402a25e2f05d0c9",
64+
"type": "nat"
65+
},
66+
{
67+
"attributeIdentifier": "023641d306f84921be39d0aa1d6464db",
68+
"measureIdentifier": "fd0164f14ec2444b9b5a7140ce059036",
69+
"type": "nat"
70+
}
71+
],
72+
"localIdentifier": "attribute"
73+
},
74+
{
75+
"items": [
76+
{
77+
"visualizationAttribute": {
78+
"localIdentifier": "a22843f5d77f48b4938ccfb460eb8be4",
79+
"displayForm": {
80+
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/1805"
81+
}
82+
}
83+
},
84+
{
85+
"visualizationAttribute": {
86+
"localIdentifier": "a77983fcc9574f6bad6be1d3cb08bf71",
87+
"displayForm": {
88+
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/1094"
89+
}
90+
}
91+
}
92+
],
93+
"totals": [
94+
{
95+
"type": "nat",
96+
"attributeIdentifier": "a22843f5d77f48b4938ccfb460eb8be4",
97+
"measureIdentifier": "fd0164f14ec2444b9b5a7140ce059036"
98+
},
99+
{
100+
"type": "nat",
101+
"attributeIdentifier": "a77983fcc9574f6bad6be1d3cb08bf71",
102+
"measureIdentifier": "fd0164f14ec2444b9b5a7140ce059036"
103+
}
104+
],
105+
"localIdentifier": "columns"
106+
}
107+
],
108+
"properties": "{\"sortItems\":[{\"attributeSortItem\":{\"attributeIdentifier\":\"e4bb25477bca4fb2a29a4b80d94568d4\",\"direction\":\"asc\"}}]}",
109+
"visualizationClass": {
110+
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/75547"
111+
}
112+
},
113+
"meta": {
114+
"title": "complex-with-totals"
115+
}
116+
}
117+
}

0 commit comments

Comments
 (0)