From a8766f73f5b6c181c6ea7ca4aab5504c1a82dbf1 Mon Sep 17 00:00:00 2001 From: Thirumala Date: Sat, 28 Jun 2025 12:20:34 +0530 Subject: [PATCH] Implemented DE-695 --- .../arangodb/spring/demo/DemoApplication.java | 5 +- .../spring/demo/entity/Character.java | 3 +- .../spring/demo/runner/CrudRunner.java | 55 ++++++++++++++----- .../src/main/resources/application.properties | 3 + 4 files changed, 47 insertions(+), 19 deletions(-) create mode 100644 tutorial/src/main/resources/application.properties diff --git a/tutorial/src/main/java/com/arangodb/spring/demo/DemoApplication.java b/tutorial/src/main/java/com/arangodb/spring/demo/DemoApplication.java index e4bee91f..07483e20 100644 --- a/tutorial/src/main/java/com/arangodb/spring/demo/DemoApplication.java +++ b/tutorial/src/main/java/com/arangodb/spring/demo/DemoApplication.java @@ -19,17 +19,14 @@ */ package com.arangodb.spring.demo; - -import com.arangodb.spring.demo.runner.CrudRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; - @SpringBootApplication public class DemoApplication { public static void main(final String... args) { System.exit(SpringApplication.exit( - SpringApplication.run(CrudRunner.class, args) + SpringApplication.run(DemoApplication.class, args) )); } } diff --git a/tutorial/src/main/java/com/arangodb/spring/demo/entity/Character.java b/tutorial/src/main/java/com/arangodb/spring/demo/entity/Character.java index ea68c4fa..ec0168cc 100644 --- a/tutorial/src/main/java/com/arangodb/spring/demo/entity/Character.java +++ b/tutorial/src/main/java/com/arangodb/spring/demo/entity/Character.java @@ -28,6 +28,7 @@ public record Character( @Id String id, String name, - String surname + String surname, + Long expiresAt ) { } diff --git a/tutorial/src/main/java/com/arangodb/spring/demo/runner/CrudRunner.java b/tutorial/src/main/java/com/arangodb/spring/demo/runner/CrudRunner.java index b20d7bff..e7dbd94b 100644 --- a/tutorial/src/main/java/com/arangodb/spring/demo/runner/CrudRunner.java +++ b/tutorial/src/main/java/com/arangodb/spring/demo/runner/CrudRunner.java @@ -20,16 +20,23 @@ package com.arangodb.spring.demo.runner; +import com.arangodb.model.TtlIndexOptions; import com.arangodb.spring.demo.entity.Character; import com.arangodb.spring.demo.repository.CharacterRepository; import com.arangodb.springframework.core.ArangoOperations; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; -import org.springframework.context.annotation.ComponentScan; +import org.springframework.stereotype.Component; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Collections; +import java.util.Date; import static org.assertj.core.api.Assertions.assertThat; -@ComponentScan("com.arangodb.spring.demo") +@Component public class CrudRunner implements CommandLineRunner { @Autowired @@ -38,21 +45,41 @@ public class CrudRunner implements CommandLineRunner { @Autowired private CharacterRepository repository; + @Value("${arangodb.ddl.enabled:false}") + private boolean isDdlEnabled; + @Override public void run(String... args) { - // first drop the database so that we can run this multiple times with the same dataset - operations.dropDatabase(); + if (isDdlEnabled) { + operations.dropDatabase(); + System.out.println("Database dropped for fresh DDL operations."); + createTTLIndex(); - System.out.println("# CRUD operations"); + System.out.println("Schema validation passed."); - // save a single entity in the database - // there is no need of creating the collection first. This happen automatically - Character nedStark = new Character(null, "Ned", "Stark"); - Character saved = repository.save(nedStark); - System.out.println("Ned Stark saved in the database: " + saved); + // Set document expiration for 2 minutes from now + Long expiresAt = Instant.now().plus(2, ChronoUnit.MINUTES).getEpochSecond(); + Character nedStark = new Character(null, "John", "Williams", expiresAt); + Character saved = repository.save(nedStark); - assertThat(saved.id()).isNotNull(); - assertThat(saved.name()).isEqualTo(nedStark.name()); - assertThat(saved.surname()).isEqualTo(nedStark.surname()); + System.out.println("Saved character: " + saved); + System.out.println("Document expires at: " + new Date(saved.expiresAt() * 1000)); + System.out.println("Current time: " + new Date()); + + assertThat(saved.id()).isNotNull(); + assertThat(saved.name()).isEqualTo(nedStark.name()); + assertThat(saved.surname()).isEqualTo(nedStark.surname()); + } else { + System.out.println("DDL operations are disabled. Skipping schema creation."); + System.out.println( + "You can enable DDL operations by setting 'arangodb.ddl.enabled=true' in application.properties."); + } + } + private void createTTLIndex() { + System.out.println("Creating TTL index..."); + operations.collection(Character.class).ensureTtlIndex( + Collections.singletonList("expiresAt"), + new TtlIndexOptions().expireAfter(0)); + System.out.println(" TTL index created on 'expiresAt'."); } -} +} \ No newline at end of file diff --git a/tutorial/src/main/resources/application.properties b/tutorial/src/main/resources/application.properties new file mode 100644 index 00000000..19175dea --- /dev/null +++ b/tutorial/src/main/resources/application.properties @@ -0,0 +1,3 @@ +# ArangoDB Configuration +arangodb.ddl.enabled=false +