rsi = ResultSetIterable.getResultSetIterable(rs, rs.next() ? complicatedBuildResultSetToObject(rs) : null, cal);
*
* This way you can avoid building or sending in a ResultSetToObject all together if there are no rows, therefore if rsto
- * sent into this is null, it returns an EMPTY_RESULT_SET_ITERABLE
+ * sent into this is null, it returns an EMPTY_RESULT_SET_ITERABLE and closes rs immediately
*
* This assumes rs.next() was called once before sent into this function
*/
@SuppressWarnings("unchecked")
public static ResultSetIterable getResultSetIterable(final ResultSet rs, final ResultSetToObject rsto, final Calendar cal) {
- if (rsto == null)
+ if (rsto == null) {
+ tryClose(rs); // have to do this here...
return (ResultSetIterable) EMPTY_RESULT_SET_ITERABLE;
+ }
final ResultSetIterable ret = new ResultSetIterable(rs, rsto, cal);
ret.calledNext = true;
return ret;
}
+ /**
+ * This is a convenience method meant to be called like this, where rs is a ResultSet
+ *
+ * Stream rsi = ResultSetIterable.getStream(rs, rs.next() ? complicatedBuildResultSetToObject(rs) : null, cal);
+ *
+ * This way you can avoid building or sending in a ResultSetToObject all together if there are no rows, therefore if rsto
+ * sent into this is null, it returns an empty Stream, rs might be closed before returning the empty Stream or on .close() to the Stream
+ *
+ * The stream returned MUST be closed in a try-with-resources or finally because the ResultSet is held open until then
+ *
+ * This assumes rs.next() was called once before sent into this function
+ */
+ //IFJAVA8_START
+ @SuppressWarnings("unchecked")
+ public static Stream getStream(final ResultSet rs, final ResultSetToObject rsto, final Calendar cal) {
+ final Stream ret;
+ if (rsto == null) {
+ // todo: static object for this? don't forget to close resultset if so
+ return (Stream) StreamSupport.stream(Spliterators.emptySpliterator(), false);
+ } else {
+ final ResultSetIterable rsi = new ResultSetIterable(rs, rsto, cal);
+ rsi.calledNext = true;
+ ret = StreamSupport.stream(rsi.spliterator(), false);
+ }
+ return ret.onClose(() -> tryClose(rs));
+ }
+ //IFJAVA8_END
+
private final ResultSet rs;
private final Calendar cal;
private final ResultSetToObject rsto;
diff --git a/pom.xml b/pom.xml
index 36e211a..36e851d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -203,6 +203,7 @@
*/src/main/java/**/*
+ */src/test/java/**/*
target/**
diff --git a/querymapper/genQueryMapper.sh b/querymapper/genQueryMapper.sh
index 8058312..39de0ee 100755
--- a/querymapper/genQueryMapper.sh
+++ b/querymapper/genQueryMapper.sh
@@ -22,18 +22,22 @@ function finishFile(){
result="$(prepareFile "src/main/java/com/moparisthebest/jdbc/ResultSetMapper.java")"
# single object types
-cat src/main/java/com/moparisthebest/jdbc/ResultSetMapper.java | grep public | egrep '(toObject|toSingleMap|toResultSetIterable|toResultSetIterableMap)\(' | grep ', Calendar cal)' | while read method
+cat src/main/java/com/moparisthebest/jdbc/ResultSetMapper.java | grep public | egrep '(toObject|toSingleMap|toResultSetIterable|toStream)\(' | grep ', Calendar cal)' | while read method
do
#echo "method: $method"
method_name=$(echo $method | egrep -o '[^ ]+\(')
echo "ResultSetMapper.$method_name)"
+ [ "$method_name" == 'toStream(' ] && echo -e '\t//IFJAVA8_START\n' >> "$result"
+
cat >> "$result" <> "$result"
done
#everything else
@@ -67,6 +71,8 @@ do
method_name=$(echo $method | egrep -o '[^ ]+\(')
echo "QueryMapper.$method_name)"
+ [ "$method_name" == 'toStream(' ] && echo -e '\t//IFJAVA8_START\n' | tee -a "$query" "$caching_query" "$null_query" "$list_query" >/dev/null
+
# QueryMapper.java
cat >> "$query" <> "$query" <> "$caching_query" </dev/null
+
done
finishFile "src/main/java/com/moparisthebest/jdbc/QueryMapper.java"
diff --git a/querymapper/pom.xml b/querymapper/pom.xml
index ace85e0..00505fe 100644
--- a/querymapper/pom.xml
+++ b/querymapper/pom.xml
@@ -50,4 +50,20 @@
+
+
+ jdk16
+
+ [1.6,1.8)
+
+
+
+
+ com.google.code.maven-replacer-plugin
+ replacer
+
+
+
+
+
diff --git a/querymapper/src/main/java/com/moparisthebest/jdbc/CachingQueryMapper.java b/querymapper/src/main/java/com/moparisthebest/jdbc/CachingQueryMapper.java
index 8c71e56..0251991 100644
--- a/querymapper/src/main/java/com/moparisthebest/jdbc/CachingQueryMapper.java
+++ b/querymapper/src/main/java/com/moparisthebest/jdbc/CachingQueryMapper.java
@@ -7,6 +7,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
+//IFJAVA8_START
+import java.util.stream.Stream;
+//IFJAVA8_END
import static com.moparisthebest.jdbc.TryClose.tryClose;
@@ -145,10 +148,28 @@ public class CachingQueryMapper extends QueryMapper {
}
@Override
- public , V> ResultSetIterable