-
Notifications
You must be signed in to change notification settings - Fork 17
/
RelationInsertGenerator.java
178 lines (156 loc) · 7.75 KB
/
RelationInsertGenerator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
package generator;
import static generator.GeneratorUtil.idxOf;
import static generator.GeneratorUtil.cleanToken;
import static generator.GeneratorUtil.addAttribute;
import configuration.DataConfigEntry;
import configuration.ProcessorConfigEntry;
import graql.lang.Graql;
import graql.lang.statement.Statement;
import graql.lang.statement.StatementInstance;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
public class RelationInsertGenerator extends InsertGenerator {
private final DataConfigEntry dce;
private final ProcessorConfigEntry gce;
private static final Logger appLogger = LogManager.getLogger("com.bayer.dt.grami");
private static final Logger dataLogger = LogManager.getLogger("com.bayer.dt.grami.data");
public RelationInsertGenerator(DataConfigEntry dce, ProcessorConfigEntry processorConfigEntry) {
super();
this.dce = dce;
this.gce = processorConfigEntry;
appLogger.debug("Creating RelationInsertGenerator for " + gce.getProcessor() + " of type " + gce.getProcessorType());
}
public ArrayList<ArrayList<ArrayList<Statement>>> graknRelationInsert(ArrayList<String> rows, String header) throws Exception {
ArrayList<ArrayList<ArrayList<Statement>>> matchInsertStatements = new ArrayList<>();
ArrayList<ArrayList<Statement>> matchStatements = new ArrayList<>();
ArrayList<ArrayList<Statement>> insertStatements = new ArrayList<>();
int insertCounter = 0;
for (String row : rows) {
ArrayList<ArrayList<Statement>> tmp = graknRelationshipQueryFromRow(row, header, insertCounter);
if (tmp != null) {
if (tmp.get(0) != null && tmp.get(1) != null) {
matchStatements.add(tmp.get(0));
insertStatements.add(tmp.get(1));
insertCounter++;
}
}
}
matchInsertStatements.add(matchStatements);
matchInsertStatements.add(insertStatements);
return matchInsertStatements;
}
public ArrayList<ArrayList<Statement>> graknRelationshipQueryFromRow(String row, String header, int insertCounter) throws Exception {
String[] tokens = row.split(dce.getSeparator());
String[] headerTokens = header.split(dce.getSeparator());
appLogger.debug("processing tokenized row: " + Arrays.toString(tokens));
GeneratorUtil.malformedRow(row, tokens, headerTokens.length);
ArrayList<Statement> matchStatements = new ArrayList<>(playersMatch(tokens, headerTokens, insertCounter));
ArrayList<Statement> insertStatements = new ArrayList<>();
if (!matchStatements.isEmpty()) {
StatementInstance insert = playersInsert(matchStatements, insertCounter);
insert = relationInsert(insert);
if (dce.getAttributes() != null) {
for (DataConfigEntry.GeneratorSpecification attDataConfigEntry : dce.getAttributes()) {
insert = addAttribute(tokens, insert, headerTokens, attDataConfigEntry, gce.getAttributeGenerator(attDataConfigEntry.getGenerator()));
}
}
insertStatements.add(insert);
ArrayList<ArrayList<Statement>> queries = new ArrayList<>();
queries.add(matchStatements);
queries.add(insertStatements);
if (isValid(queries)) {
appLogger.debug("valid query: <" + assembleQuery(queries) + ">");
return queries;
} else {
dataLogger.warn("in datapath <" + dce.getDataPath() + ">: skipped row b/c does not have a proper <isa> statement or is missing required players or attributes. Faulty tokenized row: " + Arrays.toString(tokens));
return null;
}
} else {
dataLogger.warn("in datapath <" + dce.getDataPath() + ">: skipped row b/c has 0 players. Faulty tokenized row: " + Arrays.toString(tokens));
return null;
}
}
private String assembleQuery(ArrayList<ArrayList<Statement>> queries) {
StringBuilder ret = new StringBuilder();
for (Statement st : queries.get(0)) {
ret.append(st.toString());
}
ret.append(queries.get(1).get(0).toString());
return ret.toString();
}
private StatementInstance relationInsert(StatementInstance si) {
if (si != null) {
si = si.isa(gce.getSchemaType());
return si;
} else {
return null;
}
}
private StatementInstance playersInsert(ArrayList<Statement> matchStatements, int insertCounter) {
Statement s = Graql.var("rel-" + insertCounter);
int playerCounter = 0;
for (DataConfigEntry.GeneratorSpecification dataPlayer : dce.getPlayers()) {
ProcessorConfigEntry.ConceptGenerator playerGenerator = gce.getPlayerGenerator(dataPlayer.getGenerator());
boolean insert = false;
for (Statement st :matchStatements) {
//need to have player in match statement or cannot insert as player in relation
if (st.toString().contains(playerGenerator.getPlayerType())) {
insert = true;
}
}
if (insert) {
s = s.rel(playerGenerator.getRoleType(), playerGenerator.getPlayerType() + "-" + playerCounter + "-" + insertCounter);
}
playerCounter++;
}
if (s.toString().contains("(")) {
return (StatementInstance) s;
} else {
return null;
}
}
private Collection<? extends Statement> playersMatch(String[] tokens, String[] headerTokens, int insertCounter) {
ArrayList<Statement> players = new ArrayList<>();
int playerCounter = 0;
for (DataConfigEntry.GeneratorSpecification playerDataConfigEntry : dce.getPlayers()) {
ProcessorConfigEntry.ConceptGenerator playerGenerator = gce.getPlayerGenerator(playerDataConfigEntry.getGenerator());
int playerDataIndex = idxOf(headerTokens, playerDataConfigEntry);
if (tokens.length > playerDataIndex &&
!cleanToken(tokens[playerDataIndex]).isEmpty()) {
StatementInstance ms = Graql
.var(playerGenerator.getPlayerType() + "-" + playerCounter + "-" + insertCounter)
.isa(playerGenerator.getPlayerType()).has(playerGenerator.getUniquePlayerId(),
cleanToken(tokens[playerDataIndex]));
players.add(ms);
}
playerCounter++;
}
return players;
}
private boolean isValid(ArrayList<ArrayList<Statement>> si) {
ArrayList<Statement> matchStatements = si.get(0);
ArrayList<Statement> insertStatements = si.get(1);
StringBuilder matchStatement = new StringBuilder();
for (Statement st:matchStatements) {
matchStatement.append(st.toString());
}
String insertStatement = insertStatements.get(0).toString();
// missing required players
for (Map.Entry<String, ProcessorConfigEntry.ConceptGenerator> generatorEntry: gce.getRelationRequiredPlayers().entrySet()) {
if (!matchStatement.toString().contains("isa " + generatorEntry.getValue().getPlayerType())) {
return false;
}
}
// missing required attribute
for (Map.Entry<String, ProcessorConfigEntry.ConceptGenerator> generatorEntry: gce.getRequiredAttributes().entrySet()) {
if (!insertStatement.contains("has " + generatorEntry.getValue().getAttributeType())) {
return false;
}
}
return true;
}
}