service backend
All checks were successful
ci/woodpecker/push/db Pipeline was successful
ci/woodpecker/push/nats Pipeline was successful

This commit is contained in:
Stephan D
2025-11-07 18:35:26 +01:00
parent 20e8f9acc4
commit 62a6631b9a
537 changed files with 48453 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
package tseries
import (
"context"
"github.com/tech/sendico/pkg/db/internal/mongo/tseriesimp"
tsoptions "github.com/tech/sendico/pkg/db/tseries/options"
"go.mongodb.org/mongo-driver/mongo"
)
func CreateMongoTimeSeries(ctx context.Context, db *mongo.Database, tsOpts *tsoptions.Options) (TimeSeries, error) {
return tseriesimp.NewMongoTimeSeriesCollection(ctx, db, tsOpts)
}

View File

@@ -0,0 +1,23 @@
package tsoptions
import (
"time"
)
type Granularity string
const (
TSGSeconds Granularity = "seconds"
TSGMinutes Granularity = "minutes"
TSGHours Granularity = "hours"
)
func (t Granularity) String() string { return string(t) }
type Options struct {
Collection string
TimeField string
Granularity Granularity
MetaField string // optional, can be empty
ExpireAfter time.Duration // optional, zero means no TTL
}

View File

@@ -0,0 +1,14 @@
package tspoint
import (
"time"
)
type TimePoint interface {
GetTimeStamp() time.Time
}
type TimePointWithMeta[T any] interface {
GetTimeStamp() time.Time
GetMeta() T
}

View File

@@ -0,0 +1 @@
package tseries

View File

@@ -0,0 +1,29 @@
package tseries
import (
"context"
"time"
"github.com/tech/sendico/pkg/db/repository/builder"
rdecoder "github.com/tech/sendico/pkg/db/repository/decoder"
tspoint "github.com/tech/sendico/pkg/db/tseries/point"
)
// TimeSeries[T] abstracts a Mongo time-series “bucket” of documents of type T.
type TimeSeries interface {
// Aggregate runs an aggregation pipeline on the time-series
Aggregate(ctx context.Context, builder builder.Pipeline, decoder rdecoder.DecodingFunc) error
// Insert adds a single point into the series.
Insert(ctx context.Context, point tspoint.TimePoint) error
// InsertMany adds multiple points in one bulk operation.
InsertMany(ctx context.Context, points []tspoint.TimePoint) error
// Query fetches all points whose timeField lies in [from, to).
// The 'filter' param is an optional Mongo-style query on meta or other fields.
Query(
ctx context.Context,
decoder rdecoder.DecodingFunc,
filter builder.Query,
from, to *time.Time,
) error
}