Skip to content

Commit 522940d

Browse files
authored
CSV data export: include multiple entities (#201)
* CSV data export: support multiple entity * multiple entity column provider: changed column format * code cleanup --------- Co-authored-by: Stefano Ricci <SteRiccio@users.noreply.github.com>
1 parent 0ed183c commit 522940d

3 files changed

Lines changed: 85 additions & 0 deletions

File tree

collect-core/src/main/java/org/openforis/collect/io/data/csv/CSVDataExportParametersBase.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public enum OutputFormat {
1919
private boolean includeCodeItemPositionColumn = false;
2020
private boolean includeKMLColumnForCoordinates = false;
2121
private boolean includeEnumeratedEntities = false;
22+
private boolean includeMultipleEntities = false;
2223
private boolean includeCompositeAttributeMergedColumn = false;
2324
private boolean includeCodeItemLabelColumn = false;
2425
private boolean includeGroupingLabels = true;
@@ -89,6 +90,14 @@ public void setIncludeEnumeratedEntities(boolean includeEnumeratedEntities) {
8990
this.includeEnumeratedEntities = includeEnumeratedEntities;
9091
}
9192

93+
public boolean isIncludeMultipleEntities() {
94+
return includeMultipleEntities;
95+
}
96+
97+
public void setIncludeMultipleEntities(boolean includeMultipleEntities) {
98+
this.includeMultipleEntities = includeMultipleEntities;
99+
}
100+
92101
public boolean isIncludeAllAncestorAttributes() {
93102
return includeAllAncestorAttributes;
94103
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.openforis.collect.io.data.csv;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import org.openforis.collect.io.data.csv.columnProviders.AutomaticColumnProvider;
7+
import org.openforis.collect.io.data.csv.columnProviders.ColumnProvider;
8+
import org.openforis.collect.io.data.csv.columnProviders.ColumnProviderChain;
9+
import org.openforis.collect.io.data.csv.columnProviders.ColumnProviders;
10+
import org.openforis.idm.metamodel.AttributeDefinition;
11+
import org.openforis.idm.metamodel.EntityDefinition;
12+
import org.openforis.idm.model.Entity;
13+
import org.openforis.idm.model.Node;
14+
15+
/**
16+
* @author S. Ricci
17+
*/
18+
public class MultipleEntityColumnProvider extends ColumnProviderChain {
19+
20+
private static final int DEFAULT_MAX_ITEMS = 10;
21+
22+
23+
public MultipleEntityColumnProvider(CSVDataExportParameters config, EntityDefinition defn) {
24+
super(config, defn, createProviders(config, defn));
25+
}
26+
27+
private static List<ColumnProvider> createProviders(CSVDataExportParameters config, EntityDefinition defn) {
28+
List<ColumnProvider> providers = new ArrayList<ColumnProvider>();
29+
List<AttributeDefinition> keyDefs = defn.getKeyAttributeDefinitions();
30+
int maxEntities = defn.getFixedMaxCount() == null ? DEFAULT_MAX_ITEMS: defn.getFixedMaxCount();
31+
for (int entityIndex = 0; entityIndex < maxEntities; entityIndex ++) {
32+
for (AttributeDefinition keyDef : keyDefs) {
33+
String keyName = keyDef.getName();
34+
MultipleEntityKeyColumnProvider p = new MultipleEntityKeyColumnProvider(config, defn, entityIndex, keyName);
35+
providers.add(p);
36+
}
37+
}
38+
return providers;
39+
}
40+
41+
@Override
42+
protected String generateHeadingPrefix() {
43+
if (entityDefinition == null) {
44+
throw new IllegalStateException("Entity definition not specified for multiple entity column provider");
45+
}
46+
return ColumnProviders.generateHeadingPrefix(entityDefinition, config);
47+
}
48+
49+
private static class MultipleEntityKeyColumnProvider extends AutomaticColumnProvider {
50+
51+
private String keyName;
52+
private int entityIndex;
53+
54+
public MultipleEntityKeyColumnProvider(CSVDataExportParameters config, EntityDefinition defn, int entityIndex, String keyName) {
55+
super(config, "[" + (entityIndex + 1) + "]_", defn);
56+
this.entityIndex = entityIndex;
57+
this.keyName = keyName;
58+
}
59+
60+
@Override
61+
public List<Object> extractValues(Node<?> axis) {
62+
Entity parentEntity = (Entity) axis;
63+
List<Node<?>> children = parentEntity.getChildren(entityDefinition);
64+
Node<?> childEntity = entityIndex < children.size() ? children.get(entityIndex) : null;
65+
if (childEntity == null) {
66+
// not found; return empty array
67+
return super.emptyValues();
68+
}
69+
return super.extractValues(childEntity);
70+
}
71+
}
72+
}

collect-core/src/main/java/org/openforis/collect/io/data/csv/columnProviders/AutomaticColumnProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import org.openforis.collect.io.data.csv.CSVDataExportParameters;
88
import org.openforis.collect.io.data.csv.EnumerableEntityColumnProvider;
9+
import org.openforis.collect.io.data.csv.MultipleEntityColumnProvider;
910
import org.openforis.collect.metamodel.CollectAnnotations;
1011
import org.openforis.collect.model.CollectSurvey;
1112
import org.openforis.idm.metamodel.AttributeDefinition;
@@ -62,6 +63,9 @@ private static void createEntityProviders(CSVDataExportParameters config, Entity
6263
if ( defn.isEnumerable() && config.isIncludeEnumeratedEntities() ) {
6364
EnumerableEntityColumnProvider p = new EnumerableEntityColumnProvider(config, defn);
6465
cols.add(p);
66+
} else if (config.isIncludeMultipleEntities()) {
67+
MultipleEntityColumnProvider p = new MultipleEntityColumnProvider(config, defn);
68+
cols.add(p);
6569
}
6670
} else {
6771
ColumnProvider p = new AutomaticColumnProvider(config, defn);

0 commit comments

Comments
 (0)