Skip to content

Commit fd96d45

Browse files
committed
QuaQue is now on Iterator
1 parent d3ad657 commit fd96d45

File tree

4 files changed

+165
-80
lines changed

4 files changed

+165
-80
lines changed

.github/workflows/integration-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on:
44
push:
55
branches:
66
- '*'
7-
- '!master'
7+
- '!main'
88

99
jobs:
1010
test:
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package fr.cnrs.liris.jpugetgil.converg;
2+
3+
import org.apache.jena.datatypes.xsd.XSDDatatype;
4+
import org.apache.jena.graph.Node;
5+
import org.apache.jena.graph.NodeFactory;
6+
import org.apache.jena.sparql.core.Var;
7+
import org.apache.jena.sparql.engine.binding.Binding;
8+
import org.apache.jena.sparql.engine.binding.BindingBuilder;
9+
10+
import java.sql.ResultSet;
11+
import java.sql.ResultSetMetaData;
12+
import java.sql.SQLException;
13+
import java.sql.Types;
14+
import java.util.*;
15+
import java.util.function.Consumer;
16+
17+
public class BindingIterator implements Iterator<Binding> {
18+
private final ResultSet resultSet;
19+
private final ResultSetMetaData rsmd;
20+
private final List<String> allVariables = new ArrayList<>();
21+
private final List<String> variables = new ArrayList<>();
22+
private final Set<Var> vars = new HashSet<>();
23+
24+
public BindingIterator(ResultSet resultSet) throws SQLException {
25+
this.resultSet = resultSet;
26+
this.rsmd = resultSet.getMetaData();
27+
buildAllVariablesAndVariables();
28+
}
29+
30+
public Set<Var> getVars() {
31+
return vars;
32+
}
33+
34+
@Override
35+
public Binding next() {
36+
try {
37+
resultSet.next();
38+
39+
BindingBuilder bindingBuilder = Binding.builder();
40+
41+
for (String v : variables) {
42+
Var variable = Var.alloc(v);
43+
Node variableValue;
44+
45+
try {
46+
if (hasColumn(resultSet, "name$" + v) && resultSet.getString("name$" + v) != null) {
47+
String value = resultSet.getString("name$" + v);
48+
String valueType;
49+
if (allVariables.contains("type$" + v)) {
50+
valueType = resultSet.getString("type$" + v);
51+
} else {
52+
valueType = getAssociatedRDFType(rsmd.getColumnType(resultSet.findColumn("name$" + v)));
53+
}
54+
variableValue = valueType == null ?
55+
NodeFactory.createURI(value) : NodeFactory.createLiteral(value, NodeFactory.getType(valueType));
56+
} else if (hasColumn(resultSet, v) && resultSet.getString(v) != null) {
57+
String value = resultSet.getString(v);
58+
String valueType = getAssociatedRDFType(rsmd.getColumnType(resultSet.findColumn(v)));
59+
variableValue = NodeFactory.createLiteral(value, NodeFactory.getType(valueType));
60+
} else {
61+
variableValue = null;
62+
}
63+
} catch (SQLException e) {
64+
throw new RuntimeException(e);
65+
}
66+
67+
if (variableValue != null) {
68+
bindingBuilder.add(variable, variableValue);
69+
}
70+
}
71+
72+
return bindingBuilder.build();
73+
} catch (SQLException e) {
74+
throw new RuntimeException(e);
75+
}
76+
}
77+
78+
/**
79+
* @return true if the iteration has more elements
80+
*/
81+
@Override
82+
public boolean hasNext() {
83+
try {
84+
boolean hasNext = !resultSet.isLast();
85+
86+
if (!hasNext) {
87+
resultSet.close();
88+
}
89+
return hasNext;
90+
} catch (SQLException e) {
91+
throw new RuntimeException(e);
92+
}
93+
}
94+
95+
/**
96+
*
97+
*/
98+
@Override
99+
public void remove() {
100+
Iterator.super.remove();
101+
}
102+
103+
/**
104+
* @param action The action to be performed for each element
105+
*/
106+
@Override
107+
public void forEachRemaining(Consumer<? super Binding> action) {
108+
while (hasNext()) {
109+
action.accept(next());
110+
}
111+
}
112+
113+
private void buildAllVariablesAndVariables() throws SQLException {
114+
int nbColumns = rsmd.getColumnCount();
115+
for (int i = 1; i <= nbColumns; i++) {
116+
String columnName = rsmd.getColumnName(i);
117+
allVariables.add(columnName);
118+
119+
if (columnName.startsWith("name$")) {
120+
String variableName = columnName.substring(5);
121+
variables.add(variableName);
122+
Var var = Var.alloc(variableName);
123+
vars.add(var);
124+
} else if (!columnName.startsWith("type$")) {
125+
variables.add(columnName);
126+
Var var = Var.alloc(columnName);
127+
vars.add(var);
128+
}
129+
}
130+
}
131+
132+
private boolean hasColumn(java.sql.ResultSet rs, String columnName) {
133+
try {
134+
rs.findColumn(columnName);
135+
return true;
136+
} catch (SQLException e) {
137+
return false;
138+
}
139+
}
140+
141+
private String getAssociatedRDFType(int sqlType) {
142+
// Implement this method to map SQL types to RDF types
143+
// For example:
144+
switch (sqlType) {
145+
case Types.INTEGER:
146+
return XSDDatatype.XSDinteger.getURI();
147+
case Types.VARCHAR:
148+
return XSDDatatype.XSDstring.getURI();
149+
// Add more cases as needed
150+
default:
151+
return null;
152+
}
153+
}
154+
}

