| package clickhouse | |
| import ( | |
| "fmt" | |
| "time" | |
| "github.com/huandu/go-sqlbuilder" | |
| meterpkg "github.com/openmeterio/openmeter/openmeter/meter" | |
| ) | |
| type listSubjectsQuery struct { | |
| Database string | |
| EventsTableName string | |
| Namespace string | |
| Meter *meterpkg.Meter | |
| From *time.Time | |
| To *time.Time | |
| Search *string | |
| } | |
| func (d listSubjectsQuery) toSQL() (string, []interface{}) { | |
| tableName := getTableName(d.Database, d.EventsTableName) | |
| sb := sqlbuilder.ClickHouse.NewSelectBuilder() | |
| sb.Select("DISTINCT subject") | |
| sb.Where(sb.Equal("namespace", d.Namespace)) | |
| // If we have a meter, we add the type filter | |
| if d.Meter != nil { | |
| sb.Where(sb.Equal("type", d.Meter.EventType)) | |
| } | |
| sb.From(tableName) | |
| sb.OrderBy("subject") | |
| if d.From != nil { | |
| sb.Where(sb.GreaterEqualThan("time", d.From.Unix())) | |
| } | |
| if d.To != nil { | |
| sb.Where(sb.LessThan("time", d.To.Unix())) | |
| } | |
| if d.Search != nil && *d.Search != "" { | |
| sb.Where(fmt.Sprintf("positionCaseInsensitive(subject, %s) > 0", sb.Var(*d.Search))) | |
| } | |
| sql, args := sb.Build() | |
| return sql, args | |
| } | |