Skip to content

Commit 1566f4a

Browse files
committed
Added support for user-defined increments for the range-collector. Fixes
issue #90.
1 parent 3551526 commit 1566f4a

File tree

3 files changed

+100
-2
lines changed

3 files changed

+100
-2
lines changed

src/main/java/org/culturegraph/mf/morph/collectors/Range.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.culturegraph.mf.morph.collectors;
1717

18+
import java.util.Comparator;
1819
import java.util.SortedSet;
1920
import java.util.TreeSet;
2021

@@ -28,15 +29,37 @@
2829
* @author Christoph Böhme
2930
*/
3031
public final class Range extends AbstractCollect {
31-
private final SortedSet<Integer> values = new TreeSet<Integer>();
32+
private final SortedSet<Integer> values = new TreeSet<Integer>(new IncrementDependingComparator());
3233

34+
private int increment;
3335
private Integer first;
3436

37+
/**
38+
* A comparator which defines the sort order of the values in the range
39+
* depending on the increment.
40+
*/
41+
private class IncrementDependingComparator implements Comparator<Integer> {
42+
43+
@Override
44+
public int compare(final Integer o1, final Integer o2) {
45+
return Integer.signum(increment) * (o1 - o2);
46+
}
47+
48+
}
49+
3550
public Range(final Metamorph metamorph) {
3651
super(metamorph);
3752
setNamedValueReceiver(metamorph);
3853
}
3954

55+
public int getIncrement() {
56+
return increment;
57+
}
58+
59+
public void setIncrement(final int increment) {
60+
this.increment = increment;
61+
}
62+
4063
@Override
4164
protected void emit() {
4265
for (final Integer i: values) {
@@ -55,7 +78,7 @@ protected void receive(final String name, final String value, final NamedValueSo
5578
first = Integer.valueOf(value);
5679
} else {
5780
final int last = Integer.valueOf(value).intValue();
58-
for (int i = first.intValue(); i <= last; ++i) {
81+
for (int i = first.intValue(); (increment > 0 && i <= last) || (increment < 0 && i >= last); i += increment) {
5982
values.add(Integer.valueOf(i));
6083
}
6184
first = null;

src/main/resources/schemata/metamorph.xsd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@
292292
<element ref="tns:postprocess" minOccurs="0" maxOccurs="1" />
293293
</sequence>
294294
<attribute name="name" type="string" use="required" />
295+
<attribute name="increment" type="integer" use="optional" default="1" />
295296
<attribute name="reset" type="boolean" use="optional" default="false" />
296297
<attribute name="sameEntity" type="boolean" use="optional" default="false" />
297298
<attribute name="flushWith" type="string" use="optional" default="record"/>

src/test/java/org/culturegraph/mf/morph/collectors/RangeTest.xml

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,5 +160,79 @@
160160
</cgxml:cgxml>
161161
</result>
162162
</test-case>
163+
164+
<test-case name="should use user-defined increment">
165+
<input type="text/x-cg+xml">
166+
<cgxml:cgxml version="1.0">
167+
<cgxml:records>
168+
<cgxml:record id="1">
169+
<cgxml:literal name="first" value="1789" />
170+
<cgxml:literal name="last" value="1799" />
171+
</cgxml:record>
172+
</cgxml:records>
173+
</cgxml:cgxml>
174+
</input>
175+
176+
<transformation type="text/x-metamorph+xml">
177+
<mm:metamorph version="1">
178+
<mm:rules>
179+
<mm:range name="range" increment="3" flushWith="record">
180+
<mm:data source="first" />
181+
<mm:data source="last" />
182+
</mm:range>
183+
</mm:rules>
184+
</mm:metamorph>
185+
</transformation>
186+
187+
<result type="text/x-cg+xml">
188+
<cgxml:cgxml version="1.0">
189+
<cgxml:records>
190+
<cgxml:record id="1">
191+
<cgxml:literal name="range" value="1789" />
192+
<cgxml:literal name="range" value="1792" />
193+
<cgxml:literal name="range" value="1795" />
194+
<cgxml:literal name="range" value="1798" />
195+
</cgxml:record>
196+
</cgxml:records>
197+
</cgxml:cgxml>
198+
</result>
199+
</test-case>
200+
201+
<test-case name="should allow negative increments">
202+
<input type="text/x-cg+xml">
203+
<cgxml:cgxml version="1.0">
204+
<cgxml:records>
205+
<cgxml:record id="1">
206+
<cgxml:literal name="first" value="1799" />
207+
<cgxml:literal name="last" value="1789" />
208+
</cgxml:record>
209+
</cgxml:records>
210+
</cgxml:cgxml>
211+
</input>
212+
213+
<transformation type="text/x-metamorph+xml">
214+
<mm:metamorph version="1">
215+
<mm:rules>
216+
<mm:range name="range" increment="-3" flushWith="record">
217+
<mm:data source="first" />
218+
<mm:data source="last" />
219+
</mm:range>
220+
</mm:rules>
221+
</mm:metamorph>
222+
</transformation>
223+
224+
<result type="text/x-cg+xml">
225+
<cgxml:cgxml version="1.0">
226+
<cgxml:records>
227+
<cgxml:record id="1">
228+
<cgxml:literal name="range" value="1799" />
229+
<cgxml:literal name="range" value="1796" />
230+
<cgxml:literal name="range" value="1793" />
231+
<cgxml:literal name="range" value="1790" />
232+
</cgxml:record>
233+
</cgxml:records>
234+
</cgxml:cgxml>
235+
</result>
236+
</test-case>
163237

164238
</metamorph-test>

0 commit comments

Comments
 (0)