quads-query/src/main/java/fr/cnrs/liris/jpugetgil/converg/SPARQLLanguageTranslator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import org.slf4j.Logger;
77
import org.slf4j.LoggerFactory;
88

9+
import java.sql.SQLException;
10+
911

1012
public abstract class SPARQLLanguageTranslator {
1113

quads-query/src/main/java/fr/cnrs/liris/jpugetgil/converg/SPARQLtoSQLTranslator.java

Lines changed: 8 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -67,68 +67,20 @@ public ResultSet translateAndExecSelect(Query query) {
6767
log.info("[Measure] (Query translation duration): {} ns for query: {};", end - start, query);
6868
log.info("Query result: {};", qu.getSql());
6969

70-
Long startExec = System.nanoTime();
71-
try (java.sql.ResultSet rs = jdbcConnection.executeSQL(qu.getSql())) {
70+
try {
71+
Long startExec = System.nanoTime();
72+
java.sql.ResultSet rs = jdbcConnection.executeSQL(qu.getSql());
7273
Long endExec = System.nanoTime();
7374
log.info("[Measure] (Query execution duration): {} ns for query: {};", endExec - startExec, query);
7475

75-
// Change the List implementation to the Iterator one (heap space)
76-
Set<Var> vars = new HashSet<>();
77-
List<Binding> bindings = new ArrayList<>();
78-
79-
while (Objects.requireNonNull(rs).next()) {
80-
ResultSetMetaData rsmd = rs.getMetaData();
81-
List<String> allVariables = new ArrayList<>();
82-
List<String> variables = new ArrayList<>();
83-
int nbColumns = rsmd.getColumnCount();
84-
for (int i = 1; i <= nbColumns; i++) {
85-
String columnName = rsmd.getColumnName(i);
86-
allVariables.add(columnName);
87-
if (columnName.startsWith("name$")) {
88-
variables.add(columnName.substring(5));
89-
} else if (!columnName.startsWith("type$")) {
90-
variables.add(columnName);
91-
}
92-
}
93-
94-
BindingBuilder bindingBuilder = Binding.builder();
95-
for (String v : variables) {
96-
Var variable = Var.alloc(v);
97-
Node variableValue;
98-
99-
if (hasColumn(rs, "name$" + v) && rs.getString("name$" + v) != null) {
100-
String value = rs.getString("name$" + v);
101-
String valueType;
102-
if (allVariables.contains("type$" + v)) {
103-
valueType = rs.getString("type$" + v);
104-
} else {
105-
valueType = getAssociatedRDFType(rsmd.getColumnType(rs.findColumn("name$" + v)));
106-
}
107-
variableValue = valueType == null ?
108-
NodeFactory.createURI(value) : NodeFactory.createLiteral(value, NodeFactory.getType(valueType));
109-
} else if (hasColumn(rs, v) && rs.getString(v) != null) {
110-
String value = rs.getString(v);
111-
String valueType = getAssociatedRDFType(rsmd.getColumnType(rs.findColumn(v)));
112-
variableValue = NodeFactory.createLiteral(value, NodeFactory.getType(valueType));
113-
} else {
114-
variableValue = null;
115-
}
116-
117-
vars.add(variable);
118-
119-
if (variableValue != null) {
120-
bindingBuilder.add(variable, variableValue);
121-
}
122-
}
123-
124-
bindings.add(bindingBuilder.build());
125-
}
76+
BindingIterator bindingIterator = new BindingIterator(rs);
12677

127-
return ResultSetStream.create(new ArrayList<>(vars), bindings.iterator());
78+
Set<Var> vars = bindingIterator
79+
.getVars();
12880

81+
return ResultSetStream.create(new ArrayList<>(vars), bindingIterator);
12982
} catch (SQLException e) {
130-
log.error(e.getMessage());
131-
throw new ARQException(e);
83+
throw new RuntimeException(e);
13284
}
13385
}
13486

@@ -260,27 +212,4 @@ private SQLContext addURIsToContext(OpBGP opBGP, SQLContext context) {
260212

261213
return context;
262214
}
263-
264-
private boolean hasColumn(java.sql.ResultSet rs, String columnName) throws SQLException {
265-
try {
266-
rs.findColumn(columnName);
267-
return true;
268-
} catch (SQLException e) {
269-
return false;
270-
}
271-
}
272-
273-
private String getAssociatedRDFType(int sqlType) {
274-
// Implement this method to map SQL types to RDF types
275-
// For example:
276-
switch (sqlType) {
277-
case Types.INTEGER:
278-
return XSDDatatype.XSDinteger.getURI();
279-
case Types.VARCHAR:
280-
return XSDDatatype.XSDstring.getURI();
281-
// Add more cases as needed
282-
default:
283-
return null;
284-
}
285-
}
286215
}

0 commit comments

Comments
 (0)