Browse Source

Initialize lists with size where possible.

Closes #3941
Original pull request: #3974.
pull/4170/head
Christoph Strobl 4 years ago committed by Mark Paluch
parent
commit
09b2afa79d
No known key found for this signature in database
GPG Key ID: 4406B84C1661DCD1
  1. 8
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CountQuery.java
  2. 3
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultIndexOperations.java
  3. 7
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java
  4. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java
  5. 13
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConditionalOperators.java
  6. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java
  7. 4
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java
  8. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GeoNearOperation.java
  9. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java
  10. 6
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java
  11. 10
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
  12. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java
  13. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java
  14. 13
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java

8
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CountQuery.java

@ -176,16 +176,20 @@ class CountQuery {
Document $geoWithinMin = new Document("$geoWithin", Document $geoWithinMin = new Document("$geoWithin",
new Document(spheric ? "$centerSphere" : "$center", $centerMin)); new Document(spheric ? "$centerSphere" : "$center", $centerMin));
List<Document> criteria = new ArrayList<>(); List<Document> criteria;
if ($and != null) { if ($and != null) {
if ($and instanceof Collection) { if ($and instanceof Collection) {
criteria.addAll((Collection) $and); Collection andElements = (Collection) $and;
criteria = new ArrayList<>(andElements.size() + 2);
criteria.addAll(andElements);
} else { } else {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Cannot rewrite query as it contains an '$and' element that is not a Collection: Offending element: " "Cannot rewrite query as it contains an '$and' element that is not a Collection: Offending element: "
+ $and); + $and);
} }
} else {
criteria = new ArrayList<>(2);
} }
criteria.add(new Document("$nor", Collections.singletonList(new Document(key, $geoWithinMin)))); criteria.add(new Document("$nor", Collections.singletonList(new Document(key, $geoWithinMin))));

3
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultIndexOperations.java

