Skip to content

Commit da3123c

Browse files
committed
extract metadata for pv and references rather than constantly computing it
1 parent 7ebf803 commit da3123c

12 files changed

Lines changed: 301 additions & 126 deletions

File tree

processor/src/main/java/net/staticstudios/data/processor/DataProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
@SupportedAnnotationTypes("net.staticstudios.data.Data")
2121
@SupportedSourceVersion(SourceVersion.RELEASE_21)
22-
public class DataProcessor extends AbstractProcessor {
22+
public class DataProcessor extends AbstractProcessor { //todo: this seems to be in the classpath of the main project. address this.
2323
@Override
2424
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
2525
for (Element annotated : roundEnv.getElementsAnnotatedWith(Data.class)) {

src/main/java/net/staticstudios/data/DataAccessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public interface DataAccessor {
1515

1616
ResultSet executeQuery(@Language("SQL") String sql, List<Object> values) throws SQLException;
1717

18-
void executeUpdate(@Language("SQL") String sql, List<Object> values) throws SQLException;
18+
void executeUpdate(@Language("SQL") String sql, List<Object> values, int delay) throws SQLException;
1919

2020
void insert(List<SQlStatement> sqlStatements, InsertMode insertMode) throws SQLException;
2121

src/main/java/net/staticstudios/data/DataManager.java

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,9 @@ public void extractMetadata(Class<? extends UniqueData> clazz) {
199199
));
200200
}
201201
Preconditions.checkArgument(!idColumns.isEmpty(), "UniqueData class %s must have at least one @IdColumn annotated PersistentValue field", clazz.getName());
202-
UniqueDataMetadata metadata = new UniqueDataMetadata(clazz, ValueUtils.parseValue(dataAnnotation.schema()), ValueUtils.parseValue(dataAnnotation.table()), idColumns);
202+
String schema = ValueUtils.parseValue(dataAnnotation.schema());
203+
String table = ValueUtils.parseValue(dataAnnotation.table());
204+
UniqueDataMetadata metadata = new UniqueDataMetadata(clazz, schema, table, idColumns, PersistentValueImpl.extractMetadata(schema, table, clazz), ReferenceImpl.extractMetadata(clazz));
203205
uniqueDataMetadataMap.put(clazz, metadata);
204206

205207
for (Field field : ReflectionUtils.getFields(clazz, Relation.class)) {
@@ -394,7 +396,7 @@ public <T extends UniqueData> T getInstance(Class<T> clazz, ColumnValuePair... i
394396
throw new RuntimeException(e);
395397
}
396398

397-
PersistentValueImpl.delegate(schema, table, instance);
399+
PersistentValueImpl.delegate(instance);
398400
ReferenceImpl.delegate(instance);
399401

400402
uniqueDataInstanceCache.computeIfAbsent(clazz, k -> new MapMaker().weakValues().makeMap())
@@ -569,11 +571,17 @@ public void insert(InsertContext insertContext, InsertMode insertMode) {
569571
}
570572
}
571573

572-
public <T> T get(String schema, String table, String column, ColumnValuePairs idColumns, Map<String, String> idColumnLinks, Class<T> dataType) {
574+
public <T> T get(String schema, String table, String column, ColumnValuePairs idColumns, List<ForeignKey.Link> idColumnLinks, Class<T> dataType) {
573575
//todo: caffeine cache for these as well.
574576
StringBuilder sqlBuilder = new StringBuilder().append("SELECT \"").append(column).append("\" FROM \"").append(schema).append("\".\"").append(table).append("\" WHERE ");
575577
for (ColumnValuePair columnValuePair : idColumns) {
576-
String name = idColumnLinks.getOrDefault(columnValuePair.column(), columnValuePair.column());
578+
String name = columnValuePair.column();
579+
for (ForeignKey.Link link : idColumnLinks) {
580+
if (link.columnInReferringTable().equals(columnValuePair.column())) {
581+
name = link.columnInReferencedTable();
582+
break;
583+
}
584+
}
577585
sqlBuilder.append("\"").append(name).append("\" = ? AND ");
578586
}
579587
sqlBuilder.setLength(sqlBuilder.length() - 5);
@@ -591,12 +599,18 @@ public <T> T get(String schema, String table, String column, ColumnValuePairs id
591599
}
592600

593601
@ApiStatus.Internal
594-
public void set(String schema, String table, String column, ColumnValuePairs idColumns, Map<String, String> idColumnLinks, Object value) {
602+
public void set(String schema, String table, String column, ColumnValuePairs idColumns, List<ForeignKey.Link> idColumnLinks, Object value, int delay) {
595603
StringBuilder sqlBuilder;
596604
if (idColumnLinks.isEmpty()) {
597605
sqlBuilder = new StringBuilder().append("UPDATE \"").append(schema).append("\".\"").append(table).append("\" SET \"").append(column).append("\" = ? WHERE ");
598606
for (ColumnValuePair columnValuePair : idColumns) {
599-
String name = idColumnLinks.getOrDefault(columnValuePair.column(), columnValuePair.column());
607+
String name = columnValuePair.column();
608+
for (ForeignKey.Link link : idColumnLinks) {
609+
if (link.columnInReferringTable().equals(columnValuePair.column())) {
610+
name = link.columnInReferencedTable();
611+
break;
612+
}
613+
}
600614
sqlBuilder.append("\"").append(name).append("\" = ? AND ");
601615
}
602616
sqlBuilder.setLength(sqlBuilder.length() - 5);
@@ -605,23 +619,47 @@ public void set(String schema, String table, String column, ColumnValuePairs idC
605619
sqlBuilder.append(", ?".repeat(idColumns.getPairs().length));
606620
sqlBuilder.append(")) AS source (\"").append(column).append("\"");
607621
for (ColumnValuePair columnValuePair : idColumns) {
608-
String name = idColumnLinks.getOrDefault(columnValuePair.column(), columnValuePair.column());
622+
String name = columnValuePair.column();
623+
for (ForeignKey.Link link : idColumnLinks) {
624+
if (link.columnInReferringTable().equals(columnValuePair.column())) {
625+
name = link.columnInReferencedTable();
626+
break;
627+
}
628+
}
609629
sqlBuilder.append(", \"").append(name).append("\"");
610630
}
611631
sqlBuilder.append(") ON ");
612632
for (ColumnValuePair columnValuePair : idColumns) {
613-
String name = idColumnLinks.getOrDefault(columnValuePair.column(), columnValuePair.column());
633+
String name = columnValuePair.column();
634+
for (ForeignKey.Link link : idColumnLinks) {
635+
if (link.columnInReferringTable().equals(columnValuePair.column())) {
636+
name = link.columnInReferencedTable();
637+
break;
638+
}
639+
}
614640
sqlBuilder.append("target.\"").append(name).append("\" = source.\"").append(name).append("\" AND ");
615641
}
616642
sqlBuilder.setLength(sqlBuilder.length() - 5);
617643
sqlBuilder.append(" WHEN MATCHED THEN UPDATE SET \"").append(column).append("\" = source.\"").append(column).append("\" WHEN NOT MATCHED THEN INSERT (\"").append(column).append("\"");
618644
for (ColumnValuePair columnValuePair : idColumns) {
619-
String name = idColumnLinks.getOrDefault(columnValuePair.column(), columnValuePair.column());
645+
String name = columnValuePair.column();
646+
for (ForeignKey.Link link : idColumnLinks) {
647+
if (link.columnInReferringTable().equals(columnValuePair.column())) {
648+
name = link.columnInReferencedTable();
649+
break;
650+
}
651+
}
620652
sqlBuilder.append(", \"").append(name).append("\"");
621653
}
622654
sqlBuilder.append(") VALUES (source.\"").append(column).append("\"");
623655
for (ColumnValuePair columnValuePair : idColumns) {
624-
String name = idColumnLinks.getOrDefault(columnValuePair.column(), columnValuePair.column());
656+
String name = columnValuePair.column();
657+
for (ForeignKey.Link link : idColumnLinks) {
658+
if (link.columnInReferringTable().equals(columnValuePair.column())) {
659+
name = link.columnInReferencedTable();
660+
break;
661+
}
662+
}
625663
sqlBuilder.append(", source.\"").append(name).append("\"");
626664
}
627665
sqlBuilder.append(")");
@@ -633,7 +671,7 @@ public void set(String schema, String table, String column, ColumnValuePairs idC
633671
values.add(columnValuePair.value());
634672
}
635673
try {
636-
dataAccessor.executeUpdate(sql, values);
674+
dataAccessor.executeUpdate(sql, values, delay);
637675
} catch (SQLException e) {
638676
throw new RuntimeException(e);
639677
}

src/main/java/net/staticstudios/data/PersistentValue.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package net.staticstudios.data;
22

33
import com.google.common.base.Preconditions;
4+
import net.staticstudios.data.parse.ForeignKey;
45
import net.staticstudios.data.util.*;
56
import org.jetbrains.annotations.ApiStatus;
67
import org.jetbrains.annotations.Nullable;
78

89
import java.util.ArrayList;
910
import java.util.Collections;
1011
import java.util.List;
11-
import java.util.Map;
1212

1313
/**
1414
* A persistent value represents a single cell in a database table.
@@ -29,7 +29,7 @@ static <T> PersistentValue<T> of(UniqueData holder, Class<T> dataType) {
2929
Class<T> getDataType();
3030

3131
@ApiStatus.Internal
32-
Map<String, String> getIdColumnLinks();
32+
List<ForeignKey.Link> getIdColumnLinks();
3333

3434
<U extends UniqueData> PersistentValue<T> onUpdate(Class<U> holderClass, ValueUpdateHandler<U, T> updateHandler);
3535

@@ -41,7 +41,7 @@ class ProxyPersistentValue<T> implements PersistentValue<T> {
4141
protected final Class<T> dataType;
4242
private final List<ValueUpdateHandlerWrapper<?, ?>> updateHandlers = new ArrayList<>();
4343
private @Nullable PersistentValue<T> delegate;
44-
private Map<String, String> idColumnLinks = Collections.emptyMap();
44+
private List<ForeignKey.Link> idColumnLinks = Collections.emptyList();
4545
private long updateIntervalMillis = -1;
4646

4747
public ProxyPersistentValue(UniqueData holder, Class<T> dataType) {
@@ -53,13 +53,7 @@ public void setDelegate(ColumnMetadata columnMetadata, PersistentValue<T> delega
5353
Preconditions.checkNotNull(delegate, "Delegate cannot be null");
5454
Preconditions.checkState(this.delegate == null, "Delegate is already set");
5555
this.delegate = delegate;
56-
PersistentValueMetadata metadata = new PersistentValueMetadata(
57-
holder.getClass(),
58-
columnMetadata.schema(),
59-
columnMetadata.table(),
60-
columnMetadata.name(),
61-
dataType
62-
);
56+
PersistentValueMetadata metadata = new PersistentValueMetadata(delegate.getHolder().getClass(), columnMetadata);
6357

6458
holder.getDataManager().registerUpdateHandler(metadata, updateHandlers);
6559
}
@@ -75,7 +69,7 @@ public Class<T> getDataType() {
7569
}
7670

7771
@Override
78-
public Map<String, String> getIdColumnLinks() {
72+
public List<ForeignKey.Link> getIdColumnLinks() {
7973
return idColumnLinks;
8074
}
8175
//

0 commit comments

Comments
 (0)