chore: rename cameleer3 to cameleer
Some checks failed
CI / cleanup-branch (push) Has been skipped
CI / build (push) Failing after 18s
CI / docker (push) Has been skipped
CI / deploy (push) Has been skipped
CI / deploy-feature (push) Has been skipped

Rename Java packages from com.cameleer3 to com.cameleer, module
directories from cameleer3-* to cameleer-*, and all references
throughout workflows, Dockerfiles, docs, migrations, and pom.xml.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-04-15 15:28:42 +02:00
parent 1077293343
commit cb3ebfea7c
569 changed files with 4356 additions and 3245 deletions

View File

@@ -16,7 +16,7 @@
### New files
**Core module** (`cameleer3-server-core/src/main/java/com/cameleer3/server/core/`):
**Core module** (`cameleer-server-core/src/main/java/com/cameleer/server/core/`):
- `storage/ExecutionStore.java` — new interface replacing ExecutionRepository
- `storage/StatsStore.java` — new interface for stats from continuous aggregates
- `storage/SearchIndex.java` — new interface for OpenSearch operations
@@ -28,7 +28,7 @@
- `indexing/SearchIndexer.java` — debounced event listener for OpenSearch indexing
- `indexing/ExecutionUpdatedEvent.java` — event published after execution write
**App module** (`cameleer3-server-app/src/main/java/com/cameleer3/server/app/`):
**App module** (`cameleer-server-app/src/main/java/com/cameleer/server/app/`):
- `storage/PostgresExecutionStore.java` — ExecutionStore impl with upsert
- `storage/PostgresStatsStore.java` — StatsStore impl querying continuous aggregates
- `storage/PostgresDiagramStore.java` — DiagramStore impl
@@ -41,7 +41,7 @@
- `ingestion/MetricsFlushScheduler.java` — scheduled metrics buffer flush (replaces ClickHouseFlushScheduler, metrics only)
- `retention/RetentionScheduler.java` — scheduled job for drop_chunks and OpenSearch index deletion
**Flyway migrations** (`cameleer3-server-app/src/main/resources/db/migration/`):
**Flyway migrations** (`cameleer-server-app/src/main/resources/db/migration/`):
- `V1__extensions.sql` — CREATE EXTENSION timescaledb, timescaledb_toolkit
- `V2__executions.sql` — executions hypertable
- `V3__processor_executions.sql` — processor_executions hypertable
@@ -53,7 +53,7 @@
Note: Retention is NOT in a Flyway migration (Flyway migrations are immutable once applied). No V9 file. Retention is handled by `RetentionScheduler` at runtime with configurable intervals.
**Test files** (`cameleer3-server-app/src/test/java/com/cameleer3/server/app/`):
**Test files** (`cameleer-server-app/src/test/java/com/cameleer/server/app/`):
- `AbstractPostgresIT.java` — replaces AbstractClickHouseIT (TimescaleDB Testcontainer)
- `storage/PostgresExecutionStoreIT.java` — upsert, dedup, chunked arrival tests
- `storage/PostgresStatsStoreIT.java` — continuous aggregate query tests
@@ -64,35 +64,35 @@ Note: Retention is NOT in a Flyway migration (Flyway migrations are immutable on
### Files to modify
- `pom.xml` (root) — no changes needed
- `cameleer3-server-app/pom.xml` — swap clickhouse-jdbc for postgresql + opensearch-java + flyway
- `cameleer3-server-core/.../core/search/SearchService.java` — split: search delegates to SearchIndex, stats/timeseries to StatsStore
- `cameleer3-server-core/.../core/detail/DetailService.java` — use ExecutionStore instead of ExecutionRepository
- `cameleer3-server-core/.../core/detail/RawExecutionRow.java` — remove (replaced by normalized model)
- `cameleer3-server-core/.../core/ingestion/IngestionService.java` — synchronous execution/diagram writes, keep buffer for metrics
- `cameleer3-server-app/.../app/config/SearchBeanConfig.java` — wire StatsStore into SearchService
- `cameleer3-server-app/.../app/config/IngestionBeanConfig.java` — update bean wiring
- `cameleer3-server-app/src/main/resources/application.yml` — PostgreSQL + OpenSearch config
- `cameleer3-server-app/src/test/resources/application-test.yml` — test config
- `cameleer-server-app/pom.xml` — swap clickhouse-jdbc for postgresql + opensearch-java + flyway
- `cameleer-server-core/.../core/search/SearchService.java` — split: search delegates to SearchIndex, stats/timeseries to StatsStore
- `cameleer-server-core/.../core/detail/DetailService.java` — use ExecutionStore instead of ExecutionRepository
- `cameleer-server-core/.../core/detail/RawExecutionRow.java` — remove (replaced by normalized model)
- `cameleer-server-core/.../core/ingestion/IngestionService.java` — synchronous execution/diagram writes, keep buffer for metrics
- `cameleer-server-app/.../app/config/SearchBeanConfig.java` — wire StatsStore into SearchService
- `cameleer-server-app/.../app/config/IngestionBeanConfig.java` — update bean wiring
- `cameleer-server-app/src/main/resources/application.yml` — PostgreSQL + OpenSearch config
- `cameleer-server-app/src/test/resources/application-test.yml` — test config
### Files to delete
- `cameleer3-server-app/.../app/storage/ClickHouseExecutionRepository.java`
- `cameleer3-server-app/.../app/storage/ClickHouseDiagramRepository.java`
- `cameleer3-server-app/.../app/storage/ClickHouseMetricsRepository.java`
- `cameleer3-server-app/.../app/storage/ClickHouseUserRepository.java`
- `cameleer3-server-app/.../app/storage/ClickHouseOidcConfigRepository.java`
- `cameleer3-server-app/.../app/search/ClickHouseSearchEngine.java`
- `cameleer3-server-app/.../app/ingestion/ClickHouseFlushScheduler.java`
- `cameleer3-server-app/.../app/config/ClickHouseConfig.java`
- `cameleer3-server-core/.../core/storage/ExecutionRepository.java`
- `cameleer3-server-core/.../core/storage/DiagramRepository.java`
- `cameleer3-server-core/.../core/storage/MetricsRepository.java`
- `cameleer3-server-core/.../core/search/SearchEngine.java`
- `cameleer3-server-core/.../core/detail/RawExecutionRow.java`
- `cameleer-server-app/.../app/storage/ClickHouseExecutionRepository.java`
- `cameleer-server-app/.../app/storage/ClickHouseDiagramRepository.java`
- `cameleer-server-app/.../app/storage/ClickHouseMetricsRepository.java`
- `cameleer-server-app/.../app/storage/ClickHouseUserRepository.java`
- `cameleer-server-app/.../app/storage/ClickHouseOidcConfigRepository.java`
- `cameleer-server-app/.../app/search/ClickHouseSearchEngine.java`
- `cameleer-server-app/.../app/ingestion/ClickHouseFlushScheduler.java`
- `cameleer-server-app/.../app/config/ClickHouseConfig.java`
- `cameleer-server-core/.../core/storage/ExecutionRepository.java`
- `cameleer-server-core/.../core/storage/DiagramRepository.java`
- `cameleer-server-core/.../core/storage/MetricsRepository.java`
- `cameleer-server-core/.../core/search/SearchEngine.java`
- `cameleer-server-core/.../core/detail/RawExecutionRow.java`
Note: `UserRepository` and `OidcConfigRepository` interfaces in `core.security` are **kept** — the new Postgres implementations implement these existing interfaces. No rename needed since their contracts are unchanged.
- `cameleer3-server-app/src/main/resources/clickhouse/*.sql` (all 8 files)
- `cameleer3-server-app/src/test/.../app/AbstractClickHouseIT.java`
- `cameleer-server-app/src/main/resources/clickhouse/*.sql` (all 8 files)
- `cameleer-server-app/src/test/.../app/AbstractClickHouseIT.java`
---
@@ -101,11 +101,11 @@ Note: `UserRepository` and `OidcConfigRepository` interfaces in `core.security`
### Task 1: Update Maven dependencies
**Files:**
- Modify: `cameleer3-server-app/pom.xml`
- Modify: `cameleer-server-app/pom.xml`
- [ ] **Step 1: Replace ClickHouse JDBC with PostgreSQL driver + Flyway + OpenSearch client**
In `cameleer3-server-app/pom.xml`, replace the ClickHouse dependency and add new ones:
In `cameleer-server-app/pom.xml`, replace the ClickHouse dependency and add new ones:
Remove:
```xml
@@ -165,22 +165,22 @@ Note: `postgresql` driver and `flyway-core` versions are managed by Spring Boot
- [ ] **Step 2: Commit** (compilation will fail until ClickHouse code is deleted in Task 16 — this is expected)
```bash
git add cameleer3-server-app/pom.xml
git add cameleer-server-app/pom.xml
git commit -m "chore: swap ClickHouse deps for PostgreSQL, Flyway, OpenSearch"
```
### Task 2: Write Flyway migrations
**Files:**
- Create: `cameleer3-server-app/src/main/resources/db/migration/V1__extensions.sql`
- Create: `cameleer3-server-app/src/main/resources/db/migration/V2__executions.sql`
- Create: `cameleer3-server-app/src/main/resources/db/migration/V3__processor_executions.sql`
- Create: `cameleer3-server-app/src/main/resources/db/migration/V4__agent_metrics.sql`
- Create: `cameleer3-server-app/src/main/resources/db/migration/V5__route_diagrams.sql`
- Create: `cameleer3-server-app/src/main/resources/db/migration/V6__users.sql`
- Create: `cameleer3-server-app/src/main/resources/db/migration/V7__oidc_config.sql`
- Create: `cameleer3-server-app/src/main/resources/db/migration/V8__continuous_aggregates.sql`
- Create: `cameleer3-server-app/src/main/resources/db/migration/V9__retention_policies.sql`
- Create: `cameleer-server-app/src/main/resources/db/migration/V1__extensions.sql`
- Create: `cameleer-server-app/src/main/resources/db/migration/V2__executions.sql`
- Create: `cameleer-server-app/src/main/resources/db/migration/V3__processor_executions.sql`
- Create: `cameleer-server-app/src/main/resources/db/migration/V4__agent_metrics.sql`
- Create: `cameleer-server-app/src/main/resources/db/migration/V5__route_diagrams.sql`
- Create: `cameleer-server-app/src/main/resources/db/migration/V6__users.sql`
- Create: `cameleer-server-app/src/main/resources/db/migration/V7__oidc_config.sql`
- Create: `cameleer-server-app/src/main/resources/db/migration/V8__continuous_aggregates.sql`
- Create: `cameleer-server-app/src/main/resources/db/migration/V9__retention_policies.sql`
- [ ] **Step 1: Create V1__extensions.sql**
@@ -405,19 +405,19 @@ SELECT add_continuous_aggregate_policy('stats_1m_processor',
- [ ] **Step 9: Commit**
```bash
git add cameleer3-server-app/src/main/resources/db/migration/
git add cameleer-server-app/src/main/resources/db/migration/
git commit -m "feat: add Flyway migrations for PostgreSQL/TimescaleDB schema"
```
### Task 3: Create test base class with TimescaleDB Testcontainer
**Files:**
- Create: `cameleer3-server-app/src/test/java/com/cameleer3/server/app/AbstractPostgresIT.java`
- Create: `cameleer-server-app/src/test/java/com/cameleer/server/app/AbstractPostgresIT.java`
- [ ] **Step 1: Write AbstractPostgresIT**
```java
package com.cameleer3.server.app;
package com.cameleer.server.app;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.DynamicPropertyRegistry;
@@ -433,7 +433,7 @@ public abstract class AbstractPostgresIT {
@Container
static final PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("timescale/timescaledb:latest-pg16")
.withDatabaseName("cameleer3")
.withDatabaseName("cameleer")
.withUsername("cameleer")
.withPassword("test");
@@ -450,12 +450,12 @@ public abstract class AbstractPostgresIT {
- [ ] **Step 2: Write a smoke test to verify migrations run**
Create `cameleer3-server-app/src/test/java/com/cameleer3/server/app/storage/FlywayMigrationIT.java`:
Create `cameleer-server-app/src/test/java/com/cameleer/server/app/storage/FlywayMigrationIT.java`:
```java
package com.cameleer3.server.app.storage;
package com.cameleer.server.app.storage;
import com.cameleer3.server.app.AbstractPostgresIT;
import com.cameleer.server.app.AbstractPostgresIT;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
@@ -493,22 +493,22 @@ class FlywayMigrationIT extends AbstractPostgresIT {
- [ ] **Step 3: Verify test passes** (this test will not compile until Task 16 deletes ClickHouse code. Run it after Task 16 is complete. Listed here for logical grouping.)
Run: `mvn test -pl cameleer3-server-app -Dtest=FlywayMigrationIT -q`
Run: `mvn test -pl cameleer-server-app -Dtest=FlywayMigrationIT -q`
Expected: PASS — all migrations apply, tables and continuous aggregates exist
- [ ] **Step 4: Commit**
```bash
git add cameleer3-server-app/src/test/java/com/cameleer3/server/app/AbstractPostgresIT.java
git add cameleer3-server-app/src/test/java/com/cameleer3/server/app/storage/FlywayMigrationIT.java
git add cameleer-server-app/src/test/java/com/cameleer/server/app/AbstractPostgresIT.java
git add cameleer-server-app/src/test/java/com/cameleer/server/app/storage/FlywayMigrationIT.java
git commit -m "test: add TimescaleDB test base class and Flyway migration smoke test"
```
### Task 4: Update application.yml for PostgreSQL + OpenSearch
**Files:**
- Modify: `cameleer3-server-app/src/main/resources/application.yml`
- Modify: `cameleer3-server-app/src/test/resources/application-test.yml`
- Modify: `cameleer-server-app/src/main/resources/application.yml`
- Modify: `cameleer-server-app/src/test/resources/application-test.yml`
- [ ] **Step 1: Update application.yml datasource section**
@@ -516,7 +516,7 @@ Replace:
```yaml
spring:
datasource:
url: jdbc:ch://localhost:8123/cameleer3
url: jdbc:ch://localhost:8123/cameleer
username: cameleer
password: cameleer_dev
driver-class-name: com.clickhouse.jdbc.ClickHouseDriver
@@ -526,7 +526,7 @@ With:
```yaml
spring:
datasource:
url: jdbc:postgresql://localhost:5432/cameleer3
url: jdbc:postgresql://localhost:5432/cameleer
username: cameleer
password: ${CAMELEER_DB_PASSWORD:cameleer_dev}
driver-class-name: org.postgresql.Driver
@@ -565,8 +565,8 @@ opensearch:
- [ ] **Step 3: Commit**
```bash
git add cameleer3-server-app/src/main/resources/application.yml
git add cameleer3-server-app/src/test/resources/application-test.yml
git add cameleer-server-app/src/main/resources/application.yml
git add cameleer-server-app/src/test/resources/application-test.yml
git commit -m "config: switch datasource to PostgreSQL, add OpenSearch and Flyway config"
```
@@ -577,18 +577,18 @@ git commit -m "config: switch datasource to PostgreSQL, add OpenSearch and Flywa
### Task 5: Create new storage interfaces in core module
**Files:**
- Create: `cameleer3-server-core/src/main/java/com/cameleer3/server/core/storage/ExecutionStore.java`
- Create: `cameleer3-server-core/src/main/java/com/cameleer3/server/core/storage/StatsStore.java`
- Create: `cameleer3-server-core/src/main/java/com/cameleer3/server/core/storage/SearchIndex.java`
- Create: `cameleer3-server-core/src/main/java/com/cameleer3/server/core/storage/DiagramStore.java`
- Create: `cameleer3-server-core/src/main/java/com/cameleer3/server/core/storage/MetricsStore.java`
- Create: `cameleer-server-core/src/main/java/com/cameleer/server/core/storage/ExecutionStore.java`
- Create: `cameleer-server-core/src/main/java/com/cameleer/server/core/storage/StatsStore.java`
- Create: `cameleer-server-core/src/main/java/com/cameleer/server/core/storage/SearchIndex.java`
- Create: `cameleer-server-core/src/main/java/com/cameleer/server/core/storage/DiagramStore.java`
- Create: `cameleer-server-core/src/main/java/com/cameleer/server/core/storage/MetricsStore.java`
- [ ] **Step 1: Create ExecutionStore interface**
```java
package com.cameleer3.server.core.storage;
package com.cameleer.server.core.storage;
import com.cameleer3.server.core.detail.ProcessorNode;
import com.cameleer.server.core.detail.ProcessorNode;
import java.time.Instant;
import java.util.List;
@@ -629,10 +629,10 @@ public interface ExecutionStore {
Supports all 4 aggregation levels: global, per-app, per-route, per-processor.
```java
package com.cameleer3.server.core.storage;
package com.cameleer.server.core.storage;
import com.cameleer3.server.core.search.ExecutionStats;
import com.cameleer3.server.core.search.StatsTimeseries;
import com.cameleer.server.core.search.ExecutionStats;
import com.cameleer.server.core.search.StatsTimeseries;
import java.time.Instant;
import java.util.List;
@@ -670,12 +670,12 @@ public interface StatsStore {
- [ ] **Step 3: Create SearchIndex interface**
```java
package com.cameleer3.server.core.storage;
package com.cameleer.server.core.storage;
import com.cameleer3.server.core.search.ExecutionSummary;
import com.cameleer3.server.core.search.SearchRequest;
import com.cameleer3.server.core.search.SearchResult;
import com.cameleer3.server.core.storage.model.ExecutionDocument;
import com.cameleer.server.core.search.ExecutionSummary;
import com.cameleer.server.core.search.SearchRequest;
import com.cameleer.server.core.search.SearchResult;
import com.cameleer.server.core.storage.model.ExecutionDocument;
public interface SearchIndex {
@@ -692,10 +692,10 @@ public interface SearchIndex {
- [ ] **Step 4: Create DiagramStore interface**
```java
package com.cameleer3.server.core.storage;
package com.cameleer.server.core.storage;
import com.cameleer3.common.graph.RouteGraph;
import com.cameleer3.server.core.ingestion.TaggedDiagram;
import com.cameleer.common.graph.RouteGraph;
import com.cameleer.server.core.ingestion.TaggedDiagram;
import java.util.List;
import java.util.Optional;
@@ -715,9 +715,9 @@ public interface DiagramStore {
- [ ] **Step 5: Create MetricsStore interface**
```java
package com.cameleer3.server.core.storage;
package com.cameleer.server.core.storage;
import com.cameleer3.server.core.storage.model.MetricsSnapshot;
import com.cameleer.server.core.storage.model.MetricsSnapshot;
import java.util.List;
@@ -730,20 +730,20 @@ public interface MetricsStore {
- [ ] **Step 6: Commit**
```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/storage/
git add cameleer-server-core/src/main/java/com/cameleer/server/core/storage/
git commit -m "feat: add new storage interfaces for PostgreSQL/OpenSearch backends"
```
### Task 6: Create ExecutionDocument model and indexing event
**Files:**
- Create: `cameleer3-server-core/src/main/java/com/cameleer3/server/core/storage/model/ExecutionDocument.java`
- Create: `cameleer3-server-core/src/main/java/com/cameleer3/server/core/indexing/ExecutionUpdatedEvent.java`
- Create: `cameleer-server-core/src/main/java/com/cameleer/server/core/storage/model/ExecutionDocument.java`
- Create: `cameleer-server-core/src/main/java/com/cameleer/server/core/indexing/ExecutionUpdatedEvent.java`
- [ ] **Step 1: Create ExecutionDocument**
```java
package com.cameleer3.server.core.storage.model;
package com.cameleer.server.core.storage.model;
import java.time.Instant;
import java.util.List;
@@ -767,7 +767,7 @@ public record ExecutionDocument(
- [ ] **Step 2: Create ExecutionUpdatedEvent**
```java
package com.cameleer3.server.core.indexing;
package com.cameleer.server.core.indexing;
import java.time.Instant;
@@ -777,25 +777,25 @@ public record ExecutionUpdatedEvent(String executionId, Instant startTime) {}
- [ ] **Step 3: Commit**
```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/storage/model/ExecutionDocument.java
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/indexing/
git add cameleer-server-core/src/main/java/com/cameleer/server/core/storage/model/ExecutionDocument.java
git add cameleer-server-core/src/main/java/com/cameleer/server/core/indexing/
git commit -m "feat: add ExecutionDocument model and ExecutionUpdatedEvent"
```
### Task 7: Update SearchService to use StatsStore for stats/timeseries
**Files:**
- Modify: `cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchService.java`
- Modify: `cameleer-server-core/src/main/java/com/cameleer/server/core/search/SearchService.java`
- [ ] **Step 1: Refactor SearchService to accept SearchIndex + StatsStore**
Replace the single `SearchEngine` dependency with two dependencies:
```java
package com.cameleer3.server.core.search;
package com.cameleer.server.core.search;
import com.cameleer3.server.core.storage.SearchIndex;
import com.cameleer3.server.core.storage.StatsStore;
import com.cameleer.server.core.storage.SearchIndex;
import com.cameleer.server.core.storage.StatsStore;
import java.time.Instant;
import java.util.List;
@@ -840,24 +840,24 @@ public class SearchService {
- [ ] **Step 2: Commit**
```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchService.java
git add cameleer-server-core/src/main/java/com/cameleer/server/core/search/SearchService.java
git commit -m "refactor: SearchService uses SearchIndex + StatsStore instead of SearchEngine"
```
### Task 8: Update DetailService to use ExecutionStore
**Files:**
- Modify: `cameleer3-server-core/src/main/java/com/cameleer3/server/core/detail/DetailService.java`
- Modify: `cameleer-server-core/src/main/java/com/cameleer/server/core/detail/DetailService.java`
- [ ] **Step 1: Rewrite DetailService to use ExecutionStore**
The tree reconstruction from parallel arrays is no longer needed. Processors are now individual records with `parentProcessorId` for tree structure.
```java
package com.cameleer3.server.core.detail;
package com.cameleer.server.core.detail;
import com.cameleer3.server.core.storage.ExecutionStore;
import com.cameleer3.server.core.storage.ExecutionStore.ProcessorRecord;
import com.cameleer.server.core.storage.ExecutionStore;
import com.cameleer.server.core.storage.ExecutionStore.ProcessorRecord;
import java.util.*;
@@ -920,30 +920,30 @@ public class DetailService {
- [ ] **Step 2: Commit**
```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/detail/DetailService.java
git add cameleer-server-core/src/main/java/com/cameleer/server/core/detail/DetailService.java
git commit -m "refactor: DetailService uses ExecutionStore, tree built from parentProcessorId"
```
### Task 9: Update IngestionService for synchronous writes
**Files:**
- Modify: `cameleer3-server-core/src/main/java/com/cameleer3/server/core/ingestion/IngestionService.java`
- Modify: `cameleer-server-core/src/main/java/com/cameleer/server/core/ingestion/IngestionService.java`
- [ ] **Step 1: Rewrite IngestionService**
Executions and diagrams become synchronous writes. Metrics keep the write buffer. Add event publishing for OpenSearch indexing.
```java
package com.cameleer3.server.core.ingestion;
package com.cameleer.server.core.ingestion;
import com.cameleer3.common.model.ProcessorExecution;
import com.cameleer3.common.model.RouteExecution;
import com.cameleer3.server.core.indexing.ExecutionUpdatedEvent;
import com.cameleer3.server.core.storage.DiagramStore;
import com.cameleer3.server.core.storage.ExecutionStore;
import com.cameleer3.server.core.storage.ExecutionStore.ExecutionRecord;
import com.cameleer3.server.core.storage.ExecutionStore.ProcessorRecord;
import com.cameleer3.server.core.storage.model.MetricsSnapshot;
import com.cameleer.common.model.ProcessorExecution;
import com.cameleer.common.model.RouteExecution;
import com.cameleer.server.core.indexing.ExecutionUpdatedEvent;
import com.cameleer.server.core.storage.DiagramStore;
import com.cameleer.server.core.storage.ExecutionStore;
import com.cameleer.server.core.storage.ExecutionStore.ExecutionRecord;
import com.cameleer.server.core.storage.ExecutionStore.ProcessorRecord;
import com.cameleer.server.core.storage.model.MetricsSnapshot;
import java.util.ArrayList;
import java.util.List;
@@ -1055,7 +1055,7 @@ public class IngestionService {
- [ ] **Step 2: Commit**
```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/ingestion/IngestionService.java
git add cameleer-server-core/src/main/java/com/cameleer/server/core/ingestion/IngestionService.java
git commit -m "refactor: IngestionService uses synchronous ExecutionStore writes with event publishing"
```
@@ -1066,18 +1066,18 @@ git commit -m "refactor: IngestionService uses synchronous ExecutionStore writes
### Task 10: Implement PostgresExecutionStore
**Files:**
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresExecutionStore.java`
- Create: `cameleer3-server-app/src/test/java/com/cameleer3/server/app/storage/PostgresExecutionStoreIT.java`
- Create: `cameleer-server-app/src/main/java/com/cameleer/server/app/storage/PostgresExecutionStore.java`
- Create: `cameleer-server-app/src/test/java/com/cameleer/server/app/storage/PostgresExecutionStoreIT.java`
- [ ] **Step 1: Write the failing test**
```java
package com.cameleer3.server.app.storage;
package com.cameleer.server.app.storage;
import com.cameleer3.server.app.AbstractPostgresIT;
import com.cameleer3.server.core.storage.ExecutionStore;
import com.cameleer3.server.core.storage.ExecutionStore.ExecutionRecord;
import com.cameleer3.server.core.storage.ExecutionStore.ProcessorRecord;
import com.cameleer.server.app.AbstractPostgresIT;
import com.cameleer.server.core.storage.ExecutionStore;
import com.cameleer.server.core.storage.ExecutionStore.ExecutionRecord;
import com.cameleer.server.core.storage.ExecutionStore.ProcessorRecord;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -1159,15 +1159,15 @@ class PostgresExecutionStoreIT extends AbstractPostgresIT {
- [ ] **Step 2: Run test to verify it fails**
Run: `mvn test -pl cameleer3-server-app -Dtest=PostgresExecutionStoreIT -q`
Run: `mvn test -pl cameleer-server-app -Dtest=PostgresExecutionStoreIT -q`
Expected: FAIL — `ExecutionStore` bean not found
- [ ] **Step 3: Implement PostgresExecutionStore**
```java
package com.cameleer3.server.app.storage;
package com.cameleer.server.app.storage;
import com.cameleer3.server.core.storage.ExecutionStore;
import com.cameleer.server.core.storage.ExecutionStore;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
@@ -1300,34 +1300,34 @@ public class PostgresExecutionStore implements ExecutionStore {
- [ ] **Step 4: Run tests to verify they pass**
Run: `mvn test -pl cameleer3-server-app -Dtest=PostgresExecutionStoreIT -q`
Run: `mvn test -pl cameleer-server-app -Dtest=PostgresExecutionStoreIT -q`
Expected: PASS — all 3 tests green
- [ ] **Step 5: Commit**
```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresExecutionStore.java
git add cameleer3-server-app/src/test/java/com/cameleer3/server/app/storage/PostgresExecutionStoreIT.java
git add cameleer-server-app/src/main/java/com/cameleer/server/app/storage/PostgresExecutionStore.java
git add cameleer-server-app/src/test/java/com/cameleer/server/app/storage/PostgresExecutionStoreIT.java
git commit -m "feat: implement PostgresExecutionStore with upsert and dedup"
```
### Task 11: Implement PostgresStatsStore
**Files:**
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresStatsStore.java`
- Create: `cameleer3-server-app/src/test/java/com/cameleer3/server/app/storage/PostgresStatsStoreIT.java`
- Create: `cameleer-server-app/src/main/java/com/cameleer/server/app/storage/PostgresStatsStore.java`
- Create: `cameleer-server-app/src/test/java/com/cameleer/server/app/storage/PostgresStatsStoreIT.java`
- [ ] **Step 1: Write the failing test**
```java
package com.cameleer3.server.app.storage;
package com.cameleer.server.app.storage;
import com.cameleer3.server.app.AbstractPostgresIT;
import com.cameleer3.server.core.search.ExecutionStats;
import com.cameleer3.server.core.search.StatsTimeseries;
import com.cameleer3.server.core.storage.ExecutionStore;
import com.cameleer3.server.core.storage.ExecutionStore.ExecutionRecord;
import com.cameleer3.server.core.storage.StatsStore;
import com.cameleer.server.app.AbstractPostgresIT;
import com.cameleer.server.core.search.ExecutionStats;
import com.cameleer.server.core.search.StatsTimeseries;
import com.cameleer.server.core.storage.ExecutionStore;
import com.cameleer.server.core.storage.ExecutionStore.ExecutionRecord;
import com.cameleer.server.core.storage.StatsStore;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
@@ -1385,18 +1385,18 @@ class PostgresStatsStoreIT extends AbstractPostgresIT {
- [ ] **Step 2: Run test to verify it fails**
Run: `mvn test -pl cameleer3-server-app -Dtest=PostgresStatsStoreIT -q`
Run: `mvn test -pl cameleer-server-app -Dtest=PostgresStatsStoreIT -q`
Expected: FAIL — `StatsStore` bean not found
- [ ] **Step 3: Implement PostgresStatsStore**
```java
package com.cameleer3.server.app.storage;
package com.cameleer.server.app.storage;
import com.cameleer3.server.core.search.ExecutionStats;
import com.cameleer3.server.core.search.StatsTimeseries;
import com.cameleer3.server.core.search.StatsTimeseries.TimeseriesBucket;
import com.cameleer3.server.core.storage.StatsStore;
import com.cameleer.server.core.search.ExecutionStats;
import com.cameleer.server.core.search.StatsTimeseries;
import com.cameleer.server.core.search.StatsTimeseries.TimeseriesBucket;
import com.cameleer.server.core.storage.StatsStore;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@@ -1582,24 +1582,24 @@ public class PostgresStatsStore implements StatsStore {
- [ ] **Step 4: Run tests to verify they pass**
Run: `mvn test -pl cameleer3-server-app -Dtest=PostgresStatsStoreIT -q`
Run: `mvn test -pl cameleer-server-app -Dtest=PostgresStatsStoreIT -q`
Expected: PASS
- [ ] **Step 5: Commit**
```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresStatsStore.java
git add cameleer3-server-app/src/test/java/com/cameleer3/server/app/storage/PostgresStatsStoreIT.java
git add cameleer-server-app/src/main/java/com/cameleer/server/app/storage/PostgresStatsStore.java
git add cameleer-server-app/src/test/java/com/cameleer/server/app/storage/PostgresStatsStoreIT.java
git commit -m "feat: implement PostgresStatsStore querying continuous aggregates"
```
### Task 12: Implement PostgresDiagramStore, PostgresUserRepository, PostgresOidcConfigRepository, PostgresMetricsStore
**Files:**
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresDiagramStore.java`
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresUserRepository.java`
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresOidcConfigRepository.java`
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/PostgresMetricsStore.java`
- Create: `cameleer-server-app/src/main/java/com/cameleer/server/app/storage/PostgresDiagramStore.java`
- Create: `cameleer-server-app/src/main/java/com/cameleer/server/app/storage/PostgresUserRepository.java`
- Create: `cameleer-server-app/src/main/java/com/cameleer/server/app/storage/PostgresOidcConfigRepository.java`
- Create: `cameleer-server-app/src/main/java/com/cameleer/server/app/storage/PostgresMetricsStore.java`
- [ ] **Step 1: Write failing test for PostgresDiagramStore**
@@ -1620,10 +1620,10 @@ Straightforward CRUD with `ON CONFLICT (content_hash) DO NOTHING`. Port the SHA-
Implements `UserRepository` interface (existing interface in `core.security`, unchanged).
```java
package com.cameleer3.server.app.storage;
package com.cameleer.server.app.storage;
import com.cameleer3.server.core.security.UserInfo;
import com.cameleer3.server.core.security.UserRepository;
import com.cameleer.server.core.security.UserInfo;
import com.cameleer.server.core.security.UserRepository;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@@ -1696,10 +1696,10 @@ public class PostgresUserRepository implements UserRepository {
Implements `OidcConfigRepository` interface (existing interface in `core.security`).
```java
package com.cameleer3.server.app.storage;
package com.cameleer.server.app.storage;
import com.cameleer3.server.core.security.OidcConfig;
import com.cameleer3.server.core.security.OidcConfigRepository;
import com.cameleer.server.core.security.OidcConfig;
import com.cameleer.server.core.security.OidcConfigRepository;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@@ -1760,10 +1760,10 @@ public class PostgresOidcConfigRepository implements OidcConfigRepository {
- [ ] **Step 6: Implement PostgresMetricsStore**
```java
package com.cameleer3.server.app.storage;
package com.cameleer.server.app.storage;
import com.cameleer3.server.core.storage.MetricsStore;
import com.cameleer3.server.core.storage.model.MetricsSnapshot;
import com.cameleer.server.core.storage.MetricsStore;
import com.cameleer.server.core.storage.model.MetricsSnapshot;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.jdbc.core.JdbcTemplate;
@@ -1806,13 +1806,13 @@ public class PostgresMetricsStore implements MetricsStore {
- [ ] **Step 7: Run all store tests, verify pass**
Run: `mvn test -pl cameleer3-server-app -Dtest="Postgres*IT" -q`
Run: `mvn test -pl cameleer-server-app -Dtest="Postgres*IT" -q`
- [ ] **Step 8: Commit**
```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/Postgres*.java
git add cameleer3-server-app/src/test/java/com/cameleer3/server/app/storage/Postgres*.java
git add cameleer-server-app/src/main/java/com/cameleer/server/app/storage/Postgres*.java
git add cameleer-server-app/src/test/java/com/cameleer/server/app/storage/Postgres*.java
git commit -m "feat: implement PostgresDiagramStore, PostgresUserRepository, PostgresOidcConfigRepository, PostgresMetricsStore"
```
@@ -1823,22 +1823,22 @@ git commit -m "feat: implement PostgresDiagramStore, PostgresUserRepository, Pos
### Task 13: Implement OpenSearchIndex
**Files:**
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/OpenSearchConfig.java`
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/OpenSearchIndex.java`
- Create: `cameleer3-server-app/src/test/java/com/cameleer3/server/app/search/OpenSearchIndexIT.java`
- Create: `cameleer-server-app/src/main/java/com/cameleer/server/app/config/OpenSearchConfig.java`
- Create: `cameleer-server-app/src/main/java/com/cameleer/server/app/search/OpenSearchIndex.java`
- Create: `cameleer-server-app/src/test/java/com/cameleer/server/app/search/OpenSearchIndexIT.java`
- [ ] **Step 1: Write failing test**
```java
package com.cameleer3.server.app.search;
package com.cameleer.server.app.search;
import com.cameleer3.server.app.AbstractPostgresIT;
import com.cameleer3.server.core.search.ExecutionSummary;
import com.cameleer3.server.core.search.SearchRequest;
import com.cameleer3.server.core.search.SearchResult;
import com.cameleer3.server.core.storage.SearchIndex;
import com.cameleer3.server.core.storage.model.ExecutionDocument;
import com.cameleer3.server.core.storage.model.ExecutionDocument.ProcessorDoc;
import com.cameleer.server.app.AbstractPostgresIT;
import com.cameleer.server.core.search.ExecutionSummary;
import com.cameleer.server.core.search.SearchRequest;
import com.cameleer.server.core.search.SearchResult;
import com.cameleer.server.core.storage.SearchIndex;
import com.cameleer.server.core.storage.model.ExecutionDocument;
import com.cameleer.server.core.storage.model.ExecutionDocument.ProcessorDoc;
import org.junit.jupiter.api.Test;
import org.opensearch.testcontainers.OpensearchContainer;
import org.springframework.beans.factory.annotation.Autowired;
@@ -1922,7 +1922,7 @@ class OpenSearchIndexIT extends AbstractPostgresIT {
- [ ] **Step 2: Create OpenSearchConfig**
```java
package com.cameleer3.server.app.config;
package com.cameleer.server.app.config;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
import org.apache.hc.core5.http.HttpHost;
@@ -1950,14 +1950,14 @@ public class OpenSearchConfig {
- [ ] **Step 3: Implement OpenSearchIndex**
```java
package com.cameleer3.server.app.search;
package com.cameleer.server.app.search;
import com.cameleer3.server.core.search.ExecutionSummary;
import com.cameleer3.server.core.search.SearchRequest;
import com.cameleer3.server.core.search.SearchResult;
import com.cameleer3.server.core.storage.SearchIndex;
import com.cameleer3.server.core.storage.model.ExecutionDocument;
import com.cameleer3.server.core.storage.model.ExecutionDocument.ProcessorDoc;
import com.cameleer.server.core.search.ExecutionSummary;
import com.cameleer.server.core.search.SearchRequest;
import com.cameleer.server.core.search.SearchResult;
import com.cameleer.server.core.storage.SearchIndex;
import com.cameleer.server.core.storage.model.ExecutionDocument;
import com.cameleer.server.core.storage.model.ExecutionDocument.ProcessorDoc;
import jakarta.annotation.PostConstruct;
import org.opensearch.client.opensearch.OpenSearchClient;
import org.opensearch.client.opensearch._types.FieldValue;
@@ -2264,34 +2264,34 @@ public class OpenSearchIndex implements SearchIndex {
- [ ] **Step 4: Run tests to verify they pass**
Run: `mvn test -pl cameleer3-server-app -Dtest=OpenSearchIndexIT -q`
Run: `mvn test -pl cameleer-server-app -Dtest=OpenSearchIndexIT -q`
Expected: PASS
- [ ] **Step 5: Commit**
```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/OpenSearchConfig.java
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/OpenSearchIndex.java
git add cameleer3-server-app/src/test/java/com/cameleer3/server/app/search/OpenSearchIndexIT.java
git add cameleer-server-app/src/main/java/com/cameleer/server/app/config/OpenSearchConfig.java
git add cameleer-server-app/src/main/java/com/cameleer/server/app/search/OpenSearchIndex.java
git add cameleer-server-app/src/test/java/com/cameleer/server/app/search/OpenSearchIndexIT.java
git commit -m "feat: implement OpenSearchIndex with full-text and wildcard search"
```
### Task 14: Implement SearchIndexer (debounced event-driven indexer)
**Files:**
- Create: `cameleer3-server-core/src/main/java/com/cameleer3/server/core/indexing/SearchIndexer.java`
- Create: `cameleer-server-core/src/main/java/com/cameleer/server/core/indexing/SearchIndexer.java`
- [ ] **Step 1: Implement SearchIndexer**
```java
package com.cameleer3.server.core.indexing;
package com.cameleer.server.core.indexing;
import com.cameleer3.server.core.storage.ExecutionStore;
import com.cameleer3.server.core.storage.ExecutionStore.ExecutionRecord;
import com.cameleer3.server.core.storage.ExecutionStore.ProcessorRecord;
import com.cameleer3.server.core.storage.SearchIndex;
import com.cameleer3.server.core.storage.model.ExecutionDocument;
import com.cameleer3.server.core.storage.model.ExecutionDocument.ProcessorDoc;
import com.cameleer.server.core.storage.ExecutionStore;
import com.cameleer.server.core.storage.ExecutionStore.ExecutionRecord;
import com.cameleer.server.core.storage.ExecutionStore.ProcessorRecord;
import com.cameleer.server.core.storage.SearchIndex;
import com.cameleer.server.core.storage.model.ExecutionDocument;
import com.cameleer.server.core.storage.model.ExecutionDocument.ProcessorDoc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -2368,7 +2368,7 @@ public class SearchIndexer {
- [ ] **Step 2: Commit**
```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/indexing/SearchIndexer.java
git add cameleer-server-core/src/main/java/com/cameleer/server/core/indexing/SearchIndexer.java
git commit -m "feat: implement debounced SearchIndexer for async OpenSearch indexing"
```
@@ -2379,25 +2379,25 @@ git commit -m "feat: implement debounced SearchIndexer for async OpenSearch inde
### Task 15: Create bean configuration and wire everything
**Files:**
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/StorageBeanConfig.java`
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/ingestion/MetricsFlushScheduler.java`
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/retention/RetentionScheduler.java`
- Modify: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/SearchBeanConfig.java`
- Modify: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/IngestionBeanConfig.java`
- Create: `cameleer-server-app/src/main/java/com/cameleer/server/app/config/StorageBeanConfig.java`
- Create: `cameleer-server-app/src/main/java/com/cameleer/server/app/ingestion/MetricsFlushScheduler.java`
- Create: `cameleer-server-app/src/main/java/com/cameleer/server/app/retention/RetentionScheduler.java`
- Modify: `cameleer-server-app/src/main/java/com/cameleer/server/app/config/SearchBeanConfig.java`
- Modify: `cameleer-server-app/src/main/java/com/cameleer/server/app/config/IngestionBeanConfig.java`
- [ ] **Step 1: Create StorageBeanConfig**
Wire `DetailService`, `SearchIndexer`, `IngestionService` with new store beans:
```java
package com.cameleer3.server.app.config;
package com.cameleer.server.app.config;
import com.cameleer3.server.core.detail.DetailService;
import com.cameleer3.server.core.indexing.SearchIndexer;
import com.cameleer3.server.core.ingestion.IngestionService;
import com.cameleer3.server.core.ingestion.WriteBuffer;
import com.cameleer3.server.core.storage.*;
import com.cameleer3.server.core.storage.model.MetricsSnapshot;
import com.cameleer.server.core.detail.DetailService;
import com.cameleer.server.core.indexing.SearchIndexer;
import com.cameleer.server.core.ingestion.IngestionService;
import com.cameleer.server.core.ingestion.WriteBuffer;
import com.cameleer.server.core.storage.*;
import com.cameleer.server.core.storage.model.MetricsSnapshot;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -2453,15 +2453,15 @@ public WriteBuffer<MetricsSnapshot> metricsBuffer(IngestionConfig config) {
- [ ] **Step 4: Create MetricsFlushScheduler**
Create `cameleer3-server-app/src/main/java/com/cameleer3/server/app/ingestion/MetricsFlushScheduler.java`:
Create `cameleer-server-app/src/main/java/com/cameleer/server/app/ingestion/MetricsFlushScheduler.java`:
```java
package com.cameleer3.server.app.ingestion;
package com.cameleer.server.app.ingestion;
import com.cameleer3.server.app.config.IngestionConfig;
import com.cameleer3.server.core.ingestion.WriteBuffer;
import com.cameleer3.server.core.storage.MetricsStore;
import com.cameleer3.server.core.storage.model.MetricsSnapshot;
import com.cameleer.server.app.config.IngestionConfig;
import com.cameleer.server.core.ingestion.WriteBuffer;
import com.cameleer.server.core.storage.MetricsStore;
import com.cameleer.server.core.storage.model.MetricsSnapshot;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.SmartLifecycle;
@@ -2519,10 +2519,10 @@ public class MetricsFlushScheduler implements SmartLifecycle {
- [ ] **Step 5: Create RetentionScheduler**
Create `cameleer3-server-app/src/main/java/com/cameleer3/server/app/retention/RetentionScheduler.java`:
Create `cameleer-server-app/src/main/java/com/cameleer/server/app/retention/RetentionScheduler.java`:
```java
package com.cameleer3.server.app.retention;
package com.cameleer.server.app.retention;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -2575,11 +2575,11 @@ public class RetentionScheduler {
- [ ] **Step 6: Commit**
```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/StorageBeanConfig.java
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/SearchBeanConfig.java
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/IngestionBeanConfig.java
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/ingestion/MetricsFlushScheduler.java
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/retention/RetentionScheduler.java
git add cameleer-server-app/src/main/java/com/cameleer/server/app/config/StorageBeanConfig.java
git add cameleer-server-app/src/main/java/com/cameleer/server/app/config/SearchBeanConfig.java
git add cameleer-server-app/src/main/java/com/cameleer/server/app/config/IngestionBeanConfig.java
git add cameleer-server-app/src/main/java/com/cameleer/server/app/ingestion/MetricsFlushScheduler.java
git add cameleer-server-app/src/main/java/com/cameleer/server/app/retention/RetentionScheduler.java
git commit -m "feat: wire new storage beans, add MetricsFlushScheduler and RetentionScheduler"
```
@@ -2591,10 +2591,10 @@ git commit -m "feat: wire new storage beans, add MetricsFlushScheduler and Reten
- [ ] **Step 1: Delete ClickHouse implementations**
```bash
rm cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/ClickHouse*.java
rm cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/ClickHouseSearchEngine.java
rm cameleer3-server-app/src/main/java/com/cameleer3/server/app/ingestion/ClickHouseFlushScheduler.java
rm cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/ClickHouseConfig.java
rm cameleer-server-app/src/main/java/com/cameleer/server/app/storage/ClickHouse*.java
rm cameleer-server-app/src/main/java/com/cameleer/server/app/search/ClickHouseSearchEngine.java
rm cameleer-server-app/src/main/java/com/cameleer/server/app/ingestion/ClickHouseFlushScheduler.java
rm cameleer-server-app/src/main/java/com/cameleer/server/app/config/ClickHouseConfig.java
```
- [ ] **Step 2: Delete old core interfaces replaced by new ones**
@@ -2602,23 +2602,23 @@ rm cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/ClickHouse
`UserRepository` and `OidcConfigRepository` in `core.security` are **kept** — the new Postgres implementations implement them. Only interfaces replaced by new storage interfaces are deleted.
```bash
rm cameleer3-server-core/src/main/java/com/cameleer3/server/core/storage/ExecutionRepository.java
rm cameleer3-server-core/src/main/java/com/cameleer3/server/core/storage/DiagramRepository.java
rm cameleer3-server-core/src/main/java/com/cameleer3/server/core/storage/MetricsRepository.java
rm cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchEngine.java
rm cameleer3-server-core/src/main/java/com/cameleer3/server/core/detail/RawExecutionRow.java
rm cameleer-server-core/src/main/java/com/cameleer/server/core/storage/ExecutionRepository.java
rm cameleer-server-core/src/main/java/com/cameleer/server/core/storage/DiagramRepository.java
rm cameleer-server-core/src/main/java/com/cameleer/server/core/storage/MetricsRepository.java
rm cameleer-server-core/src/main/java/com/cameleer/server/core/search/SearchEngine.java
rm cameleer-server-core/src/main/java/com/cameleer/server/core/detail/RawExecutionRow.java
```
- [ ] **Step 3: Delete ClickHouse SQL migrations**
```bash
rm -r cameleer3-server-app/src/main/resources/clickhouse/
rm -r cameleer-server-app/src/main/resources/clickhouse/
```
- [ ] **Step 4: Delete old test base class**
```bash
rm cameleer3-server-app/src/test/java/com/cameleer3/server/app/AbstractClickHouseIT.java
rm cameleer-server-app/src/test/java/com/cameleer/server/app/AbstractClickHouseIT.java
```
- [ ] **Step 5: Fix compilation errors in specific files**
@@ -2651,7 +2651,7 @@ git commit -m "refactor: remove all ClickHouse code, old interfaces, and SQL mig
### Task 17: Update existing integration tests
**Files:**
- Modify: all IT files under `cameleer3-server-app/src/test/`
- Modify: all IT files under `cameleer-server-app/src/test/`
- [ ] **Step 1: Update all ITs to extend AbstractPostgresIT**
@@ -2689,7 +2689,7 @@ git commit -m "test: migrate all integration tests from ClickHouse to PostgreSQL
- [ ] **Step 1: Update Dockerfile**
No JDBC driver changes needed in Dockerfile (drivers are in the fat JAR). Just verify the `REGISTRY_TOKEN` build arg still works for `cameleer3-common` resolution.
No JDBC driver changes needed in Dockerfile (drivers are in the fat JAR). Just verify the `REGISTRY_TOKEN` build arg still works for `cameleer-common` resolution.
- [ ] **Step 2: Update K8s manifests**
@@ -2717,7 +2717,7 @@ Changes needed:
- Docker build: no ClickHouse references in the image (it's a fat JAR, driver is bundled)
- Deploy step: update K8s secret names from `clickhouse-credentials` to `postgres-credentials`
- Deploy step: add OpenSearch deployment manifests
- Verify `REGISTRY_TOKEN` build arg still works for `cameleer3-common`
- Verify `REGISTRY_TOKEN` build arg still works for `cameleer-common`
- Integration tests still skipped in CI (`-DskipITs`) — Testcontainers needs Docker-in-Docker
- [ ] **Step 2: Commit**
@@ -2738,7 +2738,7 @@ Run: `mvn spring-boot:run` (briefly, to generate spec), then fetch `/api/v1/api-
- [ ] **Step 2: Commit**
```bash
git add cameleer3-server-app/src/main/resources/static/openapi.json
git add cameleer-server-app/src/main/resources/static/openapi.json
git commit -m "docs: regenerate openapi.json after storage layer refactor"
```