Skip to content

Commit e64f933

Browse files
committed
Polishing.
Replace stream() usage with for-loops where possible to reduce GC overhead. See #1008.
1 parent 3b2fd57 commit e64f933

File tree

1 file changed

+52
-44
lines changed

1 file changed

+52
-44
lines changed

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java

Lines changed: 52 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import java.beans.PropertyDescriptor;
1919
import java.util.ArrayList;
20-
import java.util.Arrays;
2120
import java.util.Collection;
2221
import java.util.Collections;
2322
import java.util.LinkedHashMap;
@@ -624,18 +623,22 @@ private static StatementBuilder<Select> createSelectAndOrder(List<Selector> sele
624623
select = QueryBuilder.selectFrom(from).all();
625624
} else {
626625

627-
List<com.datastax.oss.driver.api.querybuilder.select.Selector> mappedSelectors = selectors.stream()
628-
.map(selector -> selector.getAlias().map(it -> getSelection(selector).as(it))
629-
.orElseGet(() -> getSelection(selector)))
630-
.collect(Collectors.toList());
626+
List<com.datastax.oss.driver.api.querybuilder.select.Selector> mappedSelectors = new ArrayList<>(
627+
selectors.size());
628+
for (Selector selector : selectors) {
629+
com.datastax.oss.driver.api.querybuilder.select.Selector orElseGet = selector.getAlias()
630+
.map(it -> getSelection(selector).as(it)).orElseGet(() -> getSelection(selector));
631+
mappedSelectors.add(orElseGet);
632+
}
631633

632634
select = QueryBuilder.selectFrom(from).selectors(mappedSelectors);
633635
}
634636

635637
StatementBuilder<Select> builder = StatementBuilder.of(select);
636638

637-
builder.bind((statement, factory) -> statement
638-
.where(filter.stream().map(it -> toClause(it, factory)).collect(Collectors.toList())));
639+
builder.bind((statement, factory) -> {
640+
return statement.where(getRelations(filter, factory));
641+
});
639642

640643
if (sort.isSorted()) {
641644

@@ -655,6 +658,14 @@ private static StatementBuilder<Select> createSelectAndOrder(List<Selector> sele
655658
return builder;
656659
}
657660

661+
private static List<Relation> getRelations(Filter filter, TermFactory factory) {
662+
List<Relation> relations = new ArrayList<>();
663+
for (CriteriaDefinition criteriaDefinition : filter) {
664+
relations.add(toClause(criteriaDefinition, factory));
665+
}
666+
return relations;
667+
}
668+
658669
private static com.datastax.oss.driver.api.querybuilder.select.Selector getSelection(Selector selector) {
659670

660671
if (selector instanceof FunctionCall) {
@@ -693,11 +704,7 @@ private static StatementBuilder<com.datastax.oss.driver.api.querybuilder.update.
693704
.set(assignments);
694705

695706
}).bind((statement, factory) -> {
696-
697-
List<Relation> relations = filter.stream().map(criteriaDefinition -> toClause(criteriaDefinition, factory))
698-
.collect(Collectors.toList());
699-
700-
return statement.where(relations);
707+
return statement.where(getRelations(filter, factory));
701708
});
702709
}
703710

@@ -840,11 +847,7 @@ private StatementBuilder<Delete> delete(List<CqlIdentifier> columnNames, CqlIden
840847
}
841848

842849
return StatementBuilder.of(select.where()).bind((statement, factory) -> {
843-
844-
List<Relation> relations = filter.stream().map(criteriaDefinition -> toClause(criteriaDefinition, factory))
845-
.collect(Collectors.toList());
846-
847-
return statement.where(relations);
850+
return statement.where(getRelations(filter, factory));
848851
});
849852
}
850853

@@ -964,20 +967,9 @@ private static Relation toClause(CriteriaDefinition criteriaDefinition, TermFact
964967

965968
case IN:
966969

967-
if (predicate.getValue() instanceof List) {
968-
969-
List<Term> literals = ((List<?>) predicate.getValue()).stream().map(QueryBuilder::literal)
970-
.collect(Collectors.toList());
971-
972-
return column.in(literals);
973-
}
974-
975-
if (predicate.getValue() != null && predicate.getValue().getClass().isArray()) {
976-
977-
List<Term> literals = Arrays.stream((Object[]) predicate.getValue()).map(QueryBuilder::literal)
978-
.collect(Collectors.toList());
979-
980-
return column.in(literals);
970+
if (predicate.getValue() instanceof List
971+
|| (predicate.getValue() != null && predicate.getValue().getClass().isArray())) {
972+
return column.in(toLiterals(predicate.getValue()));
981973
}
982974

983975
return column.in(factory.create(predicate.getValue()));
@@ -1040,27 +1032,43 @@ private static Condition toCondition(CriteriaDefinition criteriaDefinition, Term
10401032

10411033
case IN:
10421034

1043-
if (predicate.getValue() instanceof List) {
1035+
if (predicate.getValue() instanceof List
1036+
|| (predicate.getValue() != null && predicate.getValue().getClass().isArray())) {
1037+
return column.in(toLiterals(predicate.getValue()));
1038+
}
10441039

1045-
List<Term> literals = ((List<?>) predicate.getValue()).stream().map(QueryBuilder::literal)
1046-
.collect(Collectors.toList());
1040+
return column.in(factory.create(predicate.getValue()));
1041+
}
10471042

1048-
return column.in(literals);
1049-
}
1043+
throw new IllegalArgumentException(String.format("Criteria %s %s %s not supported for IF Conditions", columnName,
1044+
predicate.getOperator(), predicate.getValue()));
1045+
}
10501046

1051-
if (predicate.getValue() != null && predicate.getValue().getClass().isArray()) {
1047+
static List<Term> toLiterals(@Nullable Object arrayOrList) {
10521048

1053-
List<Term> literals = Arrays.stream((Object[]) predicate.getValue()).map(QueryBuilder::literal)
1054-
.collect(Collectors.toList());
1049+
if (arrayOrList instanceof List) {
10551050

1056-
return column.in(literals);
1057-
}
1051+
List<?> list = (List<?>) arrayOrList;
1052+
List<Term> literals = new ArrayList<>(list.size());
1053+
for (Object o : list) {
1054+
literals.add(QueryBuilder.literal(o));
1055+
}
10581056

1059-
return column.in(factory.create(predicate.getValue()));
1057+
return literals;
10601058
}
10611059

1062-
throw new IllegalArgumentException(String.format("Criteria %s %s %s not supported for IF Conditions", columnName,
1063-
predicate.getOperator(), predicate.getValue()));
1060+
if (arrayOrList != null && arrayOrList.getClass().isArray()) {
1061+
1062+
Object[] array = (Object[]) arrayOrList;
1063+
List<Term> literals = new ArrayList<>(array.length);
1064+
for (Object o : array) {
1065+
literals.add(QueryBuilder.literal(o));
1066+
}
1067+
1068+
return literals;
1069+
}
1070+
1071+
return Collections.emptyList();
10641072
}
10651073

10661074
static class SimpleSelector implements com.datastax.oss.driver.api.querybuilder.select.Selector {

0 commit comments

Comments
 (0)