diff --git a/.travis.yml b/.travis.yml index 867f7a177..3674991be 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,5 +42,5 @@ deploy: env: global: - - NITRITE_VERSION=2.0.0 + - NITRITE_VERSION=2.0.1 - PGP_KEY_FILE=~/secring.gpg diff --git a/gradle.properties b/gradle.properties index ea550671c..4673a7a37 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ org.gradle.jvmargs=-Xmx1024m # artifact version -nitriteVersion=2.0.0 +nitriteVersion=2.0.1 # nitrite dependency asciidoctorVersion=1.5.4 @@ -50,6 +50,7 @@ nexusStagingPlugin=0.8.0 objenesisVersion=2.6 okhttpVersion=3.6.0 orientdbVersion=2.2.10 +podamVersion=7.0.5.RELEASE propDepsPluginVersion=0.0.7 shadowPluginVersion=1.2.4 slf4jVersion=1.7.21 diff --git a/nitrite/build.gradle b/nitrite/build.gradle index a27f5aac7..7e637b156 100644 --- a/nitrite/build.gradle +++ b/nitrite/build.gradle @@ -49,7 +49,7 @@ dependencies { testCompile "joda-time:joda-time:$jodaTimeVersion" testCompile "com.squareup.okhttp3:mockwebserver:$okhttpVersion" testCompile "org.meanbean:meanbean:$meanbeanVersion" - + testCompile "uk.co.jemos.podam:podam:$podamVersion" } gradle.buildFinished { BuildResult result -> diff --git a/nitrite/src/main/java/org/dizitart/no2/Document.java b/nitrite/src/main/java/org/dizitart/no2/Document.java index 2b2bacd38..41ce446dd 100644 --- a/nitrite/src/main/java/org/dizitart/no2/Document.java +++ b/nitrite/src/main/java/org/dizitart/no2/Document.java @@ -208,7 +208,6 @@ public void remove() { } private boolean validId(Object value) { - return value instanceof Long - && Math.floor(Math.log10((long) value) + 1) == 19; + return value instanceof Long; } } diff --git a/nitrite/src/main/java/org/dizitart/no2/NitriteId.java b/nitrite/src/main/java/org/dizitart/no2/NitriteId.java index 1b3d9a6de..24b73be20 100644 --- a/nitrite/src/main/java/org/dizitart/no2/NitriteId.java +++ b/nitrite/src/main/java/org/dizitart/no2/NitriteId.java @@ -20,6 +20,7 @@ import org.dizitart.no2.exceptions.InvalidIdException; import java.io.Serializable; +import java.util.concurrent.atomic.AtomicLong; import static org.dizitart.no2.Constants.ID_PREFIX; import static org.dizitart.no2.Constants.ID_SUFFIX; @@ -43,11 +44,12 @@ @EqualsAndHashCode public final class NitriteId implements Comparable<NitriteId>, Serializable { private static final long serialVersionUID = 1477462375L; + private static final AtomicLong counter = new AtomicLong(System.nanoTime()); private Long idValue; private NitriteId() { - idValue = new ObjectId().toLong(); + idValue = counter.getAndIncrement(); } private NitriteId(Long value) { diff --git a/nitrite/src/main/java/org/dizitart/no2/mapper/JacksonMapper.java b/nitrite/src/main/java/org/dizitart/no2/mapper/JacksonMapper.java index 36a607352..8ca7ca036 100644 --- a/nitrite/src/main/java/org/dizitart/no2/mapper/JacksonMapper.java +++ b/nitrite/src/main/java/org/dizitart/no2/mapper/JacksonMapper.java @@ -57,6 +57,7 @@ public <T> Document asDocumentInternal(T object) { JsonNode node = objectMapper.convertValue(object, JsonNode.class); return loadDocument(node); } catch (IllegalArgumentException iae) { + log.error("Error while converting object to document ", iae); if (iae.getCause() instanceof JsonMappingException) { JsonMappingException jme = (JsonMappingException) iae.getCause(); if (jme.getCause() instanceof StackOverflowError) { @@ -73,12 +74,12 @@ public <T> T asObjectInternal(Document document, Class<T> type) { try { return getObjectMapper().convertValue(document, type); } catch (IllegalArgumentException iae) { + log.error("Error while converting document to object ", iae); if (iae.getCause() instanceof JsonMappingException) { JsonMappingException jme = (JsonMappingException) iae.getCause(); if (jme.getMessage().contains("Can not construct instance")) { throw new ObjectMappingException(errorMessage( - "no default parameter-less constructor found for " - + type.getName(), OME_NO_DEFAULT_CTOR)); + jme.getMessage(), OME_NO_DEFAULT_CTOR)); } } throw iae; @@ -125,6 +126,7 @@ public Document parse(String json) { JsonNode node = objectMapper.readValue(json, JsonNode.class); return loadDocument(node); } catch (IOException e) { + log.error("Error while parsing json", e); throw new ObjectMappingException(errorMessage("failed to parse json " + json, OME_PARSE_JSON_FAILED)); } @@ -137,6 +139,7 @@ public String toJson(Object object) { getObjectMapper().writeValue(stringWriter, object); return stringWriter.toString(); } catch (IOException e) { + log.error("Error while serializing object to json", e); throw new ObjectMappingException(JSON_SERIALIZATION_FAILED); } } diff --git a/nitrite/src/test/java/org/dizitart/no2/NitriteStressTest.java b/nitrite/src/test/java/org/dizitart/no2/NitriteStressTest.java new file mode 100644 index 000000000..51212a8f7 --- /dev/null +++ b/nitrite/src/test/java/org/dizitart/no2/NitriteStressTest.java @@ -0,0 +1,170 @@ +package org.dizitart.no2; + +import org.dizitart.no2.objects.Id; +import org.dizitart.no2.objects.ObjectRepository; +import org.junit.Test; +import uk.co.jemos.podam.api.PodamFactory; +import uk.co.jemos.podam.api.PodamFactoryImpl; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlSchemaType; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Anindya Chatterjee + */ +public class NitriteStressTest { + private PodamFactory podamFactory = new PodamFactoryImpl(); + + private static final int TEST_SET_COUNT = 15000; + private Nitrite database; + private ObjectRepository<TestDto> testRepository; + + @Test + public void stressTest() { + database = Nitrite.builder().openOrCreate(); + testRepository = database.getRepository(TestDto.class); + testRepository.createIndex("lastName", IndexOptions.indexOptions(IndexType.Fulltext)); + testRepository.createIndex("birthDate", IndexOptions.indexOptions(IndexType.NonUnique)); + + int counter = 0; + try { + for (TestDto testDto : createTestSet()) { + testRepository.insert(testDto); + counter++; + } + } catch (Throwable t) { + System.err.println("Crashed after " + counter + " records"); + throw t; + } + } + + private List<TestDto> createTestSet() { + List<TestDto> testData = new ArrayList<>(); + for (int i = 0; i < TEST_SET_COUNT; i++) { + TestDto testRecords = podamFactory.manufacturePojo(TestDto.class); + testData.add(testRecords); + } + return testData; + } + + public class TestDto { + + @XmlElement( + name = "StudentNumber", + required = true + ) + @Id + protected String studentNumber; + + @XmlElement( + name = "LastName", + required = true + ) + protected String lastName; + + @XmlElement( + name = "Prefixes" + ) + protected String prefixes; + + @XmlElement( + name = "Initials", + required = true + ) + protected String initials; + + @XmlElement( + name = "FirstNames" + ) + protected String firstNames; + @XmlElement( + name = "Nickname" + ) + protected String nickName; + + @XmlElement( + name = "BirthDate", + required = true + ) + @XmlSchemaType( + name = "date" + ) + protected String birthDate; + + + public TestDto() { + } + + + public String getStudentNumber() { + return this.studentNumber; + } + + + public void setStudentNumber(String value) { + this.studentNumber = value; + } + + + public String getLastName() { + return this.lastName; + } + + + public void setLastName(String value) { + this.lastName = value; + } + + + public String getPrefixes() { + return this.prefixes; + } + + + public void setPrefixes(String value) { + this.prefixes = value; + } + + + public String getInitials() { + return this.initials; + } + + + public void setInitials(String value) { + this.initials = value; + } + + + public String getFirstNames() { + return this.firstNames; + } + + + public void setFirstNames(String value) { + this.firstNames = value; + } + + + public String getNickName() { + return this.nickName; + } + + + public void setNickName(String value) { + this.nickName = value; + } + + + public String getBirthDate() { + return this.birthDate; + } + + + public void setBirthDate(String value) { + this.birthDate = value; + } + } +}