@@ -52,7 +52,7 @@ typedef enum {
52
52
53
53
typedef enum {
54
54
AD_FS = 0 , AD_FSS , AD_NFEATURES , AD_FEATURES , AD_TARGETS , AD_RELIABILITY ,
55
- AD_OIDS , AD_TOTAL_NCOLS
55
+ AD_OIDS , AD_PREV_FS , AD_NEXT_FS , AD_TOTAL_NCOLS
56
56
} aqo_data_cols ;
57
57
58
58
typedef enum {
@@ -74,6 +74,7 @@ dsa_area *qtext_dsa = NULL;
74
74
HTAB * data_htab = NULL ;
75
75
dsa_area * data_dsa = NULL ;
76
76
HTAB * deactivated_queries = NULL ;
77
+ HTAB * fss_neighbours = NULL ;
77
78
78
79
/* Used to check data file consistency */
79
80
static const uint32 PGAQO_FILE_HEADER = 123467589 ;
@@ -1293,13 +1294,15 @@ aqo_data_store(uint64 fs, int fss, OkNNrdata *data, List *reloids)
1293
1294
DataEntry * entry ;
1294
1295
bool found ;
1295
1296
data_key key = {.fs = fs , .fss = fss };
1297
+ fs_list neighbour_list = {0 };
1296
1298
int i ;
1297
1299
char * ptr ;
1298
1300
ListCell * lc ;
1299
1301
size_t size ;
1300
1302
bool tblOverflow ;
1301
1303
HASHACTION action ;
1302
1304
bool result ;
1305
+ DataEntry * * prev ;
1303
1306
1304
1307
Assert (!LWLockHeldByMe (& aqo_state -> data_lock ));
1305
1308
@@ -1383,12 +1386,32 @@ aqo_data_store(uint64 fs, int fss, OkNNrdata *data, List *reloids)
1383
1386
ptr = (char * ) dsa_get_address (data_dsa , entry -> data_dp );
1384
1387
Assert (ptr != NULL );
1385
1388
1389
+ /*
1390
+ * Find prev fss
1391
+ */
1392
+
1393
+ prev = (DataEntry * * ) hash_search (fss_neighbours , & fss , HASH_ENTER , & found );
1394
+ if (!found )
1395
+ {
1396
+ * prev = entry ;
1397
+ }
1398
+ else
1399
+ {
1400
+ (* prev )-> list .next_fs = fss ;
1401
+ }
1402
+ neighbour_list .prev_fs = (* prev )-> key .fs ;
1403
+
1404
+ prev = (DataEntry * * ) hash_search (fss_neighbours , & fss , HASH_FIND , & found );
1405
+ elog (NOTICE , "%d" , found );
1406
+
1386
1407
/*
1387
1408
* Copy AQO data into allocated DSA segment
1388
1409
*/
1389
1410
1390
1411
memcpy (ptr , & key , sizeof (data_key )); /* Just for debug */
1391
1412
ptr += sizeof (data_key );
1413
+ memcpy (ptr ,& neighbour_list , sizeof (fs_list ));
1414
+ ptr += sizeof (fs_list );
1392
1415
if (entry -> cols > 0 )
1393
1416
{
1394
1417
for (i = 0 ; i < entry -> rows ; i ++ )
@@ -1652,6 +1675,8 @@ aqo_data(PG_FUNCTION_ARGS)
1652
1675
values [AD_FS ] = Int64GetDatum (entry -> key .fs );
1653
1676
values [AD_FSS ] = Int32GetDatum ((int ) entry -> key .fss );
1654
1677
values [AD_NFEATURES ] = Int32GetDatum (entry -> cols );
1678
+ values [AD_PREV_FS ] = Int64GetDatum (entry -> list .prev_fs );
1679
+ values [AD_NEXT_FS ] = Int64GetDatum (entry -> list .next_fs );
1655
1680
1656
1681
/* Fill values from the DSA data chunk */
1657
1682
Assert (DsaPointerIsValid (entry -> data_dp ));
@@ -2135,6 +2160,8 @@ cleanup_aqo_database(bool gentle, int *fs_num, int *fss_num)
2135
2160
foreach (lc , junk_fss )
2136
2161
{
2137
2162
data_key key = {.fs = entry -> fs , .fss = lfirst_int (lc )};
2163
+ //TODO fix fs list
2164
+ hash_search (fss_neighbours , & lfirst_int (lc ), HASH_REMOVE , NULL );
2138
2165
(* fss_num ) += (int ) _aqo_data_remove (& key );
2139
2166
}
2140
2167
0 commit comments