From 19344acd2ac44fd6fbceaf0a8fba77cab86cf9dd Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Mon, 29 Jul 2024 11:33:51 -0700 Subject: [PATCH 1/2] Add created_at and last_updated_at timestamps. We use application level timestamps to maintain dialect compatibility between different SQL variations. We truncate timestamp to granularity of days for privacy reasons. --- .../vss/impl/postgres/PostgresBackendImpl.java | 18 +++++++++++++----- .../vss/impl/postgres/sql/v0_create_vss_db.sql | 2 ++ .../PostgresBackendImplIntegrationTest.java | 2 ++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/vss/impl/postgres/PostgresBackendImpl.java b/app/src/main/java/org/vss/impl/postgres/PostgresBackendImpl.java index 3ed57ad..376fc07 100644 --- a/app/src/main/java/org/vss/impl/postgres/PostgresBackendImpl.java +++ b/app/src/main/java/org/vss/impl/postgres/PostgresBackendImpl.java @@ -2,6 +2,9 @@ import com.google.inject.Inject; import com.google.protobuf.ByteString; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -151,36 +154,41 @@ private Query buildPutObjectQuery(DSLContext dsl, VssDbRecord vssRecord) { private Query buildNonConditionalUpsertRecordQuery(DSLContext dsl, VssDbRecord vssRecord) { return dsl.insertInto(VSS_DB) .values(vssRecord.getStoreId(), vssRecord.getKey(), - vssRecord.getValue(), 1) + vssRecord.getValue(), 1, vssRecord.getCreatedAt(), vssRecord.getLastUpdatedAt()) .onConflict(VSS_DB.STORE_ID, VSS_DB.KEY) .doUpdate() .set(VSS_DB.VALUE, vssRecord.getValue()) - .set(VSS_DB.VERSION, 1L); + .set(VSS_DB.VERSION, 1L) + .set(VSS_DB.LAST_UPDATED_AT, vssRecord.getLastUpdatedAt()); } private Insert buildConditionalInsertRecordQuery(DSLContext dsl, VssDbRecord vssRecord) { return dsl.insertInto(VSS_DB) .values(vssRecord.getStoreId(), vssRecord.getKey(), - vssRecord.getValue(), 1) + vssRecord.getValue(), 1, vssRecord.getCreatedAt(), vssRecord.getLastUpdatedAt()) .onDuplicateKeyIgnore(); } private Update buildConditionalUpdateRecordQuery(DSLContext dsl, VssDbRecord vssRecord) { return dsl.update(VSS_DB) .set(Map.of(VSS_DB.VALUE, vssRecord.getValue(), - VSS_DB.VERSION, vssRecord.getVersion() + 1)) + VSS_DB.VERSION, vssRecord.getVersion() + 1, + VSS_DB.LAST_UPDATED_AT, vssRecord.getLastUpdatedAt())) .where(VSS_DB.STORE_ID.eq(vssRecord.getStoreId()) .and(VSS_DB.KEY.eq(vssRecord.getKey())) .and(VSS_DB.VERSION.eq(vssRecord.getVersion()))); } private VssDbRecord buildVssRecord(String storeId, KeyValue kv) { + OffsetDateTime today = OffsetDateTime.now(ZoneOffset.UTC).truncatedTo(ChronoUnit.DAYS); return new VssDbRecord() .setStoreId(storeId) .setKey(kv.getKey()) .setValue(kv.getValue().toByteArray()) - .setVersion(kv.getVersion()); + .setVersion(kv.getVersion()) + .setCreatedAt(today) + .setLastUpdatedAt(today); } @Override diff --git a/app/src/main/java/org/vss/impl/postgres/sql/v0_create_vss_db.sql b/app/src/main/java/org/vss/impl/postgres/sql/v0_create_vss_db.sql index bd81216..4051bca 100644 --- a/app/src/main/java/org/vss/impl/postgres/sql/v0_create_vss_db.sql +++ b/app/src/main/java/org/vss/impl/postgres/sql/v0_create_vss_db.sql @@ -3,5 +3,7 @@ CREATE TABLE vss_db ( key character varying(600) NOT NULL, value bytea NULL, version bigint NOT NULL, + created_at TIMESTAMP WITH TIME ZONE, + last_updated_at TIMESTAMP WITH TIME ZONE, PRIMARY KEY (store_id, key) ); diff --git a/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java b/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java index 76bf78c..e43bc24 100644 --- a/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java +++ b/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java @@ -51,6 +51,8 @@ private void createTable(DSLContext dslContext) { + "key character varying(120) NOT NULL," + "value bytea NULL," + "version bigint NOT NULL," + + "created_at TIMESTAMP WITH TIME ZONE," + + "last_updated_at TIMESTAMP WITH TIME ZONE," + "PRIMARY KEY (store_id, key)" + ");"); } From 512c70ffd5332aa20171718334909f59d37af024 Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Mon, 29 Jul 2024 11:35:03 -0700 Subject: [PATCH 2/2] Change key length to 600char in tests. This is to reflect changes from #25 in tests. --- .../vss/impl/postgres/PostgresBackendImplIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java b/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java index e43bc24..57b5197 100644 --- a/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java +++ b/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java @@ -48,7 +48,7 @@ void destroy() throws Exception { private void createTable(DSLContext dslContext) { dslContext.execute("CREATE TABLE vss_db (" + "store_id character varying(120) NOT NULL CHECK (store_id <> '')," - + "key character varying(120) NOT NULL," + + "key character varying(600) NOT NULL," + "value bytea NULL," + "version bigint NOT NULL," + "created_at TIMESTAMP WITH TIME ZONE,"