From bc769a19a83042509a9de460456a912e144411bf Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 18 Feb 2022 10:46:16 +0100 Subject: [PATCH 1/2] Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-benchmarks/pom.xml | 2 +- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 0e9257f0f0..fa2aa43463 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 3.4.0-SNAPSHOT + 3.4.0-GH-3941-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index e2704a6753..9a9cda1d88 100644 --- a/spring-data-mongodb-benchmarks/pom.xml +++ b/spring-data-mongodb-benchmarks/pom.xml @@ -7,7 +7,7 @@ org.springframework.data spring-data-mongodb-parent - 3.4.0-SNAPSHOT + 3.4.0-GH-3941-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index b75f8bf624..858fbf26f7 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-mongodb-parent - 3.4.0-SNAPSHOT + 3.4.0-GH-3941-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index ca96626cc9..a69db4cb05 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 3.4.0-SNAPSHOT + 3.4.0-GH-3941-SNAPSHOT ../pom.xml From 49365236ca4e2608b59fb1dab8062ee546f64e08 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 18 Feb 2022 12:37:08 +0100 Subject: [PATCH 2/2] Initialize lists with size where possible. --- .../data/mongodb/core/CountQuery.java | 8 ++++++-- .../data/mongodb/core/DefaultIndexOperations.java | 3 ++- .../data/mongodb/core/MongoTemplate.java | 7 ++++--- .../data/mongodb/core/ReactiveMongoTemplate.java | 2 +- .../core/aggregation/ConditionalOperators.java | 13 ++++++------- .../mongodb/core/aggregation/ExposedFields.java | 2 +- .../data/mongodb/core/aggregation/Fields.java | 4 ++++ .../mongodb/core/aggregation/GeoNearOperation.java | 2 +- .../mongodb/core/convert/DefaultDbRefResolver.java | 2 +- .../data/mongodb/core/convert/GeoConverters.java | 8 +++++--- .../mongodb/core/convert/MappingMongoConverter.java | 10 ++++++---- .../data/mongodb/core/convert/QueryMapper.java | 2 +- .../data/mongodb/core/query/Criteria.java | 2 +- .../query/ConvertingParameterAccessor.java | 13 +++++++++---- 14 files changed, 48 insertions(+), 30 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CountQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CountQuery.java index debfb78e59..339155f572 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CountQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CountQuery.java @@ -176,16 +176,20 @@ private static Document createGeoWithin(String key, Document source, @Nullable O Document $geoWithinMin = new Document("$geoWithin", new Document(spheric ? "$centerSphere" : "$center", $centerMin)); - List criteria = new ArrayList<>(); + List criteria; if ($and != null) { if ($and instanceof Collection) { - criteria.addAll((Collection) $and); + Collection andElements = (Collection) $and; + criteria = new ArrayList<>(andElements.size() + 2); + criteria.addAll(andElements); } else { throw new IllegalArgumentException( "Cannot rewrite query as it contains an '$and' element that is not a Collection!: Offending element: " + $and); } + } else { + criteria = new ArrayList<>(2); } criteria.add(new Document("$nor", Collections.singletonList(new Document(key, $geoWithinMin)))); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultIndexOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultIndexOperations.java index 958d838cd1..1b006a10d3 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultIndexOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultIndexOperations.java @@ -188,7 +188,8 @@ public List doInCollection(MongoCollection collection) private List getIndexData(MongoCursor cursor) { - List indexInfoList = new ArrayList<>(); + int available = cursor.available(); + List indexInfoList = available > 0 ? new ArrayList<>(available) : new ArrayList<>(); while (cursor.hasNext()) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 3d159c6e9e..b9794b64f5 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -966,7 +966,7 @@ public GeoResults geoNear(NearQuery near, Class domainType, String col DocumentCallback> callback = new GeoNearResultDocumentCallback<>(distanceField, new ProjectingReadCallback<>(mongoConverter, projection, collection), near.getMetric()); - List> result = new ArrayList<>(); + List> result = new ArrayList<>(results.getMappedResults().size()); BigDecimal aggregate = BigDecimal.ZERO; for (Document element : results) { @@ -1327,7 +1327,7 @@ protected Collection doInsertBatch(String collectionName, Collection documentList = new ArrayList<>(); + List documentList = new ArrayList<>(batchToSave.size()); List initializedBatchToSave = new ArrayList<>(batchToSave.size()); for (T uninitialized : batchToSave) { @@ -2869,7 +2869,8 @@ private List executeFindMultiInternal(CollectionCallback result = new ArrayList<>(); + int available = cursor.available(); + List result = available > 0 ? new ArrayList<>(available) : new ArrayList<>(); while (cursor.hasNext()) { Document object = cursor.next(); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index a8a19722db..f9f2918bcd 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -1586,7 +1586,7 @@ protected Flux insertDocumentList(String collectionName, List documents = new ArrayList<>(); + List documents = new ArrayList<>(dbDocList.size()); return execute(collectionName, collection -> { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConditionalOperators.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConditionalOperators.java index c4af12d3eb..937277ceec 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConditionalOperators.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConditionalOperators.java @@ -675,10 +675,7 @@ private Object resolveCriteria(AggregationOperationContext context, Object value if (value instanceof CriteriaDefinition) { Document mappedObject = context.getMappedObject(((CriteriaDefinition) value).getCriteriaObject()); - List clauses = new ArrayList(); - - clauses.addAll(getClauses(context, mappedObject)); - + List clauses = getClauses(context, mappedObject); return clauses.size() == 1 ? clauses.get(0) : clauses; } @@ -705,7 +702,9 @@ private List getClauses(AggregationOperationContext context, String key, if (predicate instanceof List) { - List args = new ArrayList(); + List predicates = (List) predicate; + List args = new ArrayList(predicates.size()); + for (Object clause : (List) predicate) { if (clause instanceof Document) { args.addAll(getClauses(context, (Document) clause)); @@ -723,14 +722,14 @@ private List getClauses(AggregationOperationContext context, String key, continue; } - List args = new ArrayList(); + List args = new ArrayList(2); args.add("$" + key); args.add(nested.get(s)); clauses.add(new Document(s, args)); } } else if (!isKeyword(key)) { - List args = new ArrayList(); + List args = new ArrayList(2); args.add("$" + key); args.add(predicate); clauses.add(new Document("$eq", args)); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java index daba25f422..ead0547bb1 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java @@ -110,7 +110,7 @@ public static ExposedFields nonSynthetic(Fields fields) { private static ExposedFields createFields(Fields fields, boolean synthetic) { Assert.notNull(fields, "Fields must not be null!"); - List result = new ArrayList(); + List result = new ArrayList(fields.size()); for (Field field : fields) { result.add(new ExposedField(field, synthetic)); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java index e5150a3e35..b2f337bc42 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java @@ -167,6 +167,10 @@ public Fields and(Fields fields) { return result; } + public int size() { + return fields.size(); + } + @Nullable public Field getField(String name) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GeoNearOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GeoNearOperation.java index da5eae8e95..949f4533bb 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GeoNearOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GeoNearOperation.java @@ -126,7 +126,7 @@ public List toPipelineStages(AggregationOperationContext context) { Document command = toDocument(context); Number limit = (Number) command.get("$geoNear", Document.class).remove("num"); - List stages = new ArrayList<>(); + List stages = new ArrayList<>(3); stages.add(command); if (nearQuery.getSkip() != null && nearQuery.getSkip() > 0) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java index 5f1ba401b8..7dcdd77f24 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java @@ -138,7 +138,7 @@ public List bulkFetch(List refs) { List result = mongoCollection // .find(new Document(BasicMongoPersistentProperty.ID_FIELD_NAME, new Document("$in", ids))) // - .into(new ArrayList<>()); + .into(new ArrayList<>(ids.size())); return ids.stream() // .flatMap(id -> documentWithId(id, result)) // diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java index 1bde5fd5cc..f2def2293e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java @@ -464,7 +464,7 @@ public Document convert(GeoCommand source) { return null; } - List argument = new ArrayList(); + List argument = new ArrayList(2); Shape shape = source.getShape(); @@ -489,7 +489,9 @@ public Document convert(GeoCommand source) { } else if (shape instanceof Polygon) { - for (Point point : ((Polygon) shape).getPoints()) { + List points = ((Polygon) shape).getPoints(); + argument = new ArrayList(points.size()); + for (Point point : points) { argument.add(toList(point)); } @@ -824,7 +826,7 @@ static List toList(Point point) { @SuppressWarnings("unchecked") static List toListOfPoint(List listOfCoordinatePairs) { - List points = new ArrayList<>(); + List points = new ArrayList<>(listOfCoordinatePairs.size()); for (Object point : listOfCoordinatePairs) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index c58f8d1e41..ac1d992e9a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -1052,14 +1052,14 @@ protected List createCollection(Collection collection, MongoPersisten }).collect(Collectors.toList()); return writeCollectionInternal(targetCollection, ClassTypeInformation.from(DocumentPointer.class), - new ArrayList<>()); + new ArrayList<>(targetCollection.size())); } 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 dbList = new ArrayList<>(collection.size()); @@ -1144,7 +1144,9 @@ private List writeCollectionInternal(Collection source, @Nullable Typ collection.add(getPotentiallyConvertedSimpleWrite(element, componentType != null ? componentType.getType() : Object.class)); } 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 { Document document = new Document(); writeInternal(element, document, componentType); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java index ac1794b87d..efa8397854 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java @@ -376,7 +376,7 @@ protected Document getMappedKeyword(Keyword keyword, @Nullable MongoPersistentEn if (keyword.isOrOrNor() || (keyword.hasIterableValue() && !keyword.isGeometry())) { Iterable conditions = keyword.getValue(); - List newConditions = new ArrayList<>(); + List newConditions = conditions instanceof Collection ? new ArrayList<>(((Collection) conditions).size()) : new ArrayList<>(); for (Object condition : conditions) { newConditions.add(isDocument(condition) ? getMappedObject((Document) condition, entity) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java index d1ea834d9d..a08c5f6e2f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java @@ -337,7 +337,7 @@ public Criteria nin(Collection values) { * @see MongoDB Query operator: $mod */ public Criteria mod(Number value, Number remainder) { - List l = new ArrayList(); + List l = new ArrayList(2); l.add(value); l.add(remainder); criteria.put("$mod", l); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java index 14b2baa054..44f5f96cb9 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java @@ -229,8 +229,10 @@ public Object nextConverted(MongoPersistentProperty property) { if (property.isAssociation()) { if (next.getClass().isArray() || next instanceof Iterable) { - List dbRefs = new ArrayList(); - for (Object element : asCollection(next)) { + Collection values = asCollection(next); + + List dbRefs = new ArrayList(values.size()); + for (Object element : values) { dbRefs.add(writer.toDBRef(element, property)); } @@ -264,11 +266,14 @@ private static Collection asCollection(@Nullable Object source) { if (source instanceof Iterable) { - List result = new ArrayList(); + if(source instanceof Collection) { + return new ArrayList<>((Collection) source); + } + + List result = new ArrayList<>(); for (Object element : (Iterable) source) { result.add(element); } - return result; }