github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/sys/collection/state_func.go (about) 1 /* 2 * Copyright (c) 2021-present unTill Pro, Ltd. 3 */ 4 5 package collection 6 7 import ( 8 "context" 9 "encoding/json" 10 11 "github.com/voedger/voedger/pkg/appdef" 12 "github.com/voedger/voedger/pkg/istructs" 13 istructsmem "github.com/voedger/voedger/pkg/istructsmem" 14 "github.com/voedger/voedger/pkg/state" 15 coreutils "github.com/voedger/voedger/pkg/utils" 16 ) 17 18 func provideStateFunc(cfg *istructsmem.AppConfigType) { 19 cfg.Resources.Add(istructsmem.NewQueryFunction( 20 qNameQueryState, 21 stateFuncExec(cfg.AppDef))) 22 } 23 24 func stateFuncExec(appDef appdef.IAppDef) istructsmem.ExecQueryClosure { 25 return func(ctx context.Context, args istructs.ExecQueryArgs, callback istructs.ExecQueryCallback) (err error) { 26 after := args.ArgumentObject.AsInt64(field_After) 27 28 kb, err := args.State.KeyBuilder(state.View, QNameCollectionView) 29 if err != nil { 30 return err 31 } 32 kb.PutInt32(Field_PartKey, PartitionKeyCollection) 33 34 data := make(map[string]map[istructs.RecordID]map[string]interface{}) 35 if err = args.State.Read(kb, func(key istructs.IKey, value istructs.IStateValue) (err error) { 36 if value.AsInt64(state.ColOffset) <= after { 37 return 38 } 39 record := value.AsRecord(Field_Record) 40 _, ok := data[record.QName().String()] 41 if !ok { 42 data[record.QName().String()] = make(map[istructs.RecordID]map[string]interface{}) 43 } 44 recordData := coreutils.FieldsToMap(record, appDef, coreutils.Filter(func(name string, kind appdef.DataKind) bool { 45 return name != appdef.SystemField_QName && name != appdef.SystemField_Container 46 })) 47 data[record.QName().String()][record.ID()] = recordData 48 return err 49 }); err != nil { 50 return 51 } 52 bb, err := json.Marshal(data) 53 if err != nil { 54 return 55 } 56 return callback(&stateObject{data: string(bb)}) 57 } 58 } 59 60 type stateObject struct { 61 istructs.NullObject 62 data string 63 } 64 65 func (o stateObject) AsString(string) string { return o.data }