1 changed files with 180 additions and 0 deletions
@ -0,0 +1,180 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2017 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package org.springframework.data.mongodb.core; |
||||||
|
|
||||||
|
import org.bson.Document; |
||||||
|
import org.openjdk.jmh.annotations.Benchmark; |
||||||
|
import org.openjdk.jmh.annotations.Setup; |
||||||
|
import org.openjdk.jmh.annotations.TearDown; |
||||||
|
import org.springframework.beans.factory.annotation.Value; |
||||||
|
import org.springframework.data.annotation.Id; |
||||||
|
import org.springframework.data.mongodb.core.ExecutableFindOperation.FindOperationWithQuery; |
||||||
|
import org.springframework.data.mongodb.core.ExecutableFindOperation.TerminatingFindOperation; |
||||||
|
import org.springframework.data.mongodb.core.mapping.Field; |
||||||
|
import org.springframework.data.mongodb.core.query.BasicQuery; |
||||||
|
import org.springframework.data.mongodb.microbenchmark.AbstractMicrobenchmark; |
||||||
|
|
||||||
|
import com.mongodb.MongoClient; |
||||||
|
import com.mongodb.ServerAddress; |
||||||
|
import com.mongodb.client.MongoCollection; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Christoph Strobl |
||||||
|
*/ |
||||||
|
public class ProjectionsBenchmark extends AbstractMicrobenchmark { |
||||||
|
|
||||||
|
private static final String DB_NAME = "projections-benchmark"; |
||||||
|
private static final String COLLECTION_NAME = "projections"; |
||||||
|
|
||||||
|
private MongoTemplate template; |
||||||
|
private MongoClient client; |
||||||
|
private MongoCollection<Document> mongoCollection; |
||||||
|
|
||||||
|
private Person source; |
||||||
|
|
||||||
|
private FindOperationWithQuery<Person> asPerson; |
||||||
|
private FindOperationWithQuery<DtoProjection> asDtoProjection; |
||||||
|
private FindOperationWithQuery<ClosedProjection> asClosedProjection; |
||||||
|
private FindOperationWithQuery<OpenProjection> asOpenProjection; |
||||||
|
|
||||||
|
private TerminatingFindOperation<Person> asPersonWithFieldsRestriction; |
||||||
|
private Document fields = new Document("firstname", 1); |
||||||
|
|
||||||
|
@Setup |
||||||
|
public void setUp() { |
||||||
|
|
||||||
|
client = new MongoClient(new ServerAddress()); |
||||||
|
template = new MongoTemplate(client, DB_NAME); |
||||||
|
|
||||||
|
source = new Person(); |
||||||
|
source.firstname = "luke"; |
||||||
|
source.lastname = "skywalker"; |
||||||
|
|
||||||
|
source.address = new Address(); |
||||||
|
source.address.street = "melenium falcon 1"; |
||||||
|
source.address.city = "deathstar"; |
||||||
|
|
||||||
|
template.save(source, COLLECTION_NAME); |
||||||
|
|
||||||
|
asPerson = template.query(Person.class).inCollection(COLLECTION_NAME); |
||||||
|
asDtoProjection = template.query(Person.class).inCollection(COLLECTION_NAME).as(DtoProjection.class); |
||||||
|
asClosedProjection = template.query(Person.class).inCollection(COLLECTION_NAME).as(ClosedProjection.class); |
||||||
|
asOpenProjection = template.query(Person.class).inCollection(COLLECTION_NAME).as(OpenProjection.class); |
||||||
|
|
||||||
|
asPersonWithFieldsRestriction = template.query(Person.class).inCollection(COLLECTION_NAME) |
||||||
|
.matching(new BasicQuery(new Document(), fields)); |
||||||
|
|
||||||
|
mongoCollection = client.getDatabase(DB_NAME).getCollection(COLLECTION_NAME); |
||||||
|
} |
||||||
|
|
||||||
|
@TearDown |
||||||
|
public void tearDown() { |
||||||
|
|
||||||
|
client.dropDatabase(DB_NAME); |
||||||
|
client.close(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the baseline for comparison by using the plain MongoDB java driver api without any additional fluff. |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Benchmark // DATAMONGO-1733
|
||||||
|
public Object baseline() { |
||||||
|
return mongoCollection.find().first(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Read into the domain type including all fields. |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Benchmark // DATAMONGO-1733
|
||||||
|
public Object readIntoDomainType() { |
||||||
|
return asPerson.all(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Read into the domain type but restrict query to only return one field. |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Benchmark // DATAMONGO-1733
|
||||||
|
public Object readIntoDomainTypeRestrictingToOneField() { |
||||||
|
return asPersonWithFieldsRestriction.all(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Read into dto projection that only needs to map one field back. |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Benchmark // DATAMONGO-1733
|
||||||
|
public Object readIntoDtoProjectionWithOneField() { |
||||||
|
return asDtoProjection.all(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Read into closed interface projection. |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Benchmark // DATAMONGO-1733
|
||||||
|
public Object readIntoClosedProjectionWithOneField() { |
||||||
|
return asClosedProjection.all(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Read into an open projection backed by the mapped domain object. |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Benchmark // DATAMONGO-1733
|
||||||
|
public Object readIntoOpenProjection() { |
||||||
|
return asOpenProjection.all(); |
||||||
|
} |
||||||
|
|
||||||
|
static class Person { |
||||||
|
|
||||||
|
@Id String id; |
||||||
|
String firstname; |
||||||
|
String lastname; |
||||||
|
Address address; |
||||||
|
} |
||||||
|
|
||||||
|
static class Address { |
||||||
|
|
||||||
|
String city; |
||||||
|
String street; |
||||||
|
} |
||||||
|
|
||||||
|
static class DtoProjection { |
||||||
|
|
||||||
|
@Field("firstname") String name; |
||||||
|
} |
||||||
|
|
||||||
|
static interface ClosedProjection { |
||||||
|
|
||||||
|
String getFirstname(); |
||||||
|
} |
||||||
|
|
||||||
|
static interface OpenProjection { |
||||||
|
|
||||||
|
@Value("#{target.firstname}") |
||||||
|
String name(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue