Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
8de83cc290
|
|||
603ec82b83
|
|||
93c4cf31a8
|
|||
dc2d8a9103
|
|||
6589e8d5cd
|
|||
0006c6859d
|
|||
827b3fc1b7
|
@@ -1,5 +1,5 @@
|
|||||||
package goext
|
package goext
|
||||||
|
|
||||||
const GoextVersion = "0.0.148"
|
const GoextVersion = "0.0.155"
|
||||||
|
|
||||||
const GoextVersionTimestamp = "2023-06-07T17:22:38+0200"
|
const GoextVersionTimestamp = "2023-06-08T16:26:06+0200"
|
||||||
|
@@ -46,10 +46,14 @@ func (pss PrimitiveStringSerializer) ValueToString(v any) (string, error) {
|
|||||||
|
|
||||||
func (pss PrimitiveStringSerializer) ValueFromString(str string, outType reflect.Type) (any, error) {
|
func (pss PrimitiveStringSerializer) ValueFromString(str string, outType reflect.Type) (any, error) {
|
||||||
|
|
||||||
if str == "" {
|
if outType.Kind() == reflect.Ptr && str == "" {
|
||||||
return reflect.Zero(outType).Interface(), nil // = nil.(outType), nil
|
return reflect.Zero(outType).Interface(), nil // = nil.(outType), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if str == "" {
|
||||||
|
return reflect.Zero(outType).Interface(), nil // = <default>(outType), nil
|
||||||
|
}
|
||||||
|
|
||||||
if outType.Kind() == reflect.Ptr {
|
if outType.Kind() == reflect.Ptr {
|
||||||
|
|
||||||
innerValue, err := pss.ValueFromString(str, outType.Elem())
|
innerValue, err := pss.ValueFromString(str, outType.Elem())
|
||||||
|
@@ -2,13 +2,17 @@ package wmo
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"go.mongodb.org/mongo-driver/bson/bsontype"
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
ct "gogs.mikescher.com/BlackForestBytes/goext/cursortoken"
|
ct "gogs.mikescher.com/BlackForestBytes/goext/cursortoken"
|
||||||
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
||||||
"reflect"
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
type EntityID = any
|
type EntityID interface {
|
||||||
|
MarshalBSONValue() (bsontype.Type, []byte, error)
|
||||||
|
String() string
|
||||||
|
}
|
||||||
|
|
||||||
type fullTypeRef[TData any] struct {
|
type fullTypeRef[TData any] struct {
|
||||||
IsPointer bool
|
IsPointer bool
|
||||||
|
@@ -69,7 +69,7 @@ func CreatePagination[TData any](coll *Coll[TData], token ct.CursorToken, fieldP
|
|||||||
} else if token.Mode == ct.CTMEnd {
|
} else if token.Mode == ct.CTMEnd {
|
||||||
|
|
||||||
// false
|
// false
|
||||||
pipeline = append(pipeline, bson.D{{Key: "$match", Value: bson.M{"$eq": bson.A{"1", "0"}}}})
|
pipeline = append(pipeline, bson.D{{Key: "$match", Value: bson.M{"$expr": bson.M{"$eq": bson.A{"1", "0"}}}}})
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@@ -6,7 +6,7 @@ import (
|
|||||||
"go.mongodb.org/mongo-driver/mongo"
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *Coll[TData]) DeleteOne(ctx context.Context, id EntityID) error {
|
func (c *Coll[TData]) DeleteOneByID(ctx context.Context, id EntityID) error {
|
||||||
_, err := c.coll.DeleteOne(ctx, bson.M{"_id": id})
|
_, err := c.coll.DeleteOne(ctx, bson.M{"_id": id})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -15,6 +15,15 @@ func (c *Coll[TData]) DeleteOne(ctx context.Context, id EntityID) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Coll[TData]) DeleteOne(ctx context.Context, filterQuery bson.M) error {
|
||||||
|
_, err := c.coll.DeleteOne(ctx, filterQuery)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Coll[TData]) DeleteMany(ctx context.Context, filterQuery bson.M) (*mongo.DeleteResult, error) {
|
func (c *Coll[TData]) DeleteMany(ctx context.Context, filterQuery bson.M) (*mongo.DeleteResult, error) {
|
||||||
res, err := c.coll.DeleteMany(ctx, filterQuery)
|
res, err := c.coll.DeleteMany(ctx, filterQuery)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -37,7 +37,7 @@ func (c *Coll[TData]) List(ctx context.Context, filter ct.Filter, pageSize *int,
|
|||||||
return nil, ct.CursorToken{}, err
|
return nil, ct.CursorToken{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
entities := make([]TData, 0, cursor.RemainingBatchLength()+1)
|
entities := make([]TData, 0, cursor.RemainingBatchLength())
|
||||||
for (pageSize == nil || len(entities) != *pageSize) && cursor.Next(ctx) {
|
for (pageSize == nil || len(entities) != *pageSize) && cursor.Next(ctx) {
|
||||||
var entry TData
|
var entry TData
|
||||||
err = cursor.Decode(&entry)
|
err = cursor.Decode(&entry)
|
||||||
@@ -47,13 +47,16 @@ func (c *Coll[TData]) List(ctx context.Context, filter ct.Filter, pageSize *int,
|
|||||||
entities = append(entities, entry)
|
entities = append(entities, entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
if pageSize == nil || len(entities) <= *pageSize || !cursor.TryNext(ctx) {
|
if pageSize == nil || len(entities) < *pageSize || !cursor.TryNext(ctx) {
|
||||||
return entities, ct.End(), nil
|
return entities, ct.End(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
last := entities[len(entities)-1]
|
last := entities[len(entities)-1]
|
||||||
|
|
||||||
nextToken, _ := c.createToken(sortPrimary, sortDirPrimary, sortSecondary, sortDirSecondary, last, pageSize)
|
nextToken, err := c.createToken(sortPrimary, sortDirPrimary, sortSecondary, sortDirSecondary, last, pageSize)
|
||||||
|
if err != nil {
|
||||||
|
return nil, ct.CursorToken{}, err
|
||||||
|
}
|
||||||
|
|
||||||
return entities, nextToken, nil
|
return entities, nextToken, nil
|
||||||
}
|
}
|
||||||
|
@@ -45,8 +45,8 @@ func (c *Coll[TData]) UpdateMany(ctx context.Context, filterQuery bson.M, update
|
|||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Coll[TData]) ReplaceOne(ctx context.Context, id EntityID, value TData) error {
|
func (c *Coll[TData]) ReplaceOne(ctx context.Context, filterQuery bson.M, value TData) error {
|
||||||
_, err := c.coll.UpdateOne(ctx, bson.M{"_id": id}, value)
|
_, err := c.coll.UpdateOne(ctx, filterQuery, bson.M{"$set": value})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -54,10 +54,10 @@ func (c *Coll[TData]) ReplaceOne(ctx context.Context, id EntityID, value TData)
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Coll[TData]) FindOneAndReplace(ctx context.Context, id EntityID, value TData) (TData, error) {
|
func (c *Coll[TData]) FindOneAndReplace(ctx context.Context, filterQuery bson.M, value TData) (TData, error) {
|
||||||
var res TData
|
var res TData
|
||||||
|
|
||||||
err := c.coll.FindOneAndUpdate(ctx, bson.M{"_id": id}, value, options.FindOneAndUpdate().SetReturnDocument(options.After)).Decode(&res)
|
err := c.coll.FindOneAndUpdate(ctx, filterQuery, bson.M{"$set": value}, options.FindOneAndUpdate().SetReturnDocument(options.After)).Decode(&res)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return *new(TData), err
|
return *new(TData), err
|
||||||
}
|
}
|
||||||
|
@@ -4,6 +4,7 @@ import (
|
|||||||
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
||||||
"gogs.mikescher.com/BlackForestBytes/goext/reflectext"
|
"gogs.mikescher.com/BlackForestBytes/goext/reflectext"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *Coll[TData]) init() {
|
func (c *Coll[TData]) init() {
|
||||||
@@ -32,7 +33,13 @@ func (c *Coll[TData]) initFields(prefix string, rval reflect.Value, idxarr []int
|
|||||||
}
|
}
|
||||||
|
|
||||||
bsonkey, found := rsfield.Tag.Lookup("bson")
|
bsonkey, found := rsfield.Tag.Lookup("bson")
|
||||||
if !found || bsonkey == "-" {
|
if !found {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.Contains(bsonkey, ",") {
|
||||||
|
bsonkey = bsonkey[:strings.Index(bsonkey, ",")]
|
||||||
|
}
|
||||||
|
if bsonkey == "-" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user