Skip to content

Commit aefed78

Browse files
committed
feat: enable aggregates and group_by
1 parent bd55ca1 commit aefed78

File tree

5 files changed

+45
-8
lines changed

5 files changed

+45
-8
lines changed

api/api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type QueryParams struct {
3030
// @Description Map of filter parameters
3131
FilterParams map[string]string `schema:"-"`
3232
// @Description Field to group results by
33-
GroupBy string `schema:"group_by"`
33+
GroupBy []string `schema:"group_by"`
3434
// @Description Field to sort results by
3535
SortBy string `schema:"sort_by"`
3636
// @Description Sort order (asc or desc)

internal/handlers/logs_handlers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func handleLogsRequest(c *gin.Context, contractAddress, signature string) {
135135

136136
logs, err := mainStorage.GetLogs(storage.QueryFilter{
137137
FilterParams: queryParams.FilterParams,
138-
GroupBy: []string{queryParams.GroupBy},
138+
GroupBy: queryParams.GroupBy,
139139
SortBy: queryParams.SortBy,
140140
SortOrder: queryParams.SortOrder,
141141
Page: queryParams.Page,

internal/handlers/transactions_handlers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func handleTransactionsRequest(c *gin.Context, contractAddress, signature string
136136

137137
result, err := mainStorage.GetTransactions(storage.QueryFilter{
138138
FilterParams: queryParams.FilterParams,
139-
GroupBy: []string{queryParams.GroupBy},
139+
GroupBy: queryParams.GroupBy,
140140
SortBy: queryParams.SortBy,
141141
SortOrder: queryParams.SortOrder,
142142
Page: queryParams.Page,

internal/storage/clickhouse.go

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

299309
func 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+
508545
func (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 {

internal/storage/connector.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ type IMainStorage interface {
5454

5555
GetBlocks(qf QueryFilter) (blocks []common.Block, err error)
5656
GetTransactions(qf QueryFilter) (transactions QueryResult[common.Transaction], err error)
57-
GetLogs(qf QueryFilter) (logs QueryResult[common.Log], err error)
57+
GetLogs(qf QueryFilter) (logs QueryResult[map[string]interface{}], err error)
5858
GetTraces(qf QueryFilter) (traces []common.Trace, err error)
5959
GetMaxBlockNumber(chainId *big.Int) (maxBlockNumber *big.Int, err error)
6060
/**

0 commit comments

Comments
 (0)