@@ -291,9 +291,19 @@ func (c *ClickHouseConnector) GetTransactions(qf QueryFilter) (QueryResult[commo
291291 return executeQuery [common.Transaction ](c , "transactions" , columns , qf , scanTransaction )
292292}
293293
294- func (c * ClickHouseConnector ) GetLogs (qf QueryFilter ) (QueryResult [common.Log ], error ) {
295- columns := "chain_id, block_number, block_hash, block_timestamp, transaction_hash, transaction_index, log_index, address, data, topic_0, topic_1, topic_2, topic_3"
296- return executeQuery [common.Log ](c , "logs" , columns , qf , scanLog )
294+ func (c * ClickHouseConnector ) GetLogs (qf QueryFilter ) (QueryResult [map [string ]interface {}], error ) {
295+ var columns string
296+
297+ if len (qf .GroupBy ) > 0 || len (qf .Aggregates ) > 0 {
298+ // Build columns for SELECT when grouping or aggregating
299+ selectColumns := append (qf .GroupBy , qf .Aggregates ... )
300+ columns = strings .Join (selectColumns , ", " )
301+ } else {
302+ // Default columns when not grouping
303+ columns = "chain_id, block_number, block_hash, block_timestamp, transaction_hash, transaction_index, log_index, address, data, topic_0, topic_1, topic_2, topic_3"
304+ }
305+
306+ return executeQuery [map [string ]interface {}](c , "logs" , columns , qf , scanRowToMap )
297307}
298308
299309func executeQuery [T any ](c * ClickHouseConnector , table , columns string , qf QueryFilter , scanFunc func (driver.Rows ) (T , error )) (QueryResult [T ], error ) {
@@ -346,7 +356,13 @@ func (c *ClickHouseConnector) buildQuery(table, columns string, qf QueryFilter)
346356 query = addFilterParams (key , strings .ToLower (value ), query )
347357 }
348358
349- // Add sort by clause
359+ // Add GROUP BY clause if specified
360+ if len (qf .GroupBy ) > 0 {
361+ groupByColumns := strings .Join (qf .GroupBy , ", " )
362+ query += fmt .Sprintf (" GROUP BY %s" , groupByColumns )
363+ }
364+
365+ // Add ORDER BY clause
350366 if qf .SortBy != "" {
351367 query += fmt .Sprintf (" ORDER BY %s %s" , qf .SortBy , qf .SortOrder )
352368 }
@@ -505,6 +521,27 @@ func scanLog(rows driver.Rows) (common.Log, error) {
505521 return log , nil
506522}
507523
524+ func scanRowToMap (rows driver.Rows ) (map [string ]interface {}, error ) {
525+ columns := rows .Columns ()
526+ values := make ([]interface {}, len (columns ))
527+ valuePtrs := make ([]interface {}, len (columns ))
528+
529+ for i := range columns {
530+ valuePtrs [i ] = & values [i ]
531+ }
532+
533+ if err := rows .Scan (valuePtrs ... ); err != nil {
534+ return nil , err
535+ }
536+
537+ result := make (map [string ]interface {})
538+ for i , col := range columns {
539+ result [col ] = values [i ]
540+ }
541+
542+ return result , nil
543+ }
544+
508545func (c * ClickHouseConnector ) GetMaxBlockNumber (chainId * big.Int ) (maxBlockNumber * big.Int , err error ) {
509546 query := fmt .Sprintf ("SELECT number FROM %s.blocks WHERE is_deleted = 0" , c .cfg .Database )
510547 if chainId .Sign () > 0 {
0 commit comments