Skip to content

Commit

Permalink
Include native totals in VisualizationObject to AFM conversion
Browse files Browse the repository at this point in the history
  • Loading branch information
peter-plochan committed Dec 18, 2024
1 parent 9895019 commit d2e06d5
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.gooddata.sdk.model.executeafm.Execution;
import com.gooddata.sdk.model.executeafm.afm.Afm;
import com.gooddata.sdk.model.executeafm.afm.AttributeItem;
import com.gooddata.sdk.model.executeafm.afm.NativeTotalItem;
import com.gooddata.sdk.model.executeafm.afm.filter.CompatibilityFilter;
import com.gooddata.sdk.model.executeafm.afm.filter.DateFilter;
import com.gooddata.sdk.model.executeafm.afm.filter.ExtendedFilter;
Expand All @@ -25,6 +26,7 @@
import com.gooddata.sdk.model.executeafm.resultspec.ResultSpec;
import com.gooddata.sdk.model.executeafm.resultspec.SortItem;
import com.gooddata.sdk.model.executeafm.resultspec.TotalItem;
import com.gooddata.sdk.model.md.report.Total;

import java.util.ArrayList;
import java.util.HashSet;
Expand Down Expand Up @@ -88,8 +90,9 @@ public static Afm convertToAfm(final VisualizationObject visualizationObject) {
final List<AttributeItem> attributes = convertAttributes(visualizationObject.getAttributes());
final List<CompatibilityFilter> filters = convertFilters(visualizationObject.getFilters());
final List<MeasureItem> measures = convertMeasures(visualizationObject.getMeasures());
final List<NativeTotalItem> totals = convertNativeTotals(visualizationObject);

return new Afm(attributes, filters, measures, null);
return new Afm(attributes, filters, measures, totals);
}

/**
Expand Down Expand Up @@ -322,4 +325,42 @@ private static <T> List<T> removeIrrelevantFilters(final List<T> filters) {
})
.collect(Collectors.toList());
}

private static List<NativeTotalItem> convertNativeTotals(final VisualizationObject visualizationObject) {
final List<Bucket> attributeBuckets = getAttributeBuckets(visualizationObject);
final List<String> attributeIds = getIdsFromAttributeBuckets(attributeBuckets);
return attributeBuckets.stream()
.flatMap(bucket -> bucket.getTotals().stream())
.filter(totalItem -> isNativeTotal(totalItem) && attributeIds.contains(totalItem.getAttributeIdentifier()))
.map(totalItem -> convertToNativeTotalItem(totalItem, attributeIds))
.collect(toList());
}

private static NativeTotalItem convertToNativeTotalItem(TotalItem totalItem, List<String> attributeIds) {
final int attributeIdx = attributeIds.indexOf(totalItem.getAttributeIdentifier());
return new NativeTotalItem(
totalItem.getMeasureIdentifier(),
new ArrayList<>(attributeIds.subList(0, attributeIdx))
);
}

private static List<Bucket> getAttributeBuckets(final VisualizationObject visualizationObject) {
return visualizationObject.getBuckets().stream()
.filter(bucket -> bucket.getItems().stream().allMatch(AttributeItem.class::isInstance))
.collect(toList());
}

private static List<String> getIdsFromAttributeBuckets(final List<Bucket> attributeBuckets) {
return attributeBuckets.stream()
.flatMap(bucket ->
bucket.getItems().stream()
.map(AttributeItem.class::cast)
.map(AttributeItem::getLocalIdentifier)
)
.collect(toList());
}

private static boolean isNativeTotal(TotalItem totalItem) {
return totalItem.getType() != null && Total.NAT.name().equals(totalItem.getType().toUpperCase());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class VisualizationConverterTest extends Specification {
private static final String STACKED_COLUMN_CHART = "md/visualization/stackedColumnChart.json"
private static final String LINE_CHART = "md/visualization/lineChart.json"
private static final String TABLE_WITH_TOTALS = "md/visualization/complexTableWithTotals.json"
private static final String AFM_FROM_TABLE_WITH_TOTALS = "executeafm/afm/complextTableWithTotalsConvertedAfm.json"

@SuppressWarnings("GrDeprecatedAPIUsage")
def "should convert complex"() {
Expand Down Expand Up @@ -93,6 +94,15 @@ class VisualizationConverterTest extends Specification {
that converted, jsonEquals(expectedAfm)
}

def "should convert AFM of complex pivot table with totals"() {
given:
Afm expectedAfm = readObjectFromResource("/$AFM_FROM_TABLE_WITH_TOTALS", Afm)
VisualizationObject visualizationObject = readObjectFromResource("/$TABLE_WITH_TOTALS", VisualizationObject)
Afm converted = convertToAfm(visualizationObject)

expect:
that converted, jsonEquals(expectedAfm)
}

@Unroll
def "should generate result spec for table with default sorting from #name"() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
{
"measures": [
{
"localIdentifier": "fd0164f14ec2444b9b5a7140ce059036",
"definition": {
"measureDefinition": {
"filters": [],
"item": {
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/9211"
}
}
},
"alias": "_Close [BOP]"
}
],
"attributes": [
{
"displayForm": {
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/1024"
},
"localIdentifier": "e4bb25477bca4fb2a29a4b80d94568d4"
},
{
"displayForm": {
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/1028"
},
"localIdentifier": "9008f5d33b3e41279402a25e2f05d0c9"
},
{
"displayForm": {
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/1086"
},
"localIdentifier": "023641d306f84921be39d0aa1d6464db"
},
{
"displayForm": {
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/1805"
},
"localIdentifier": "a22843f5d77f48b4938ccfb460eb8be4"
},
{
"displayForm": {
"uri": "/gdc/md/w3hub93g7fwmvx60pkt2v8cr56530t0l/obj/1094"
},
"localIdentifier": "a77983fcc9574f6bad6be1d3cb08bf71"
}
],
"nativeTotals": [
{
"measureIdentifier": "fd0164f14ec2444b9b5a7140ce059036",
"attributeIdentifiers": []
},
{
"measureIdentifier": "fd0164f14ec2444b9b5a7140ce059036",
"attributeIdentifiers": [
"e4bb25477bca4fb2a29a4b80d94568d4"
]
},
{
"measureIdentifier": "fd0164f14ec2444b9b5a7140ce059036",
"attributeIdentifiers": [
"e4bb25477bca4fb2a29a4b80d94568d4",
"9008f5d33b3e41279402a25e2f05d0c9"
]
},
{
"measureIdentifier": "fd0164f14ec2444b9b5a7140ce059036",
"attributeIdentifiers": [
"e4bb25477bca4fb2a29a4b80d94568d4",
"9008f5d33b3e41279402a25e2f05d0c9",
"023641d306f84921be39d0aa1d6464db"
]
},
{
"measureIdentifier": "fd0164f14ec2444b9b5a7140ce059036",
"attributeIdentifiers": [
"e4bb25477bca4fb2a29a4b80d94568d4",
"9008f5d33b3e41279402a25e2f05d0c9",
"023641d306f84921be39d0aa1d6464db",
"a22843f5d77f48b4938ccfb460eb8be4"
]
}
],
"filters":[]
}

0 comments on commit d2e06d5

Please sign in to comment.