1
1
use deltalake:: DeltaTableError ;
2
2
use deltalake:: datafusion:: common:: Column ;
3
- use deltalake:: datafusion:: prelude:: SessionContext ;
3
+ use deltalake:: datafusion:: prelude:: { SessionContext , col } ;
4
4
use deltalake:: operations:: merge:: MergeBuilder ;
5
5
use deltalake:: { DeltaResult , DeltaTable , datafusion:: prelude:: Expr } ;
6
6
use etl:: types:: { TableRow as PgTableRow , TableSchema as PgTableSchema } ;
@@ -19,7 +19,7 @@ pub async fn merge_to_table(
19
19
let rows = TableRowEncoder :: encode_table_rows ( table_schema, upsert_rows) ?;
20
20
21
21
let ctx = SessionContext :: new ( ) ;
22
- let batch = ctx. read_batch ( rows) ?;
22
+ let batch = ctx. read_batch ( rows. clone ( ) ) ?;
23
23
24
24
// TODO(abhi): We should proabbly be passing this information in
25
25
let primary_keys = table_schema
@@ -40,12 +40,27 @@ pub async fn merge_to_table(
40
40
batch,
41
41
) ;
42
42
43
+ // TODO(abhi): Clean up this mess
44
+ let all_columns: Vec < String > = table_schema
45
+ . column_schemas
46
+ . iter ( )
47
+ . map ( |col| col. name . clone ( ) )
48
+ . collect ( ) ;
49
+
43
50
let mut merge_builder = merge_builder
44
51
. with_writer_properties ( config. clone ( ) . into ( ) )
45
52
. with_source_alias ( "source" )
46
53
. with_target_alias ( "target" )
47
- . when_not_matched_insert ( |insert| insert) ?
48
- . when_matched_update ( |update| update) ?;
54
+ . when_not_matched_insert ( |insert| {
55
+ all_columns. iter ( ) . fold ( insert, |insert, column| {
56
+ insert. set ( column. clone ( ) , col ( format ! ( "source.{}" , column. clone( ) ) ) )
57
+ } )
58
+ } ) ?
59
+ . when_matched_update ( |update| {
60
+ all_columns. iter ( ) . fold ( update, |update, column| {
61
+ update. update ( column. clone ( ) , col ( format ! ( "source.{}" , column. clone( ) ) ) )
62
+ } )
63
+ } ) ?;
49
64
50
65
if let Some ( delete_predicate) = delete_predicate {
51
66
merge_builder = merge_builder
0 commit comments