wormhole-explorer/api/handlers/transactions/queries.go

109 lines
3.5 KiB
Go

package transactions
import (
"fmt"
"time"
)
// queryTemplateVaaCount1d1h is the query used to get the last VAA count and the aggregated VAA count for the last 24 hours by hour.
const queryTemplateVaaCount1d1h = `
lastVaaCount = from(bucket: "%s")
|> range(start: %s)
|> filter(fn: (r) => r["_measurement"] == "vaa_count")
|> group()
|> aggregateWindow(every: %s, fn: count, createEmpty: true)
aggregatesVaaCount = from(bucket: "%s")
|> range(start: %s)
|> filter(fn: (r) => r["_measurement"] == "vaa_count_1h")
union(tables: [aggregatesVaaCount, lastVaaCount])
|> group()
|> sort(columns: ["_time"], desc: true)
`
// queryTemplateVaaCount1d1h is the query used to get the last VAA count and the aggregated VAA count for 1 week or month by day.
const queryTemplateVaaCount = `
lastVaaCount = from(bucket: "%s")
|> range(start: %s)
|> filter(fn: (r) => r["_measurement"] == "vaa_count")
|> group()
aggregatesVaaCount = from(bucket: "%s")
|> range(start: %s)
|> filter(fn: (r) => r["_measurement"] == "vaa_count_1h")
|> aggregateWindow(every: 1h, fn: sum, createEmpty: true)
union(tables: [aggregatesVaaCount, lastVaaCount])
|> group()
|> aggregateWindow(every: 1d, fn: sum, createEmpty: true)
|> sort(columns: ["_time"], desc: true)
`
func buildLastTrxQuery(bucket string, tm time.Time, q *TransactionCountQuery) string {
startLastVaa, startAggregatesVaa := createRangeQuery(tm, q.TimeSpan)
if q.TimeSpan == "1d" && q.SampleRate == "1h" {
return fmt.Sprintf(queryTemplateVaaCount1d1h, bucket, startLastVaa, q.SampleRate, bucket, startAggregatesVaa)
}
return fmt.Sprintf(queryTemplateVaaCount, bucket, startLastVaa, bucket, startAggregatesVaa)
}
func createRangeQuery(t time.Time, timeSpan string) (string, string) {
const format = time.RFC3339Nano
var startLastVaa, startAggregatesVaa time.Time
switch timeSpan {
case "1w":
startLastVaa = t.Truncate(time.Hour * 24)
startAggregatesVaa = startLastVaa.Add(-time.Hour * 24 * 7)
case "1mo":
startLastVaa = t.Truncate(time.Hour * 24)
startAggregatesVaa = startLastVaa.Add(-time.Hour * 24 * 30)
default:
startLastVaa = t.Truncate(time.Hour * 1)
startAggregatesVaa = startLastVaa.Add(-time.Hour * 24)
}
return startLastVaa.Format(format), startAggregatesVaa.Format(format)
}
const queryTemplateTotalTrxCount = `
current = from(bucket: "%s")
|> range(start: %s)
|> filter(fn: (r) => r["_measurement"] == "vaa_volume_v2")
|> filter(fn: (r) => r["_field"] == "volume")
|> group()
|> count()
last = from(bucket: "%s")
|> range(start: -1mo)
|> filter(fn: (r) => r["_measurement"] == "total_tx_count_v2")
|> last()
union(tables: [current, last])
|> group()
|> sum()
`
func buildTotalTrxCountQuery(bucketForever, bucket30Days string, t time.Time) string {
start := t.Truncate(time.Hour * 24).Format(time.RFC3339Nano)
return fmt.Sprintf(queryTemplateTotalTrxCount, bucketForever, start, bucket30Days)
}
const queryTemplateTotalTrxVolume = `
current = from(bucket: "%s")
|> range(start: %s)
|> filter(fn: (r) => r["_measurement"] == "vaa_volume_v2")
|> filter(fn: (r) => r["_field"] == "volume")
|> group()
|> sum()
last = from(bucket: "%s")
|> range(start: -1mo)
|> filter(fn: (r) => r["_measurement"] == "total_tx_volume_v2")
|> last()
union(tables: [current, last])
|> group()
|> sum()
`
func buildTotalTrxVolumeQuery(bucketForever, bucket30Days string, t time.Time) string {
start := t.Truncate(time.Hour * 24).Format(time.RFC3339Nano)
return fmt.Sprintf(queryTemplateTotalTrxVolume, bucketForever, start, bucket30Days)
}