(cOOl6n_>-kW0}LPeuV?O
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
KenyZ}F8>D_cpsbq
delta 4065
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
+{
+ private IMendixObject instance;
+ private String member;
+ private String value;
+
+ public SetBinaryTextValue(IContext context, IMendixObject instance, String member, String value)
+ {
+ super(context);
+ this.instance = instance;
+ this.member = member;
+ this.value = value;
+ }
+
+ @Override
+ public Boolean executeAction() throws Exception
+ {
+ // BEGIN USER CODE
+ MendixBinary binaryMember = (MendixBinary) instance.getMember(getContext(), member);
+ binaryMember.setValue(getContext(), value.getBytes());
+
+ return true;
+ // END USER CODE
+ }
+
+ /**
+ * Returns a string representation of this action
+ */
+ @Override
+ public String toString()
+ {
+ return "SetBinaryTextValue";
+ }
+
+ // BEGIN EXTRA CODE
+ // END EXTRA CODE
+}
diff --git a/javasource/databaseconnectortest/actions/SetNullValues.java b/javasource/databaseconnectortest/actions/SetNullValues.java
new file mode 100644
index 0000000..3440930
--- /dev/null
+++ b/javasource/databaseconnectortest/actions/SetNullValues.java
@@ -0,0 +1,54 @@
+// This file was generated by Mendix Modeler.
+//
+// WARNING: Only the following code will be retained when actions are regenerated:
+// - the import list
+// - the code between BEGIN USER CODE and END USER CODE
+// - the code between BEGIN EXTRA CODE and END EXTRA CODE
+// Other code you write will be lost the next time you deploy the project.
+// Special characters, e.g., é, ö, à, etc. are supported in comments.
+
+package databaseconnectortest.actions;
+
+import com.mendix.systemwideinterfaces.core.IContext;
+import com.mendix.systemwideinterfaces.core.IMendixObject;
+import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive;
+import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive.PrimitiveType;
+import com.mendix.webui.CustomJavaAction;
+
+public class SetNullValues extends CustomJavaAction
+{
+ private IMendixObject instance;
+
+ public SetNullValues(IContext context, IMendixObject instance)
+ {
+ super(context);
+ this.instance = instance;
+ }
+
+ @Override
+ public Boolean executeAction() throws Exception
+ {
+ // BEGIN USER CODE
+ instance.getMetaObject().getMetaPrimitives().stream()
+ .filter(this::isNotBoolean)
+ .forEach(p -> instance.setValue(getContext(), p.getName(), null));
+
+ return true;
+ // END USER CODE
+ }
+
+ /**
+ * Returns a string representation of this action
+ */
+ @Override
+ public String toString()
+ {
+ return "SetNullValues";
+ }
+
+ // BEGIN EXTRA CODE
+ private boolean isNotBoolean(IMetaPrimitive primitive) {
+ return primitive.getType() != PrimitiveType.Boolean;
+ }
+ // END EXTRA CODE
+}
From 3030a9fc7f60f918cd84e8ed5382142eb23cbb79 Mon Sep 17 00:00:00 2001
From: nerush
Date: Thu, 23 Jun 2016 17:30:35 +0200
Subject: [PATCH 10/29] Fix order of columns handling.
---
.../databaseconnector/impl/JdbcConnector.java | 11 +++--
.../impl/ResultSetIterator.java | 10 +++--
.../impl/ResultSetReader.java | 4 +-
.../test/JdbcConnectorTest.java | 20 ++++++---
.../test/ResultSetIteratorTest.java | 21 ++++++---
.../test/ResultSetReaderTest.java | 45 ++++++++++++++-----
6 files changed, 78 insertions(+), 33 deletions(-)
diff --git a/javasource/databaseconnector/impl/JdbcConnector.java b/javasource/databaseconnector/impl/JdbcConnector.java
index 9831567..730a104 100644
--- a/javasource/databaseconnector/impl/JdbcConnector.java
+++ b/javasource/databaseconnector/impl/JdbcConnector.java
@@ -47,19 +47,22 @@ public Stream executeQuery(String jdbcUrl, String userName, Strin
};
Collection extends IMetaPrimitive> metaPrimitives = metaObject.getMetaPrimitives();
- List primitiveTypes = metaPrimitives.stream().map(mp -> mp.getType()).collect(Collectors.toList());
- Stream> stream = executeQuery(jdbcUrl, userName, password, primitiveTypes, sql);
+ Map columnsTypes = metaPrimitives.stream().collect(Collectors.toMap(
+ t -> t.getName(),
+ t -> t.getType()
+ ));
+ Stream> stream = executeQuery(jdbcUrl, userName, password, columnsTypes, sql);
return stream.map(toMendixObject);
}
- public Stream> executeQuery(String jdbcUrl, String userName, String password, List primitiveTypes, String sql) throws SQLException {
+ public Stream> executeQuery(String jdbcUrl, String userName, String password, Map columnsTypes, String sql) throws SQLException {
logNode.info(String.format("executeQuery: %s, %s, %s", jdbcUrl, userName, sql));
try (Connection connection = connectionManager.getConnection(jdbcUrl, userName, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery()) {
- ResultSetReader resultSetReader = new ResultSetReader(resultSet, primitiveTypes);
+ ResultSetReader resultSetReader = new ResultSetReader(resultSet, columnsTypes);
return resultSetReader.readAll().stream();
}
diff --git a/javasource/databaseconnector/impl/ResultSetIterator.java b/javasource/databaseconnector/impl/ResultSetIterator.java
index 13c6119..696df05 100644
--- a/javasource/databaseconnector/impl/ResultSetIterator.java
+++ b/javasource/databaseconnector/impl/ResultSetIterator.java
@@ -5,6 +5,7 @@
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Collectors;
@@ -22,11 +23,11 @@ public class ResultSetIterator implements Iterator {
private final ResultSet resultSet;
private final List columnInfos;
- private final List primitiveTypes;
+ private final Map columnsTypes;
- public ResultSetIterator(final ResultSet resultSet, final List primitiveTypes) {
+ public ResultSetIterator(final ResultSet resultSet, final Map columnsTypes) {
this.resultSet = resultSet;
- this.primitiveTypes = primitiveTypes;
+ this.columnsTypes = columnsTypes;
this.columnInfos = createColumnInfos(resultSet);
}
@@ -42,7 +43,8 @@ private List createColumnInfos(final ResultSet resultSet) {
private ColumnInfo getColumnInfo(int index) {
try {
- return new ColumnInfo(index, resultSet.getMetaData().getColumnName(index), primitiveTypes.get(index - 1));
+ final String columnName = resultSet.getMetaData().getColumnName(index);
+ return new ColumnInfo(index, columnName, columnsTypes.get(columnName));
} catch (Exception e) {
throw new RuntimeException(e);
}
diff --git a/javasource/databaseconnector/impl/ResultSetReader.java b/javasource/databaseconnector/impl/ResultSetReader.java
index 887001b..3bda7b8 100644
--- a/javasource/databaseconnector/impl/ResultSetReader.java
+++ b/javasource/databaseconnector/impl/ResultSetReader.java
@@ -23,8 +23,8 @@ public class ResultSetReader {
private final ResultSetIterator rsIter;
private final Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- public ResultSetReader(final ResultSet resultSet, final List primitiveTypes) {
- this.rsIter = new ResultSetIterator(resultSet, primitiveTypes);
+ public ResultSetReader(final ResultSet resultSet, final Map columnsTypes) {
+ this.rsIter = new ResultSetIterator(resultSet, columnsTypes);
}
/**
diff --git a/javasource/databaseconnectortest/test/JdbcConnectorTest.java b/javasource/databaseconnectortest/test/JdbcConnectorTest.java
index 70ff00a..e8ce76f 100644
--- a/javasource/databaseconnectortest/test/JdbcConnectorTest.java
+++ b/javasource/databaseconnectortest/test/JdbcConnectorTest.java
@@ -16,6 +16,7 @@
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
+import java.util.AbstractMap.SimpleEntry;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
@@ -60,13 +61,16 @@ public class JdbcConnectorTest {
@Mock private ResultSet resultSet;
@Mock private ResultSetMetaData resultSetMetaData;
- private IMetaObject mockIMetaObject(IMetaPrimitive.PrimitiveType... types) {
+ @InjectMocks private JdbcConnector jdbcConnector;
+
+ private IMetaObject mockIMetaObject(SimpleEntry... entries) {
IMetaObject metaObject = mock(IMetaObject.class);
when(metaObject.getName()).thenReturn(entityName);
- List metaPrimitives = Arrays.asList(types).stream().map(type -> {
+ List metaPrimitives = Arrays.asList(entries).stream().map(entry -> {
IMetaPrimitive metaPrimitive = mock(IMetaPrimitive.class);
- when(metaPrimitive.getType()).thenReturn(type);
+ when(metaPrimitive.getName()).thenReturn(entry.getKey());
+ when(metaPrimitive.getType()).thenReturn(entry.getValue());
return metaPrimitive;
}).collect(Collectors.toList());
@@ -74,7 +78,9 @@ private IMetaObject mockIMetaObject(IMetaPrimitive.PrimitiveType... types) {
return metaObject;
}
- @InjectMocks private JdbcConnector jdbcConnector;
+ private SimpleEntry entry(String name, IMetaPrimitive.PrimitiveType type) {
+ return new SimpleEntry<>(name, type);
+ }
@Test public void testStatementCreationException() throws SQLException {
Exception testException = new SQLException("Test Exception Text");
@@ -141,7 +147,7 @@ private IMetaObject mockIMetaObject(IMetaPrimitive.PrimitiveType... types) {
when(resultSet.getBoolean(anyInt())).thenReturn(true);
when(resultSet.next()).thenReturn(true, true, true, true, false);
- IMetaObject metaObject = mockIMetaObject(Boolean, Boolean);
+ IMetaObject metaObject = mockIMetaObject(entry("a", Boolean), entry("b", Boolean));
Stream result = jdbcConnector.executeQuery(jdbcUrl, userName, password, metaObject, sqlQuery, context);
assertEquals(4, result.count());
@@ -177,7 +183,7 @@ private IMetaObject mockIMetaObject(IMetaPrimitive.PrimitiveType... types) {
when(resultSet.getString(1)).thenReturn(row1Value1, row2Value1);
when(resultSet.getString(2)).thenReturn(row1Value2, row2Value2);
- IMetaObject metaObject = mockIMetaObject(String, String);
+ IMetaObject metaObject = mockIMetaObject(entry(columnName1, String), entry(columnName2, String));
Stream result = jdbcConnector.executeQuery(jdbcUrl, userName, password, metaObject, sqlQuery, context);
assertEquals(2, result.count());
@@ -200,7 +206,7 @@ private IMetaObject mockIMetaObject(IMetaPrimitive.PrimitiveType... types) {
when(resultSet.getMetaData()).thenReturn(resultSetMetaData);
when(resultSet.next()).thenReturn(false);
- IMetaObject metaObject = mockIMetaObject(String, String);
+ IMetaObject metaObject = mockIMetaObject(entry("a", String), entry("b", Boolean));
Stream result = jdbcConnector.executeQuery(jdbcUrl, userName, password, metaObject, sqlQuery, context);
assertEquals(0, result.count());
diff --git a/javasource/databaseconnectortest/test/ResultSetIteratorTest.java b/javasource/databaseconnectortest/test/ResultSetIteratorTest.java
index 145a2c4..996760f 100644
--- a/javasource/databaseconnectortest/test/ResultSetIteratorTest.java
+++ b/javasource/databaseconnectortest/test/ResultSetIteratorTest.java
@@ -7,8 +7,10 @@
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
+import java.util.AbstractMap.SimpleEntry;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -26,7 +28,14 @@
public class ResultSetIteratorTest {
- private final List types = Arrays.asList(String, String, String);
+ private final Map columnsTypes = Stream.of(
+ new SimpleEntry<>("a", String),
+ new SimpleEntry<>("b", String),
+ new SimpleEntry<>("c", String)
+ ).collect(Collectors.toMap(
+ (e) -> e.getKey(),
+ (e) -> e.getValue()));
+
private ResultSet mockResultSet() throws SQLException {
final ResultSet rs = mock(ResultSet.class);
@@ -42,7 +51,7 @@ private ResultSet mockResultSet() throws SQLException {
@Test
public void testColumnInfos() throws SQLException {
final ResultSet rs = mockResultSet();
- final ResultSetIterator rsi = new ResultSetIterator(rs, types);
+ final ResultSetIterator rsi = new ResultSetIterator(rs, columnsTypes);
final Stream infos = rsi.getColumnInfos();
final List actual = infos.map(ci -> ci.getIndex() + ":" + ci.getName()).collect(Collectors.toList());
final List expected = Arrays.asList("1:a", "2:b", "3:c");
@@ -53,7 +62,7 @@ public void testColumnInfos() throws SQLException {
public void testHasNext_Empty() throws SQLException {
final ResultSet rs = mockResultSet();
when(rs.next()).thenReturn(false);
- final ResultSetIterator rsi = new ResultSetIterator(rs, types);
+ final ResultSetIterator rsi = new ResultSetIterator(rs, columnsTypes);
assertFalse(rsi.hasNext());
}
@@ -61,7 +70,7 @@ public void testHasNext_Empty() throws SQLException {
public void testStream_Empty() throws SQLException {
final ResultSet rs = mockResultSet();
when(rs.next()).thenReturn(false);
- final ResultSetIterator rsi = new ResultSetIterator(rs, types);
+ final ResultSetIterator rsi = new ResultSetIterator(rs, columnsTypes);
assertEquals(0, rsi.stream().count());
}
@@ -69,7 +78,7 @@ public void testStream_Empty() throws SQLException {
public void testStream_OneRow() throws SQLException {
final ResultSet rs = mockResultSet();
when(rs.next()).thenReturn(true, false);
- final ResultSetIterator rsi = new ResultSetIterator(rs, types);
+ final ResultSetIterator rsi = new ResultSetIterator(rs, columnsTypes);
assertEquals(1, rsi.stream().count());
verify(rs, times(2)).next();
}
@@ -78,7 +87,7 @@ public void testStream_OneRow() throws SQLException {
public void testStream_TwoRows() throws SQLException {
final ResultSet rs = mockResultSet();
when(rs.next()).thenReturn(true, true, false);
- final ResultSetIterator rsi = new ResultSetIterator(rs, types);
+ final ResultSetIterator rsi = new ResultSetIterator(rs, columnsTypes);
assertEquals(2, rsi.stream().count());
verify(rs, times(3)).next();
}
diff --git a/javasource/databaseconnectortest/test/ResultSetReaderTest.java b/javasource/databaseconnectortest/test/ResultSetReaderTest.java
index cb85210..142950d 100644
--- a/javasource/databaseconnectortest/test/ResultSetReaderTest.java
+++ b/javasource/databaseconnectortest/test/ResultSetReaderTest.java
@@ -15,11 +15,14 @@
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
-import java.util.Arrays;
+import java.util.AbstractMap;
import java.util.Calendar;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import static org.junit.Assert.assertTrue;
import static com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive.PrimitiveType.*;
@@ -28,7 +31,13 @@
public class ResultSetReaderTest {
- private final List types = Arrays.asList(String, String, String);
+ private final Map columnsTypes = Stream.of(
+ new AbstractMap.SimpleEntry<>("a", String),
+ new AbstractMap.SimpleEntry<>("b", String),
+ new AbstractMap.SimpleEntry<>("c", String)
+ ).collect(Collectors.toMap(
+ (e) -> e.getKey(),
+ (e) -> e.getValue()));
private ResultSet mockResultSet() throws SQLException {
final ResultSet rs = mock(ResultSet.class);
@@ -45,7 +54,7 @@ private ResultSet mockResultSet() throws SQLException {
public void testReadAll_Empty() throws SQLException {
final ResultSet rs = mockResultSet();
when(rs.next()).thenReturn(false);
- final ResultSetReader rsr = new ResultSetReader(rs, types);
+ final ResultSetReader rsr = new ResultSetReader(rs, columnsTypes);
assertTrue(rsr.readAll().isEmpty());
}
@@ -57,7 +66,7 @@ public void testReadAll_OneRecord() throws SQLException {
when(rs.getString(2)).thenReturn("b1");
when(rs.getString(3)).thenReturn("c1");
- final ResultSetReader rsr = new ResultSetReader(rs, types);
+ final ResultSetReader rsr = new ResultSetReader(rs, columnsTypes);
final List> records = rsr.readAll();
assertEquals(1, records.size());
final Map record = records.get(0);
@@ -75,7 +84,7 @@ public void testReadAll_TwoRecord() throws SQLException {
when(rs.getString(2)).thenReturn("b1", "b2");
when(rs.getString(3)).thenReturn("c1", "c2");
- final ResultSetReader rsr = new ResultSetReader(rs, types);
+ final ResultSetReader rsr = new ResultSetReader(rs, columnsTypes);
final List> records = rsr.readAll();
assertEquals(2, records.size());
@@ -95,9 +104,19 @@ public void testReadAll_TwoRecord() throws SQLException {
@Test
public void testAllTypes() throws SQLException {
- List allTypes = Arrays.asList(Integer, AutoNumber, Long,
- Boolean, Decimal, Float, Currency,
- HashString, Enum, String, Binary, DateTime);
+ final Map allTypes = new HashMap<>();
+ allTypes.put("Integer", Integer);
+ allTypes.put("AutoNumber", AutoNumber);
+ allTypes.put("Long", Long);
+ allTypes.put("Boolean", Boolean);
+ allTypes.put("Decimal", Decimal);
+ allTypes.put("Float", Float);
+ allTypes.put("Currency", Currency);
+ allTypes.put("HashString", HashString);
+ allTypes.put("Enum", Enum);
+ allTypes.put("String", String);
+ allTypes.put("Binary", Binary);
+ allTypes.put("DateTime", DateTime);
final ResultSet rs = mock(ResultSet.class);
final ResultSetMetaData md = mock(ResultSetMetaData.class);
@@ -162,7 +181,10 @@ public void testNullResultSet() throws SQLException {
when(rs.next()).thenReturn(true, false);
when(rs.getString("String")).thenReturn(null);
- final ResultSetReader rsr = new ResultSetReader(rs, Arrays.asList(String));
+ final Map type = new HashMap<>();
+ type.put("String", String);
+
+ final ResultSetReader rsr = new ResultSetReader(rs, type);
final List> records = rsr.readAll();
assertEquals(1, records.size());
final Map record = records.get(0);
@@ -180,7 +202,10 @@ public void testNullResult() throws SQLException {
when(rs.next()).thenReturn(true, false);
when(rs.getString("String")).thenReturn(null);
- final ResultSetReader rsr = new ResultSetReader(rs, Arrays.asList(String));
+ final Map type = new HashMap<>();
+ type.put("String", String);
+
+ final ResultSetReader rsr = new ResultSetReader(rs, type);
final List> records = rsr.readAll();
assertEquals(1, records.size());
final Map record = records.get(0);
From 05963956a7cb1901115d2c84e9da63e46ddb5cc3 Mon Sep 17 00:00:00 2001
From: Jonathan Veldhuizen
Date: Thu, 23 Jun 2016 22:29:49 +0200
Subject: [PATCH 11/29] Fix PostgreSQL all-types query.
---
DatabaseConnector.mpr | Bin 888832 -> 888832 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/DatabaseConnector.mpr b/DatabaseConnector.mpr
index a841139e298a8d52a222dca07196a00abd2b9d86..11622a24b67e6ebc3abd0a1e61bcf16e77bf1e0e 100644
GIT binary patch
delta 347
zcmZozVAim}Y=ShS*+dy1I)F&$w?7_TXV-;$0cl
zB+99yBhQh_dx>Rwh8K^fu9KmuzqfIfS3$Y6pQ&$BdSqFsN1%3TR#r}EWl&~SN`=;OZO!z3UOc^Qxy3+-h)(zS=Gkq=z{}yD0kI1Zy8^N7^o1{(Ri_&);b7aI?ZY#JnNeu^#7v;D@*SR3#uL*!@9=~%7HofT
dhvy^{7+6(2T^IxyfZ%jTS4hu<-|ib1)K`46xcp(d<31+c?dBQ08<|-c
z7?}B|3ug1kFj`FC*ubN`-K2qM3$qANSm3{~^xcIgE_zHjxKaG$1Djpb1$S`EOm~>d
zA+}vFgJ&1>vIHKMX&)F_*_omln4+2eCkvi&-yZD2!^XtVz`Qb|Nt9DZN1h{<_Y%YO
zG%p@a-CPsTJg?G1v(R!AW6PWpub_yaLieDGNF$eAPfJsMpWrGBv(yUh#8NW@+p6h%
zym)#+uCti#@6EH@j9C=O76ds9i1~q-4~T7m*cOQGfH)F}qkuRW=wUV>W(Bf^rZ0TS
ztUBFb2?yKuY#*K(%o2joAd%Yc@LnNxlH2B07xw$H>7POPZF*N4kKy*T6rLvLwh*3W
HA-pyKU7c-?
From 383ba6e3bb28365d03c677b12c747d8dd2643e4e Mon Sep 17 00:00:00 2001
From: Jonathan Veldhuizen
Date: Thu, 23 Jun 2016 22:32:37 +0200
Subject: [PATCH 12/29] Simplify primitive types handling. Throw readable
exception when column name does not exist as primitive.
---
.../databaseconnector/impl/JdbcConnector.java | 17 +--
.../impl/ResultSetIterator.java | 26 +++--
.../impl/ResultSetReader.java | 9 +-
.../test/ResultSetIteratorTest.java | 54 ++++-----
.../test/ResultSetReaderTest.java | 106 +++++++++++-------
5 files changed, 117 insertions(+), 95 deletions(-)
diff --git a/javasource/databaseconnector/impl/JdbcConnector.java b/javasource/databaseconnector/impl/JdbcConnector.java
index 730a104..6c339b2 100644
--- a/javasource/databaseconnector/impl/JdbcConnector.java
+++ b/javasource/databaseconnector/impl/JdbcConnector.java
@@ -4,19 +4,14 @@
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.util.Collection;
-import java.util.List;
import java.util.Map;
import java.util.function.Function;
-import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.mendix.logging.ILogNode;
import com.mendix.systemwideinterfaces.core.IContext;
import com.mendix.systemwideinterfaces.core.IMendixObject;
import com.mendix.systemwideinterfaces.core.meta.IMetaObject;
-import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive;
-import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive.PrimitiveType;
import databaseconnector.interfaces.ConnectionManager;
import databaseconnector.interfaces.ObjectInstantiator;
@@ -46,23 +41,17 @@ public Stream executeQuery(String jdbcUrl, String userName, Strin
return obj;
};
- Collection extends IMetaPrimitive> metaPrimitives = metaObject.getMetaPrimitives();
- Map columnsTypes = metaPrimitives.stream().collect(Collectors.toMap(
- t -> t.getName(),
- t -> t.getType()
- ));
-
- Stream> stream = executeQuery(jdbcUrl, userName, password, columnsTypes, sql);
+ Stream> stream = executeQuery(jdbcUrl, userName, password, metaObject, sql);
return stream.map(toMendixObject);
}
- public Stream> executeQuery(String jdbcUrl, String userName, String password, Map columnsTypes, String sql) throws SQLException {
+ public Stream> executeQuery(String jdbcUrl, String userName, String password, IMetaObject metaObject, String sql) throws SQLException {
logNode.info(String.format("executeQuery: %s, %s, %s", jdbcUrl, userName, sql));
try (Connection connection = connectionManager.getConnection(jdbcUrl, userName, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery()) {
- ResultSetReader resultSetReader = new ResultSetReader(resultSet, columnsTypes);
+ ResultSetReader resultSetReader = new ResultSetReader(resultSet, metaObject);
return resultSetReader.readAll().stream();
}
diff --git a/javasource/databaseconnector/impl/ResultSetIterator.java b/javasource/databaseconnector/impl/ResultSetIterator.java
index 696df05..0f22c7b 100644
--- a/javasource/databaseconnector/impl/ResultSetIterator.java
+++ b/javasource/databaseconnector/impl/ResultSetIterator.java
@@ -5,7 +5,6 @@
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Collectors;
@@ -13,7 +12,8 @@
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
-import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive.PrimitiveType;
+import com.mendix.systemwideinterfaces.core.meta.IMetaObject;
+import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive;
/**
* ResultSetIterator implements {@link Iterator} interface. It wraps {@link ResultSet} into a stream for more convenient usage. Along
@@ -23,11 +23,11 @@ public class ResultSetIterator implements Iterator {
private final ResultSet resultSet;
private final List columnInfos;
- private final Map columnsTypes;
-
- public ResultSetIterator(final ResultSet resultSet, final Map columnsTypes) {
+ private final IMetaObject metaObject;
+
+ public ResultSetIterator(final ResultSet resultSet, final IMetaObject metaObject) {
this.resultSet = resultSet;
- this.columnsTypes = columnsTypes;
+ this.metaObject = metaObject;
this.columnInfos = createColumnInfos(resultSet);
}
@@ -42,12 +42,22 @@ private List createColumnInfos(final ResultSet resultSet) {
}
private ColumnInfo getColumnInfo(int index) {
+ final String columnName;
+
try {
- final String columnName = resultSet.getMetaData().getColumnName(index);
- return new ColumnInfo(index, columnName, columnsTypes.get(columnName));
+ columnName = resultSet.getMetaData().getColumnName(index);
} catch (Exception e) {
throw new RuntimeException(e);
}
+
+ final IMetaPrimitive primitive = metaObject.getMetaPrimitive(columnName);
+
+ if (primitive == null)
+ throw new RuntimeException(String.format("The entity type '%s' does not contain the primitive '%s' as specified in the query.",
+ metaObject.getName(),
+ columnName));
+
+ return new ColumnInfo(index, columnName, primitive.getType());
}
@Override
diff --git a/javasource/databaseconnector/impl/ResultSetReader.java b/javasource/databaseconnector/impl/ResultSetReader.java
index 3bda7b8..ded6edb 100644
--- a/javasource/databaseconnector/impl/ResultSetReader.java
+++ b/javasource/databaseconnector/impl/ResultSetReader.java
@@ -1,7 +1,5 @@
package databaseconnector.impl;
-import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive.PrimitiveType;
-
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
@@ -15,6 +13,8 @@
import java.util.function.Function;
import java.util.stream.Collectors;
+import com.mendix.systemwideinterfaces.core.meta.IMetaObject;
+
/**
* ResultSetReader converts a given instance of {@link ResultSet} into a list of instances of Map, with key for column name
* and value for column value.
@@ -23,8 +23,8 @@ public class ResultSetReader {
private final ResultSetIterator rsIter;
private final Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- public ResultSetReader(final ResultSet resultSet, final Map columnsTypes) {
- this.rsIter = new ResultSetIterator(resultSet, columnsTypes);
+ public ResultSetReader(final ResultSet resultSet, final IMetaObject metaObject) {
+ this.rsIter = new ResultSetIterator(resultSet, metaObject);
}
/**
@@ -56,6 +56,7 @@ private Function> curryGetColumnResult(final Result
return ci -> getColumnResult(rs, ci);
}
+ @SuppressWarnings("deprecation")
private Optional getColumnResult(final ResultSet rs, final ColumnInfo columnInfo) {
try {
final int columnIndex = columnInfo.getIndex();
diff --git a/javasource/databaseconnectortest/test/ResultSetIteratorTest.java b/javasource/databaseconnectortest/test/ResultSetIteratorTest.java
index 996760f..e111ae2 100644
--- a/javasource/databaseconnectortest/test/ResultSetIteratorTest.java
+++ b/javasource/databaseconnectortest/test/ResultSetIteratorTest.java
@@ -1,41 +1,43 @@
package databaseconnectortest.test;
-import databaseconnector.impl.ColumnInfo;
-import databaseconnector.impl.ResultSetIterator;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
-import java.util.AbstractMap.SimpleEntry;
import java.util.Arrays;
import java.util.List;
-import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive.PrimitiveType;
-
-import static com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive.PrimitiveType.String;
+import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import com.mendix.systemwideinterfaces.core.meta.IMetaObject;
+import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive;
+import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive.PrimitiveType;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import databaseconnector.impl.ColumnInfo;
+import databaseconnector.impl.ResultSetIterator;
public class ResultSetIteratorTest {
- private final Map columnsTypes = Stream.of(
- new SimpleEntry<>("a", String),
- new SimpleEntry<>("b", String),
- new SimpleEntry<>("c", String)
- ).collect(Collectors.toMap(
- (e) -> e.getKey(),
- (e) -> e.getValue()));
+ private final IMetaObject metaObject = mockMetaObject();
+ private IMetaObject mockMetaObject() {
+ final IMetaObject metaObject = mock(IMetaObject.class);
+ final IMetaPrimitive stringPrimitive = mock(IMetaPrimitive.class);
+ when(stringPrimitive.getType()).thenReturn(PrimitiveType.String);
+ when(metaObject.getMetaPrimitive("a")).thenReturn(stringPrimitive);
+ when(metaObject.getMetaPrimitive("b")).thenReturn(stringPrimitive);
+ when(metaObject.getMetaPrimitive("c")).thenReturn(stringPrimitive);
+
+ return metaObject;
+ }
private ResultSet mockResultSet() throws SQLException {
final ResultSet rs = mock(ResultSet.class);
@@ -51,7 +53,7 @@ private ResultSet mockResultSet() throws SQLException {
@Test
public void testColumnInfos() throws SQLException {
final ResultSet rs = mockResultSet();
- final ResultSetIterator rsi = new ResultSetIterator(rs, columnsTypes);
+ final ResultSetIterator rsi = new ResultSetIterator(rs, metaObject);
final Stream infos = rsi.getColumnInfos();
final List actual = infos.map(ci -> ci.getIndex() + ":" + ci.getName()).collect(Collectors.toList());
final List