11package io .cloudquery .memdb ;
22
3+ import io .cloudquery .messages .WriteInsert ;
34import io .cloudquery .messages .WriteMessage ;
45import io .cloudquery .messages .WriteMigrateTable ;
56import io .cloudquery .schema .ClientMeta ;
7+ import io .cloudquery .schema .Resource ;
68import io .cloudquery .schema .Table ;
79import io .cloudquery .schema .TableColumnChange ;
810import java .util .ArrayList ;
911import java .util .HashMap ;
1012import java .util .List ;
1113import java .util .Map ;
1214import java .util .concurrent .locks .ReentrantReadWriteLock ;
13- import org .apache .arrow .vector .VectorSchemaRoot ;
1415
1516public class MemDBClient implements ClientMeta {
1617 private static final String id = "memdb" ;
1718
1819 private ReentrantReadWriteLock lock = new ReentrantReadWriteLock ();
1920 private Map <String , Table > tables = new HashMap <>();
20- private Map <String , List <VectorSchemaRoot >> memDB = new HashMap <>();
21+ private Map <String , List <Resource >> memDB = new HashMap <>();
2122
2223 public MemDBClient () {}
2324
@@ -28,34 +29,69 @@ public String getId() {
2829
2930 @ Override
3031 public void write (WriteMessage message ) {
31- if (message instanceof WriteMigrateTable migrateTable ) {
32- migrate (migrateTable );
32+ lock .writeLock ().lock ();
33+ try {
34+ if (message instanceof WriteMigrateTable migrateTable ) {
35+ migrate (migrateTable );
36+ }
37+ if (message instanceof WriteInsert insert ) {
38+ insert (insert );
39+ }
40+ } finally {
41+ lock .writeLock ().unlock ();
3342 }
3443 }
3544
36- public void close () {
37- // do nothing
45+ private void insert (WriteInsert insert ) {
46+ String tableName = insert .getResource ().getTable ().getName ();
47+ Table table = tables .get (tableName );
48+ overwrite (table , insert .getResource ());
3849 }
3950
40- private void migrate (WriteMigrateTable migrateTable ) {
41- lock .writeLock ().lock ();
42- try {
43- Table table = migrateTable .getTable ();
44- String tableName = table .getName ();
45- if (!memDB .containsKey (tableName )) {
46- memDB .put (tableName , new ArrayList <>());
47- tables .put (tableName , table );
48- return ;
49- }
51+ private void overwrite (Table table , Resource resource ) {
52+ String tableName = table .getName ();
53+ List <Integer > pkIndexes = table .primaryKeyIndexes ();
54+ if (pkIndexes .isEmpty ()) {
55+ memDB .get (tableName ).add (resource );
56+ return ;
57+ }
5058
51- List <TableColumnChange > changes = table .getChanges (tables .get (tableName ));
52- if (changes .isEmpty ()) {
59+ for (int i = 0 ; i < memDB .get (tableName ).size (); i ++) {
60+ boolean found = true ;
61+ for (int pkIndex : pkIndexes ) {
62+ String s1 = resource .getTable ().getColumns ().get (pkIndex ).getName ();
63+ String s2 = memDB .get (tableName ).get (i ).getTable ().getColumns ().get (pkIndex ).getName ();
64+ if (!s1 .equals (s2 )) {
65+ found = false ;
66+ }
67+ }
68+ if (found ) {
69+ memDB .get (tableName ).remove (i );
70+ memDB .get (tableName ).add (resource );
5371 return ;
5472 }
73+ }
74+ memDB .get (tableName ).add (resource );
75+ }
76+
77+ public void close () {
78+ // do nothing
79+ }
80+
81+ private void migrate (WriteMigrateTable migrateTable ) {
82+ Table table = migrateTable .getTable ();
83+ String tableName = table .getName ();
84+ if (!memDB .containsKey (tableName )) {
5585 memDB .put (tableName , new ArrayList <>());
5686 tables .put (tableName , table );
57- } finally {
58- lock .writeLock ().unlock ();
87+ return ;
88+ }
89+
90+ List <TableColumnChange > changes = table .getChanges (tables .get (tableName ));
91+ if (changes .isEmpty ()) {
92+ return ;
5993 }
94+ memDB .put (tableName , new ArrayList <>());
95+ tables .put (tableName , table );
6096 }
6197}
0 commit comments