diff --git a/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/inmemory/InMemoryEntityInstanceCollection.java b/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/inmemory/InMemoryEntityInstanceCollection.java index 6a3db164..87e73471 100644 --- a/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/inmemory/InMemoryEntityInstanceCollection.java +++ b/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/inmemory/InMemoryEntityInstanceCollection.java @@ -147,7 +147,7 @@ EntityInstance addInstance(EntityInstance instance) { // should only do this if we actually add the item AutoIncrement counter = counters.get(autoIncrementFieldSet); if (counter.peekNextValue() - < instance.getFieldValue(autoIncrementFieldSet).asInteger()) { + <= instance.getFieldValue(autoIncrementFieldSet).asInteger()) { counter.incrementToNextAbove( instance.getFieldValue(autoIncrementFieldSet).asInteger()); } diff --git a/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/inmemory/InMemoryThingStore.java b/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/inmemory/InMemoryThingStore.java index ae4a70a6..2305ba97 100644 --- a/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/inmemory/InMemoryThingStore.java +++ b/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/inmemory/InMemoryThingStore.java @@ -282,7 +282,10 @@ void setNextIdCountersToAccomodate( if (field != null && field.getType() == FieldType.AUTO_INCREMENT) { AutoIncrement counter = countersFor(entity).get(field.getName()); if (counter != null) { - counter.incrementToNextAbove(Integer.parseInt(fieldNameValue.value)); + int value = Integer.parseInt(fieldNameValue.value); + if (counter.peekNextValue() <= value) { + counter.incrementToNextAbove(value); + } } } } diff --git a/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/sqlite/SqliteThingStore.java b/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/sqlite/SqliteThingStore.java index 9b1171bc..4d550388 100644 --- a/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/sqlite/SqliteThingStore.java +++ b/ercoremodel/src/main/java/uk/co/compendiumdev/thingifier/core/repository/sqlite/SqliteThingStore.java @@ -518,7 +518,10 @@ void setNextIdCountersToAccomodate( Field field = entity.getField(fieldNameValue.getName()); if (field != null && field.getType() == FieldType.AUTO_INCREMENT) { AutoIncrement counter = counterFor(entity, field); - counter.incrementToNextAbove(Integer.parseInt(fieldNameValue.value)); + int value = Integer.parseInt(fieldNameValue.value); + if (counter.peekNextValue() <= value) { + counter.incrementToNextAbove(value); + } } } ensureSchemaReady(); @@ -600,7 +603,7 @@ && countInstances(entity) >= entity.getMaxInstanceLimit()) { for (String fieldName : explicitAutoIncrementFields) { AutoIncrement counter = countersFor(entity).get(fieldName); int value = instance.getFieldValue(fieldName).asInteger(); - if (counter.peekNextValue() < value) { + if (counter.peekNextValue() <= value) { counter.incrementToNextAbove(value); } } diff --git a/ercoremodel/src/test/java/uk/co/compendiumdev/thingifier/core/repository/ThingStoreContractTest.java b/ercoremodel/src/test/java/uk/co/compendiumdev/thingifier/core/repository/ThingStoreContractTest.java index 49c3fc6c..fe0c7282 100644 --- a/ercoremodel/src/test/java/uk/co/compendiumdev/thingifier/core/repository/ThingStoreContractTest.java +++ b/ercoremodel/src/test/java/uk/co/compendiumdev/thingifier/core/repository/ThingStoreContractTest.java @@ -208,6 +208,21 @@ public void sqliteRepositoryGeneratesAutoIdsThroughTheContract() { } } + @Test + public void inMemoryRepositoryAccommodatesRestoredAutoIdsInAnyOrder() { + ThingStore repository = new InMemoryThingStore(EntityRelModel.DEFAULT_DATABASE_NAME); + + exerciseRestoredAutoIdAccommodation(repository); + } + + @Test + public void sqliteRepositoryAccommodatesRestoredAutoIdsInAnyOrder() { + try (ThingStore repository = + SqliteThingStore.inMemory(EntityRelModel.DEFAULT_DATABASE_NAME)) { + exerciseRestoredAutoIdAccommodation(repository); + } + } + @Test public void sqliteRepositoryThrowsTypedMaxInstanceLimitFailure() { ERSchema schema = ticketSchema(1); @@ -831,6 +846,26 @@ private void exerciseAutoIdGeneration(final ThingStore repository) { Assertions.assertEquals("26", ticketAfterExplicit.getPrimaryKeyValue()); } + private void exerciseRestoredAutoIdAccommodation(final ThingStore repository) { + ERSchema schema = autoIdSchema(); + repository.administration().initializeFrom(schema); + + EntityDefinition ticket = schema.getEntityDefinitionNamed("ticket"); + String[] restoredIds = {"4", "9", "8", "3", "6", "2", "10", "5", "7", "1"}; + for (String restoredId : restoredIds) { + repository + .entities() + .create( + EntityInstanceDraft.forEntity(ticket) + .withProtectedField("id", restoredId)); + } + + EntityInstance ticketAfterRestore = + repository.entities().create(EntityInstanceDraft.forEntity(ticket)); + + Assertions.assertEquals("11", ticketAfterRestore.getPrimaryKeyValue()); + } + private void exerciseMandatoryRelationshipValidationAndCascade(final ThingStore repository) { ERSchema schema = mandatoryRelationshipSchema(); repository.administration().initializeFrom(schema); diff --git a/thingifier/src/test/java/uk/co/compendiumdev/casestudy/todomanager/http_api/JsonRequestResponseTest.java b/thingifier/src/test/java/uk/co/compendiumdev/casestudy/todomanager/http_api/JsonRequestResponseTest.java index fcbc3936..9d1e6801 100644 --- a/thingifier/src/test/java/uk/co/compendiumdev/casestudy/todomanager/http_api/JsonRequestResponseTest.java +++ b/thingifier/src/test/java/uk/co/compendiumdev/casestudy/todomanager/http_api/JsonRequestResponseTest.java @@ -208,6 +208,7 @@ public void canPostAndCreateAnItemWithJson() { // header should give me the guid String guid = response.getHeaders().get(ApiResponse.PRIMARY_KEY_HEADER); + String location = response.getHeaders().get("Location"); final EntityInstance aTodo = todoManager @@ -216,6 +217,7 @@ public void canPostAndCreateAnItemWithJson() { .findByPrimaryKey(todo, guid); Assertions.assertEquals("title from json", aTodo.getFieldValue("title").asString()); + Assertions.assertEquals("/todos/" + guid, location); Assertions.assertTrue( response.getBody().startsWith("{\"guid\":\""), "Should have returned json");