Skip to content

Commit f99d890

Browse files
committed
Introduce support for offset in PoP measure
1 parent 72d5b8d commit f99d890

5 files changed

Lines changed: 112 additions & 21 deletions

File tree

src/main/java/com/gooddata/executeafm/afm/PopMeasureDefinition.java

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
11
/*
2-
* Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved.
2+
* Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved.
33
* This source code is licensed under the BSD-style license found in the
44
* LICENSE.txt file in the root directory of this source tree.
55
*/
66
package com.gooddata.executeafm.afm;
77

8+
import com.fasterxml.jackson.annotation.JsonCreator;
9+
import com.fasterxml.jackson.annotation.JsonInclude;
810
import com.fasterxml.jackson.annotation.JsonProperty;
911
import com.fasterxml.jackson.annotation.JsonRootName;
1012
import com.gooddata.executeafm.ObjQualifier;
1113
import com.gooddata.executeafm.UriObjQualifier;
1214
import com.gooddata.util.GoodDataToStringBuilder;
1315

1416
import java.io.Serializable;
15-
import java.util.Objects;
1617

1718
import static com.gooddata.executeafm.afm.PopMeasureDefinition.NAME;
1819

1920
/**
2021
* Definition of so called "period over period" measure
2122
*/
2223
@JsonRootName(NAME)
24+
@JsonInclude(JsonInclude.Include.NON_NULL)
2325
public class PopMeasureDefinition implements MeasureDefinition, Serializable {
2426

2527
private static final long serialVersionUID = 1430640153994197345L;
@@ -29,21 +31,46 @@ public class PopMeasureDefinition implements MeasureDefinition, Serializable {
2931

3032
private final ObjQualifier popAttribute;
3133

34+
private final Integer offset;
35+
3236
/**
33-
* Creates new definition from given measure identifier referencing another measure in {@link Afm} and given
34-
* attribute qualifier (should qualify date attribute)
35-
* @param measureIdentifier measure identifier
36-
* @param popAttribute "period over period" date attribute
37+
* Creates new definition from given measure identifier referencing another measure in {@link Afm} and given attribute qualifier (should qualify date
38+
* attribute)
39+
*
40+
* @param measureIdentifier
41+
* measure identifier
42+
* @param popAttribute
43+
* "period over period" date attribute
44+
* @param offset
45+
* the number of periods the time window defined by {@code popAttribute} is offset about to the past (when value is negative) or future (when
46+
* value is positive)
3747
*/
48+
@JsonCreator
3849
public PopMeasureDefinition(@JsonProperty("measureIdentifier") final String measureIdentifier,
39-
@JsonProperty("popAttribute") final ObjQualifier popAttribute) {
50+
@JsonProperty("popAttribute") final ObjQualifier popAttribute,
51+
@JsonProperty("offset") final Integer offset) {
4052
this.measureIdentifier = measureIdentifier;
4153
this.popAttribute = popAttribute;
54+
this.offset = offset;
55+
}
56+
57+
/**
58+
* Creates new definition from given measure identifier referencing another measure in {@link Afm} and given attribute qualifier (should qualify date
59+
* attribute)
60+
*
61+
* @param measureIdentifier
62+
* measure identifier
63+
* @param popAttribute
64+
* "period over period" date attribute
65+
*/
66+
public PopMeasureDefinition(final String measureIdentifier,
67+
final ObjQualifier popAttribute) {
68+
this(measureIdentifier, popAttribute, null);
4269
}
4370

4471
@Override
4572
public MeasureDefinition withObjUriQualifier(final UriObjQualifier qualifier) {
46-
return new PopMeasureDefinition(measureIdentifier, qualifier);
73+
return new PopMeasureDefinition(measureIdentifier, qualifier, offset);
4774
}
4875

4976
/**
@@ -62,6 +89,15 @@ public ObjQualifier getPopAttribute() {
6289
return popAttribute;
6390
}
6491

92+
/**
93+
* Returns number of periods defined via {@link #popAttribute} time interval.
94+
*
95+
* @return positive or negative number of periods or {@code null} when offset was not defined
96+
*/
97+
public Integer getOffset() {
98+
return offset;
99+
}
100+
65101
@Override
66102
public ObjQualifier getObjQualifier() {
67103
return getPopAttribute();

src/main/java/com/gooddata/md/visualization/VOPopMeasureDefinition.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
/**
1717
* Period over Period measure definition to be used within {@link Measure}
18+
*
1819
* @deprecated identical with {@link com.gooddata.executeafm.afm.PopMeasureDefinition}, see https://github.com/gooddata/gooddata-java/issues/581
1920
*/
2021
@Deprecated
@@ -27,12 +28,32 @@ public class VOPopMeasureDefinition extends com.gooddata.executeafm.afm.PopMeasu
2728

2829
/**
2930
* Creates instance of Period over Period measure definition to be used in {@link VisualizationObject}
30-
* @param measureIdentifier reference to local identifier of {@link VOSimpleMeasureDefinition} over which is PoP calculated
31-
* @param popAttribute uri to attribute used for PoP
31+
*
32+
* @param measureIdentifier
33+
* reference to local identifier of {@link VOSimpleMeasureDefinition} over which is PoP calculated
34+
* @param popAttribute
35+
* uri to attribute used for PoP
36+
* @param offset
37+
* the number of periods defined via the {@code popAttribute} time interval to the past (when value is negative) or to the future (when
38+
* value is positive)
3239
*/
3340
@JsonCreator
3441
public VOPopMeasureDefinition(@JsonProperty("measureIdentifier") final String measureIdentifier,
35-
@JsonProperty("popAttribute") final ObjQualifier popAttribute) {
42+
@JsonProperty("popAttribute") final ObjQualifier popAttribute,
43+
@JsonProperty("offset") final Integer offset) {
44+
super(measureIdentifier, popAttribute, offset);
45+
}
46+
47+
/**
48+
* Creates instance of Period over Period measure definition to be used in {@link VisualizationObject}
49+
*
50+
* @param measureIdentifier
51+
* reference to local identifier of {@link VOSimpleMeasureDefinition} over which is PoP calculated
52+
* @param popAttribute
53+
* uri to attribute used for PoP
54+
*/
55+
public VOPopMeasureDefinition(final String measureIdentifier,
56+
final ObjQualifier popAttribute) {
3657
super(measureIdentifier, popAttribute);
3758
}
3859
}

src/test/groovy/com/gooddata/executeafm/afm/PopMeasureDefinitionTest.groovy

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2007-2017, GoodData(R) Corporation. All rights reserved.
2+
* Copyright (C) 2007-2018, GoodData(R) Corporation. All rights reserved.
33
* This source code is licensed under the BSD-style license found in the
44
* LICENSE.txt file in the root directory of this source tree.
55
*/
@@ -17,39 +17,64 @@ import static spock.util.matcher.HamcrestSupport.that
1717

1818
class PopMeasureDefinitionTest extends Specification {
1919

20-
private static final String POP_MEASURE_DEFINITION_JSON = 'executeafm/afm/popMeasureDefinition.json'
20+
private static final String POP_MEASURE_JSON = 'executeafm/afm/popMeasureDefinition.json'
21+
private static final String POP_MEASURE_WITH_OFFSET_JSON = 'executeafm/afm/popMeasureDefinitionWithOffset.json'
22+
2123

2224
def "should serialize"() {
2325
expect:
24-
that new PopMeasureDefinition('mId', new UriObjQualifier('/gdc/md/projectId/obj/1')),
25-
jsonEquals(resource(POP_MEASURE_DEFINITION_JSON))
26+
that new PopMeasureDefinition('mId', new UriObjQualifier('/gdc/md/projectId/obj/1'), offset),
27+
jsonEquals(resource(expectedJsonMeasureDefinition))
28+
29+
where:
30+
offset | expectedJsonMeasureDefinition
31+
null | POP_MEASURE_JSON
32+
-2 | POP_MEASURE_WITH_OFFSET_JSON
2633
}
2734

2835
def "should deserialize"() {
2936
when:
30-
PopMeasureDefinition measure = readObjectFromResource("/$POP_MEASURE_DEFINITION_JSON", PopMeasureDefinition)
37+
PopMeasureDefinition measure = readObjectFromResource("/$jsonMeasureDefinition", PopMeasureDefinition)
3138

3239
then:
3340
measure.measureIdentifier == 'mId'
34-
(measure.popAttribute as UriObjQualifier).uri == '/gdc/md/projectId/obj/1'
41+
(measure.popAttribute as UriObjQualifier).uri == '/gdc/md/projectId/obj/1'
3542
measure.isAdHoc()
3643
measure.toString()
44+
measure.offset == expectedOffset
45+
46+
where:
47+
jsonMeasureDefinition | expectedOffset
48+
POP_MEASURE_JSON | null
49+
POP_MEASURE_WITH_OFFSET_JSON | -2
3750
}
3851

3952
def "should copy"() {
4053
when:
41-
def measure = new PopMeasureDefinition("mid", new IdentifierObjQualifier("id"))
54+
def measure = new PopMeasureDefinition("mId", new IdentifierObjQualifier("id"), inputOffset)
4255
def copy = measure.withObjUriQualifier(new UriObjQualifier("uri"))
4356

4457
then:
58+
copy.measureIdentifier == 'mId'
4559
copy.objQualifier.uri == 'uri'
60+
copy.offset == expectedOffset
61+
62+
where:
63+
inputOffset | expectedOffset
64+
null | null
65+
-2 | -2
4666
}
4767

4868
def "test serializable"() {
49-
PopMeasureDefinition measureDefinition = readObjectFromResource("/$POP_MEASURE_DEFINITION_JSON", PopMeasureDefinition)
69+
when:
70+
PopMeasureDefinition measureDefinition = readObjectFromResource("/$jsonMeasureDefinition", PopMeasureDefinition)
5071
PopMeasureDefinition deserialized = SerializationUtils.roundtrip(measureDefinition)
5172

52-
expect:
73+
then:
5374
that deserialized, jsonEquals(measureDefinition)
75+
76+
where:
77+
jsonMeasureDefinition << [POP_MEASURE_JSON, POP_MEASURE_WITH_OFFSET_JSON]
5478
}
79+
5580
}

src/test/resources/executeafm/afm/popMeasureDefinition.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
"uri": "/gdc/md/projectId/obj/1"
66
}
77
}
8-
}
8+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"popMeasure": {
3+
"measureIdentifier": "mId",
4+
"popAttribute": {
5+
"uri": "/gdc/md/projectId/obj/1"
6+
},
7+
"offset": -2
8+
}
9+
}

0 commit comments

Comments
 (0)