@@ -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 }
0 commit comments