Skip to content

Commit e81b230

Browse files
committed
Modified IdChangePipe to accept nested literals as ids
IdChangePipe now allows to specify a nested literal name (by separating the entity names with dots such as "grandpa.parent.id_literal"). Additionally, a keepIdLiteral flag has been introduced to control whether the id literal is kept in the output or not.
1 parent 43c52c3 commit e81b230

File tree

2 files changed

+90
-35
lines changed

2 files changed

+90
-35
lines changed

src/main/java/org/culturegraph/mf/stream/pipe/IdChangePipe.java

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.culturegraph.mf.stream.pipe;
1717

1818
import org.culturegraph.mf.framework.DefaultStreamPipe;
19+
import org.culturegraph.mf.framework.DefaultStreamReceiver;
1920
import org.culturegraph.mf.framework.StreamReceiver;
2021
import org.culturegraph.mf.framework.annotations.Description;
2122
import org.culturegraph.mf.framework.annotations.In;
@@ -25,9 +26,9 @@
2526
/**
2627
* Changes the record id to the value of the _id literal if present in the
2728
* record.
28-
*
29+
*
2930
* @author Markus Michael Geipel
30-
*
31+
*
3132
*/
3233
@Description("By default changes the record id to the value of the '_id' literal (if present). Use the contructor to choose another literal as id source.")
3334
@In(StreamReceiver.class)
@@ -36,18 +37,21 @@ public final class IdChangePipe extends DefaultStreamPipe<StreamReceiver> {
3637

3738
private String idName = StreamConstants.ID;
3839
private final StreamBuffer streamBuffer = new StreamBuffer();
40+
private final StreamFlattener streamFlattener = new StreamFlattener();
41+
private final DefaultStreamReceiver dummyReceiver = new DefaultStreamReceiver();
3942
private String currentIdentifier;
4043
private String originalIdentifier;
41-
private int depth;
4244
private boolean keepIdless = true;
45+
private boolean keepIdLiteral;
4346

4447
public IdChangePipe() {
45-
super();
48+
this(StreamConstants.ID);
4649
}
4750

4851
public IdChangePipe(final String idName) {
4952
super();
5053
setIdName(idName);
54+
streamFlattener.setReceiver(dummyReceiver);
5155
}
5256

5357
public void setIdName(final String idName) {
@@ -58,12 +62,16 @@ public void setKeepIdless(final boolean keepIdless) {
5862
this.keepIdless = keepIdless;
5963
}
6064

65+
public void setKeepIdLiteral(final boolean keepIdLiteral) {
66+
this.keepIdLiteral = keepIdLiteral;
67+
}
68+
6169
@Override
6270
public void startRecord(final String identifier) {
6371
assert !isClosed();
6472
currentIdentifier = null;
6573
originalIdentifier = identifier;
66-
depth = 0;
74+
streamFlattener.startRecord(identifier);
6775
}
6876

6977
@Override
@@ -79,28 +87,35 @@ public void endRecord() {
7987
getReceiver().endRecord();
8088
}
8189
streamBuffer.clear();
90+
streamFlattener.endRecord();
8291
}
8392

8493
@Override
8594
public void startEntity(final String name) {
8695
streamBuffer.startEntity(name);
87-
++depth;
96+
streamFlattener.startEntity(name);
8897
}
8998

9099
@Override
91100
public void endEntity() {
92101
streamBuffer.endEntity();
93-
--depth;
94-
102+
streamFlattener.endEntity();
95103
}
96104

97105
@Override
98106
public void literal(final String name, final String value) {
99-
if (depth == 0 && idName.equals(name)) {
107+
String path = streamFlattener.getCurrentPath();
108+
if (!path.isEmpty()) {
109+
path += ".";
110+
}
111+
path += name;
112+
if (idName.equals(path)) {
100113
currentIdentifier = value;
101-
} else {
102-
streamBuffer.literal(name, value);
114+
if (!keepIdLiteral) {
115+
return;
116+
}
103117
}
118+
streamBuffer.literal(name, value);
104119
}
105120

106121
@Override

src/test/java/org/culturegraph/mf/stream/pipe/IdChangePipeTest.java

Lines changed: 64 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
/**
3232
* Tests for {@link IdChangePipe}.
33-
*
33+
*
3434
* @author Christoph Böhme
3535
*
3636
*/
@@ -43,44 +43,42 @@ public final class IdChangePipeTest {
4343
private static final String ENTITY = "En";
4444
private static final String LITERAL_NAME = "Li";
4545
private static final String LITERAL_VALUE = "Va";
46-
46+
4747
private IdChangePipe idChangePipe;
48-
48+
4949
@Mock
5050
private StreamReceiver receiver;
51-
51+
5252
@Before
5353
public void setup() {
5454
MockitoAnnotations.initMocks(this);
5555
idChangePipe = new IdChangePipe();
5656
idChangePipe.setReceiver(receiver);
5757
}
58-
58+
5959
@After
6060
public void cleanup() {
6161
idChangePipe.closeStream();
6262
}
63-
63+
6464
@Test
6565
public void testShouldChangeIdsOfRecords() {
6666
idChangePipe.startRecord(OLD_RECORD_ID1);
6767
idChangePipe.literal(StreamConstants.ID, NEW_RECORD_ID1);
6868
idChangePipe.endRecord();
69-
69+
7070
idChangePipe.startRecord(OLD_RECORD_ID2);
7171
idChangePipe.literal(StreamConstants.ID, NEW_RECORD_ID2);
7272
idChangePipe.endRecord();
73-
73+
7474
final InOrder ordered = inOrder(receiver);
7575
ordered.verify(receiver).startRecord(NEW_RECORD_ID1);
76-
//ordered.verify(receiver).literal(StreamConstants.ID, NEW_RECORD_ID1);
7776
ordered.verify(receiver).endRecord();
78-
77+
7978
ordered.verify(receiver).startRecord(NEW_RECORD_ID2);
80-
//ordered.verify(receiver).literal(StreamConstants.ID, NEW_RECORD_ID2);
8179
ordered.verify(receiver).endRecord();
8280
}
83-
81+
8482
@Test
8583
public void testShouldKeepRecordsWithoutIdLiteral() {
8684
idChangePipe.startRecord(OLD_RECORD_ID1);
@@ -89,13 +87,12 @@ public void testShouldKeepRecordsWithoutIdLiteral() {
8987
idChangePipe.startRecord(OLD_RECORD_ID2);
9088
idChangePipe.literal(StreamConstants.ID, NEW_RECORD_ID2);
9189
idChangePipe.endRecord();
92-
90+
9391
final InOrder ordered = inOrder(receiver);
9492
ordered.verify(receiver).startRecord(OLD_RECORD_ID1);
9593
ordered.verify(receiver).literal(LITERAL_NAME, LITERAL_VALUE);
9694
ordered.verify(receiver).endRecord();
9795
ordered.verify(receiver).startRecord(NEW_RECORD_ID2);
98-
//ordered.verify(receiver).literal(StreamConstants.ID, NEW_RECORD_ID2);
9996
ordered.verify(receiver).endRecord();
10097
}
10198

@@ -109,42 +106,85 @@ public void testShouldRemoveRecordsWithoutIdLiteral() {
109106
idChangePipe.startRecord(OLD_RECORD_ID2);
110107
idChangePipe.literal(StreamConstants.ID, NEW_RECORD_ID2);
111108
idChangePipe.endRecord();
112-
109+
113110
final InOrder ordered = inOrder(receiver);
114111
ordered.verify(receiver).startRecord(NEW_RECORD_ID2);
115-
//ordered.verify(receiver).literal(StreamConstants.ID, NEW_RECORD_ID2);
116112
ordered.verify(receiver).endRecord();
117113
verifyNoMoreInteractions(receiver);
118114
}
119-
115+
120116
@Test
121117
public void testShouldNotUseNestedIdLiteralAsNewId() {
122118
idChangePipe.startRecord(OLD_RECORD_ID1);
123119
idChangePipe.startEntity(ENTITY);
124120
idChangePipe.literal(StreamConstants.ID, NEW_RECORD_ID1);
125121
idChangePipe.endEntity();
126122
idChangePipe.endRecord();
127-
123+
128124
final InOrder ordered = inOrder(receiver);
129125
ordered.verify(receiver).startRecord(OLD_RECORD_ID1);
130126
ordered.verify(receiver).startEntity(ENTITY);
131127
ordered.verify(receiver).literal(StreamConstants.ID, NEW_RECORD_ID1);
132128
ordered.verify(receiver).endEntity();
133129
ordered.verify(receiver).endRecord();
134130
}
135-
136-
@Test
131+
132+
@Test
133+
public void testShouldAcceptFullPathAsNewId() {
134+
idChangePipe.setIdName(ENTITY + "." + StreamConstants.ID);
135+
136+
idChangePipe.startRecord(OLD_RECORD_ID1);
137+
idChangePipe.startEntity(ENTITY);
138+
idChangePipe.literal(StreamConstants.ID, NEW_RECORD_ID1);
139+
idChangePipe.endEntity();
140+
idChangePipe.endRecord();
141+
142+
final InOrder ordered = inOrder(receiver);
143+
ordered.verify(receiver).startRecord(NEW_RECORD_ID1);
144+
ordered.verify(receiver).startEntity(ENTITY);
145+
ordered.verify(receiver).endEntity();
146+
ordered.verify(receiver).endRecord();
147+
}
148+
149+
@Test
150+
public void testShouldNotKeepIdLiteralByDefault() {
151+
idChangePipe.setIdName(StreamConstants.ID);
152+
153+
idChangePipe.startRecord(OLD_RECORD_ID1);
154+
idChangePipe.literal(StreamConstants.ID, NEW_RECORD_ID1);
155+
idChangePipe.endRecord();
156+
157+
final InOrder ordered = inOrder(receiver);
158+
ordered.verify(receiver).startRecord(NEW_RECORD_ID1);
159+
ordered.verify(receiver).endRecord();
160+
verifyNoMoreInteractions(receiver);
161+
}
162+
163+
@Test
164+
public void testShouldKeepIdLiteralIfConfigured() {
165+
idChangePipe.setIdName(StreamConstants.ID);
166+
idChangePipe.setKeepIdLiteral(true);
167+
168+
idChangePipe.startRecord(OLD_RECORD_ID1);
169+
idChangePipe.literal(StreamConstants.ID, NEW_RECORD_ID1);
170+
idChangePipe.endRecord();
171+
172+
final InOrder ordered = inOrder(receiver);
173+
ordered.verify(receiver).startRecord(NEW_RECORD_ID1);
174+
ordered.verify(receiver).literal(StreamConstants.ID, NEW_RECORD_ID1);
175+
ordered.verify(receiver).endRecord();
176+
}
177+
178+
@Test
137179
public void testShouldUseLastIdLiteralAsNewId() {
138180
idChangePipe.startRecord(OLD_RECORD_ID1);
139181
idChangePipe.literal(StreamConstants.ID, NEW_RECORD_ID1);
140182
idChangePipe.literal(StreamConstants.ID, NEW_RECORD_ID2);
141183
idChangePipe.endRecord();
142-
184+
143185
final InOrder ordered = inOrder(receiver);
144186
ordered.verify(receiver).startRecord(NEW_RECORD_ID2);
145-
//ordered.verify(receiver).literal(StreamConstants.ID, NEW_RECORD_ID1);
146-
//ordered.verify(receiver).literal(StreamConstants.ID, NEW_RECORD_ID2);
147187
ordered.verify(receiver).endRecord();
148188
}
149-
189+
150190
}

0 commit comments

Comments
 (0)