Skip to content

Commit a9ec525

Browse files
authored
Merge pull request #25 from gigapi/feat/metadata
Feat/metadata
2 parents 5896a10 + c937563 commit a9ec525

4 files changed

Lines changed: 50 additions & 57 deletions

File tree

go.mod

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ go 1.24.2
44

55
require (
66
github.com/apache/arrow/go/v14 v14.0.2
7-
github.com/gigapi/gigapi-config v0.0.6
7+
github.com/gigapi/gigapi-config v0.0.7
88
github.com/gigapi/gigapi/v2 v2.0.13
9+
github.com/gigapi/metadata v0.0.3
910
github.com/marcboeker/go-duckdb/v2 v2.2.0
1011
github.com/spf13/afero v1.12.0
1112
github.com/stretchr/testify v1.10.0
@@ -16,7 +17,9 @@ require (
1617

1718
require (
1819
github.com/apache/arrow-go/v18 v18.1.0 // indirect
20+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1921
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
22+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
2023
github.com/duckdb/duckdb-go-bindings v0.1.14 // indirect
2124
github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.9 // indirect
2225
github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.9 // indirect
@@ -29,15 +32,19 @@ require (
2932
github.com/google/flatbuffers v25.1.24+incompatible // indirect
3033
github.com/google/uuid v1.6.0 // indirect
3134
github.com/hashicorp/hcl v1.0.0 // indirect
35+
github.com/json-iterator/go v1.1.12 // indirect
3236
github.com/klauspost/compress v1.18.0 // indirect
3337
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
3438
github.com/magiconair/properties v1.8.7 // indirect
3539
github.com/marcboeker/go-duckdb/arrowmapping v0.0.7 // indirect
3640
github.com/marcboeker/go-duckdb/mapping v0.0.7 // indirect
3741
github.com/mitchellh/mapstructure v1.5.0 // indirect
42+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
43+
github.com/modern-go/reflect2 v1.0.2 // indirect
3844
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
3945
github.com/pierrec/lz4/v4 v4.1.22 // indirect
4046
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
47+
github.com/redis/go-redis/v9 v9.8.0 // indirect
4148
github.com/sagikazarmark/locafero v0.4.0 // indirect
4249
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
4350
github.com/sourcegraph/conc v0.3.0 // indirect

go.sum

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,18 @@ github.com/apache/arrow/go/v14 v14.0.2 h1:N8OkaJEOfI3mEZt07BIkvo4sC6XDbL+48MBPWO
66
github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY=
77
github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE=
88
github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw=
9+
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
10+
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
11+
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
12+
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
13+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
14+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
915
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1016
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1117
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
1218
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
19+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
20+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
1321
github.com/duckdb/duckdb-go-bindings v0.1.14 h1:57DCZuuKQ65gRQxFG+XGnqVQtMADKY/noozmCjYs+zE=
1422
github.com/duckdb/duckdb-go-bindings v0.1.14/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc=
1523
github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.9 h1:K95YlR28Fb3+n3D6RcBzdznNVGcCnrGaAZqs52JUFOs=
@@ -28,10 +36,12 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
2836
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
2937
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
3038
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
31-
github.com/gigapi/gigapi-config v0.0.6 h1:WTDJZt70uEbCLwikSKMwWYysZtfp7AoLOLtNiurX6qA=
32-
github.com/gigapi/gigapi-config v0.0.6/go.mod h1:/hD+d1odWyElSP9++ZPLULXthWHXvx0shNypdbZDYA8=
39+
github.com/gigapi/gigapi-config v0.0.7 h1:JBygAXojXdTmxhKe2vTSvXoPZU0D7kLWl9+E+PuUQJs=
40+
github.com/gigapi/gigapi-config v0.0.7/go.mod h1:/hD+d1odWyElSP9++ZPLULXthWHXvx0shNypdbZDYA8=
3341
github.com/gigapi/gigapi/v2 v2.0.13 h1:m4w2Sx+AQZl+SPS+5oCtCe7G1888/2nF6m+d1vsiHlQ=
3442
github.com/gigapi/gigapi/v2 v2.0.13/go.mod h1:xoh5uz+EQCK43cI08wMJlyhAZ1368OOPlJjmOr1TGis=
43+
github.com/gigapi/metadata v0.0.3 h1:foO8cD4JT3HbzGUkpEda7jHgiGXpaK74t4x4cSMxO3o=
44+
github.com/gigapi/metadata v0.0.3/go.mod h1:LGFPrq9868U3+4S5DdoL1/aU3Ua0mXsRVblXXzCK1i0=
3545
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
3646
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
3747
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
@@ -48,13 +58,16 @@ github.com/google/flatbuffers v25.1.24+incompatible h1:4wPqL3K7GzBd1CwyhSd3usxLK
4858
github.com/google/flatbuffers v25.1.24+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
4959
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
5060
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
61+
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
5162
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
5263
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
5364
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
5465
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
5566
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
5667
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
5768
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
69+
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
70+
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
5871
github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4=
5972
github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
6073
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
@@ -81,6 +94,11 @@ github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8D
8194
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
8295
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
8396
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
97+
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
98+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
99+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
100+
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
101+
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
84102
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
85103
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
86104
github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
@@ -90,6 +108,8 @@ github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFu
90108
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
91109
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
92110
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
111+
github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhicI=
112+
github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
93113
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
94114
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
95115
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
@@ -113,6 +133,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS
113133
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
114134
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
115135
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
136+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
116137
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
117138
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
118139
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=

querier/queryClient.go

Lines changed: 19 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"database/sql"
77
"encoding/json"
88
"fmt"
9+
"github.com/gigapi/gigapi-config/config"
10+
"github.com/gigapi/metadata"
911
"log"
1012
"os"
1113
"path/filepath"
@@ -390,15 +392,20 @@ func (q *QueryClient) enumFolderNoMetadata(path string) ([]string, error) {
390392
return res, nil
391393
}
392394

395+
func getIndex(db, measurement string) (metadata.TableIndex, error) {
396+
switch config.Config.Gigapi.Metadata.Type {
397+
case "json":
398+
return metadata.NewJSONIndex(config.Config.Gigapi.Root, db, measurement), nil
399+
case "redis":
400+
return metadata.NewRedisIndex(config.Config.Gigapi.Metadata.URL, db, measurement)
401+
}
402+
return nil, fmt.Errorf("Unsupported index " + config.Config.Gigapi.Metadata.Type)
403+
}
404+
393405
// Find relevant parquet files based on time range
394406
func (q *QueryClient) FindRelevantFiles(ctx context.Context, dbName, measurement string,
395407
timeRange TimeRange) ([]string, error) {
396408
// If no time range specified, get all files
397-
if timeRange.Start == nil && timeRange.End == nil {
398-
log.Printf("No time range specified, getting all files for %s.%s", dbName, measurement)
399-
return q.findAllFiles(ctx, dbName, measurement)
400-
}
401-
402409
var relevantFiles []string
403410
// log.Printf("Getting relevant files for %s.%s within time range %v to %v", dbName, measurement,
404411
// time.Unix(0, *timeRange.Start), time.Unix(0, *timeRange.End))
@@ -408,65 +415,23 @@ func (q *QueryClient) FindRelevantFiles(ctx context.Context, dbName, measurement
408415
}()
409416

410417
// Convert nanosecond timestamps to time.Time for directory parsing
411-
var startDate, endDate time.Time
418+
var opts metadata.QueryOptions
412419
if timeRange.Start != nil {
413-
startDate = time.Unix(0, *timeRange.Start)
414-
} else {
415-
startDate = time.Unix(0, 0) // Beginning of epoch
420+
opts.After = time.Unix(0, *timeRange.Start)
416421
}
417422

418423
if timeRange.End != nil {
419-
endDate = time.Unix(0, *timeRange.End)
420-
} else {
421-
endDate = time.Now() // Current time
424+
opts.Before = time.Unix(0, *timeRange.End)
422425
}
423426

424-
// Get all date directories that might contain relevant data
425-
// log.Printf("Looking for date directories between %v and %v", startDate, endDate)
426-
dateDirectories, err := q.getDateDirectoriesInRange(dbName, measurement, startDate, endDate)
427+
idx, err := getIndex(dbName, measurement)
427428
if err != nil {
428-
log.Printf("Failed to get date directories: %v", err)
429429
return nil, err
430430
}
431-
// log.Printf("Found %d date directories", len(dateDirectories))
432-
433-
for _, dateDir := range dateDirectories {
434-
// For each date directory, get all hour directories
435-
datePath := filepath.Join(q.DataDir, dbName, measurement, dateDir)
436-
// log.Printf("Processing date directory: %s", datePath)
437-
438-
hourDirs, err := q.getHourDirectoriesInRange(datePath, startDate, endDate)
439-
if err != nil {
440-
log.Printf("Failed to get hour directories for %s: %v", datePath, err)
441-
continue // Skip this directory on error
442-
}
443-
// log.Printf("Found %d hour directories in %s", len(hourDirs), dateDir)
444-
445-
for _, hourDir := range hourDirs {
446-
hourPath := filepath.Join(datePath, hourDir)
447-
// log.Printf("Processing hour directory: %s", hourPath)
448431

449-
// Read metadata.json
450-
metadataPath := filepath.Join(hourPath, "metadata.json")
451-
if _, err := os.Stat(metadataPath); err == nil {
452-
// log.Printf("Found metadata.json in %s", hourPath)
453-
_relevantFiles, err := q.enumFolderWithMetadata(metadataPath, timeRange)
454-
if err == nil {
455-
// log.Printf("Found %d files in metadata.json", len(_relevantFiles))
456-
relevantFiles = append(relevantFiles, _relevantFiles...)
457-
continue
458-
}
459-
log.Printf("Failed to read metadata.json: %v", err)
460-
}
461-
462-
_relevantFiles, err := q.enumFolderNoMetadata(hourPath)
463-
if err == nil {
464-
// log.Printf("Found %d files without metadata", len(_relevantFiles))
465-
relevantFiles = append(relevantFiles, _relevantFiles...)
466-
continue
467-
}
468-
log.Printf("Failed to enumerate folder: %v", err)
469-
}
432+
ies, err := idx.GetQuerier().Query(opts)
433+
for _, ie := range ies {
434+
relevantFiles = append(relevantFiles, filepath.Join(config.Config.Gigapi.Root, dbName, measurement, "data", ie.Path))
470435
}
471436

472437
if len(relevantFiles) == 0 {

querier/ui.zip

-1.05 MB
Binary file not shown.

0 commit comments

Comments
 (0)