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 }