@ -172,7 +172,8 @@ public class DefaultIndexOperations implements IndexOperations {
private List<IndexInfo> getIndexData(MongoCursor<Document> cursor) { private List<IndexInfo> getIndexData(MongoCursor<Document> cursor) {
List<IndexInfo> indexInfoList = new ArrayList<>(); int available = cursor.available();
List<IndexInfo> indexInfoList = available > 0 ? new ArrayList<>(available) : new ArrayList<>();
while (cursor.hasNext()) { while (cursor.hasNext()) {

7
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java

@ -945,7 +945,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
DocumentCallback<GeoResult<T>> callback = new GeoNearResultDocumentCallback<>(distanceField, DocumentCallback<GeoResult<T>> callback = new GeoNearResultDocumentCallback<>(distanceField,
new ProjectingReadCallback<>(mongoConverter, projection, collection), near.getMetric()); new ProjectingReadCallback<>(mongoConverter, projection, collection), near.getMetric());
List<GeoResult<T>> result = new ArrayList<>(); List<GeoResult<T>> result = new ArrayList<>(results.getMappedResults().size());
BigDecimal aggregate = BigDecimal.ZERO; BigDecimal aggregate = BigDecimal.ZERO;
for (Document element : results) { for (Document element : results) {
@ -1311,7 +1311,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
Assert.notNull(writer, "MongoWriter must not be null"); Assert.notNull(writer, "MongoWriter must not be null");
List<Document> documentList = new ArrayList<>(); List<Document> documentList = new ArrayList<>(batchToSave.size());
List<T> initializedBatchToSave = new ArrayList<>(batchToSave.size()); List<T> initializedBatchToSave = new ArrayList<>(batchToSave.size());
for (T uninitialized : batchToSave) { for (T uninitialized : batchToSave) {
@ -2717,7 +2717,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
.initiateFind(getAndPrepareCollection(doGetDatabase(), collectionName), collectionCallback::doInCollection) .initiateFind(getAndPrepareCollection(doGetDatabase(), collectionName), collectionCallback::doInCollection)
.iterator()) { .iterator()) {
List<T> result = new ArrayList<>(); int available = cursor.available();
List<T> result = available > 0 ? new ArrayList<>(available) : new ArrayList<>();
while (cursor.hasNext()) { while (cursor.hasNext()) {
Document object = cursor.next(); Document object = cursor.next();

2
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java

@ -1474,7 +1474,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
LOGGER.debug(String.format("Inserting list of Documents containing %d items", dbDocList.size())); LOGGER.debug(String.format("Inserting list of Documents containing %d items", dbDocList.size()));
} }
List<Document> documents = new ArrayList<>(); List<Document> documents = new ArrayList<>(dbDocList.size());
return execute(collectionName, collection -> { return execute(collectionName, collection -> {

13
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConditionalOperators.java

@ -649,10 +649,7 @@ public class ConditionalOperators {
if (value instanceof CriteriaDefinition) { if (value instanceof CriteriaDefinition) {
Document mappedObject = context.getMappedObject(((CriteriaDefinition) value).getCriteriaObject()); Document mappedObject = context.getMappedObject(((CriteriaDefinition) value).getCriteriaObject());
List<Object> clauses = new ArrayList<Object>(); List<Object> clauses = getClauses(context, mappedObject);
clauses.addAll(getClauses(context, mappedObject));
return clauses.size() == 1 ? clauses.get(0) : clauses; return clauses.size() == 1 ? clauses.get(0) : clauses;
} }
@ -679,7 +676,9 @@ public class ConditionalOperators {
if (predicate instanceof List) { if (predicate instanceof List) {
List<Object> args = new ArrayList<Object>(); List<?> predicates = (List<?>) predicate;
List<Object> args = new ArrayList<Object>(predicates.size());
for (Object clause : (List<?>) predicate) { for (Object clause : (List<?>) predicate) {
if (clause instanceof Document) { if (clause instanceof Document) {
args.addAll(getClauses(context, (Document) clause)); args.addAll(getClauses(context, (Document) clause));
@ -697,14 +696,14 @@ public class ConditionalOperators {
continue; continue;
} }
List<Object> args = new ArrayList<Object>(); List<Object> args = new ArrayList<Object>(2);
args.add("$" + key); args.add("$" + key);
args.add(nested.get(s)); args.add(nested.get(s));
clauses.add(new Document(s, args)); clauses.add(new Document(s, args));
} }
} else if (!isKeyword(key)) { } else if (!isKeyword(key)) {
List<Object> args = new ArrayList<Object>(); List<Object> args = new ArrayList<Object>(2);
args.add("$" + key); args.add("$" + key);
args.add(predicate); args.add(predicate);
clauses.add(new Document("$eq", args)); clauses.add(new Document("$eq", args));

2
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java

@ -110,7 +110,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
private static ExposedFields createFields(Fields fields, boolean synthetic) { private static ExposedFields createFields(Fields fields, boolean synthetic) {
Assert.notNull(fields, "Fields must not be null"); Assert.notNull(fields, "Fields must not be null");
List<ExposedField> result = new ArrayList<ExposedField>(); List<ExposedField> result = new ArrayList<ExposedField>(fields.size());
for (Field field : fields) { for (Field field : fields) {
result.add(new ExposedField(field, synthetic)); result.add(new ExposedField(field, synthetic));

4
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java

@ -167,6 +167,10 @@ public final class Fields implements Iterable<Field> {
return result; return result;
} }
public int size() {
return fields.size();
}
@Nullable @Nullable
public Field getField(String name) { public Field getField(String name) {

2
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GeoNearOperation.java

@ -114,7 +114,7 @@ public class GeoNearOperation implements AggregationOperation {
Document command = toDocument(context); Document command = toDocument(context);
Number limit = (Number) command.get("$geoNear", Document.class).remove("num"); Number limit = (Number) command.get("$geoNear", Document.class).remove("num");
List<Document> stages = new ArrayList<>(); List<Document> stages = new ArrayList<>(3);
stages.add(command); stages.add(command);
if (nearQuery.getSkip() != null && nearQuery.getSkip() > 0) { if (nearQuery.getSkip() != null && nearQuery.getSkip() > 0) {

2
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java

@ -126,7 +126,7 @@ public class DefaultDbRefResolver extends DefaultReferenceResolver implements Db
List<Document> result = mongoCollection // List<Document> result = mongoCollection //
.find(new Document(BasicMongoPersistentProperty.ID_FIELD_NAME, new Document("$in", ids))) // .find(new Document(BasicMongoPersistentProperty.ID_FIELD_NAME, new Document("$in", ids))) //
.into(new ArrayList<>()); .into(new ArrayList<>(ids.size()));
return ids.stream() // return ids.stream() //
.flatMap(id -> documentWithId(id, result)) // .flatMap(id -> documentWithId(id, result)) //

6
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java

@ -418,7 +418,7 @@ abstract class GeoConverters {
return null; return null;
} }
List<Object> argument = new ArrayList<>(); List<Object> argument = new ArrayList<>(2);
Shape shape = source.getShape(); Shape shape = source.getShape();
@ -438,7 +438,9 @@ abstract class GeoConverters {
} else if (shape instanceof Polygon) { } else if (shape instanceof Polygon) {
for (Point point : ((Polygon) shape).getPoints()) { List<Point> points = ((Polygon) shape).getPoints();
argument = new ArrayList(points.size());
for (Point point : points) {
argument.add(toList(point)); argument.add(toList(point));
} }

10
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java

@ -1000,14 +1000,14 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
.getPointer(); .getPointer();
}).collect(Collectors.toList()); }).collect(Collectors.toList());
return writeCollectionInternal(targetCollection, TypeInformation.of(DocumentPointer.class), new ArrayList<>()); return writeCollectionInternal(targetCollection, TypeInformation.of(DocumentPointer.class), new ArrayList<>(targetCollection.size()));
} }
if (property.hasExplicitWriteTarget()) { if (property.hasExplicitWriteTarget()) {
return writeCollectionInternal(collection, new FieldTypeInformation<>(property), new ArrayList<>()); return writeCollectionInternal(collection, new FieldTypeInformation<>(property), new ArrayList<>(collection.size()));
} }
return writeCollectionInternal(collection, property.getTypeInformation(), new ArrayList<>()); return writeCollectionInternal(collection, property.getTypeInformation(), new ArrayList<>(collection.size()));
} }
List<Object> dbList = new ArrayList<>(collection.size()); List<Object> dbList = new ArrayList<>(collection.size());
@ -1092,7 +1092,9 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
collection.add(getPotentiallyConvertedSimpleWrite(element, collection.add(getPotentiallyConvertedSimpleWrite(element,
componentType != null ? componentType.getType() : Object.class)); componentType != null ? componentType.getType() : Object.class));
} else if (element instanceof Collection || elementType.isArray()) { } else if (element instanceof Collection || elementType.isArray()) {
collection.add(writeCollectionInternal(BsonUtils.asCollection(element), componentType, new ArrayList<>()));
Collection<?> objects = BsonUtils.asCollection(element);
collection.add(writeCollectionInternal(objects, componentType, new ArrayList<>(objects.size())));
} else { } else {
Document document = new Document(); Document document = new Document();
writeInternal(element, document, componentType); writeInternal(element, document, componentType);

2
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java

@ -373,7 +373,7 @@ public class QueryMapper {
if (keyword.isOrOrNor() || (keyword.hasIterableValue() && !keyword.isGeometry())) { if (keyword.isOrOrNor() || (keyword.hasIterableValue() && !keyword.isGeometry())) {
Iterable<?> conditions = keyword.getValue(); Iterable<?> conditions = keyword.getValue();
List<Object> newConditions = new ArrayList<>(); List<Object> newConditions = conditions instanceof Collection ? new ArrayList<>(((Collection<?>) conditions).size()) : new ArrayList<>();
for (Object condition : conditions) { for (Object condition : conditions) {
newConditions.add(isDocument(condition) ? getMappedObject((Document) condition, entity) newConditions.add(isDocument(condition) ? getMappedObject((Document) condition, entity)

2
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java

@ -337,7 +337,7 @@ public class Criteria implements CriteriaDefinition {
* @see <a href="https://docs.mongodb.com/manual/reference/operator/query/mod/">MongoDB Query operator: $mod</a> * @see <a href="https://docs.mongodb.com/manual/reference/operator/query/mod/">MongoDB Query operator: $mod</a>
*/ */
public Criteria mod(Number value, Number remainder) { public Criteria mod(Number value, Number remainder) {
List<Object> l = new ArrayList<Object>(); List<Object> l = new ArrayList<Object>(2);
l.add(value); l.add(value);
l.add(remainder); l.add(remainder);
criteria.put("$mod", l); criteria.put("$mod", l);

13
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java

@ -165,8 +165,10 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
if (property.isAssociation()) { if (property.isAssociation()) {
if (next.getClass().isArray() || next instanceof Iterable) { if (next.getClass().isArray() || next instanceof Iterable) {
List<DBRef> dbRefs = new ArrayList<DBRef>(); Collection<?> values = asCollection(next);
for (Object element : asCollection(next)) {
List<DBRef> dbRefs = new ArrayList<DBRef>(values.size());
for (Object element : values) {
dbRefs.add(writer.toDBRef(element, property)); dbRefs.add(writer.toDBRef(element, property));
} }
@ -196,11 +198,14 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
if (source instanceof Iterable) { if (source instanceof Iterable) {
List<Object> result = new ArrayList<Object>(); if(source instanceof Collection) {
return new ArrayList<>((Collection<?>) source);
}
List<Object> result = new ArrayList<>();
for (Object element : (Iterable<?>) source) { for (Object element : (Iterable<?>) source) {
result.add(element); result.add(element);
} }
return result; return result;
} }

Loading…
Cancel
Save