github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/sys/collection/collection_func.go (about)

     1  /*
     2   * Copyright (c) 2021-present unTill Pro, Ltd.
     3  *
     4  * @author Michael Saigachenko
     5  */
     6  
     7  package collection
     8  
     9  import (
    10  	"context"
    11  	"errors"
    12  
    13  	"github.com/voedger/voedger/pkg/appdef"
    14  	"github.com/voedger/voedger/pkg/istructs"
    15  	"github.com/voedger/voedger/pkg/state"
    16  )
    17  
    18  func collectionResultQName(args istructs.PrepareArgs) appdef.QName {
    19  	if args.ArgumentObject == nil {
    20  		return appdef.NullQName
    21  	}
    22  	qnameStr := args.ArgumentObject.AsString(field_Schema)
    23  	qname, err := appdef.ParseQName(qnameStr)
    24  	if err != nil {
    25  		return appdef.NullQName // not provided or incorrect
    26  	}
    27  	return qname
    28  }
    29  
    30  func collectionFuncExec(ctx context.Context, args istructs.ExecQueryArgs, callback istructs.ExecQueryCallback) (err error) {
    31  	if args.ArgumentObject == nil {
    32  		return errors.New("ArgumentObject is not defined in PrepareArgs")
    33  	}
    34  	qnameStr := args.ArgumentObject.AsString(field_Schema)
    35  	resultsQName, err := appdef.ParseQName(qnameStr)
    36  	if err != nil {
    37  		return err
    38  	}
    39  
    40  	kb, err := args.State.KeyBuilder(state.View, QNameCollectionView)
    41  	if err != nil {
    42  		return err
    43  	}
    44  	kb.PutInt32(Field_PartKey, PartitionKeyCollection)
    45  	kb.PutQName(Field_DocQName, resultsQName)
    46  	id := args.ArgumentObject.AsRecordID(field_ID)
    47  	if id != istructs.NullRecordID {
    48  		kb.PutRecordID(field_DocID, id)
    49  	}
    50  
    51  	var lastDoc *collectionObject
    52  
    53  	err = args.State.Read(kb, func(key istructs.IKey, value istructs.IStateValue) (err error) {
    54  		rec := value.AsRecord(Field_Record)
    55  		docId := key.AsRecordID(field_DocID)
    56  
    57  		if lastDoc != nil && lastDoc.ID() == docId {
    58  			lastDoc.addRawRecord(rec)
    59  		} else {
    60  			if lastDoc != nil {
    61  				lastDoc.handleRawRecords()
    62  				err = callback(lastDoc)
    63  			}
    64  			obj := newCollectionObject(rec)
    65  			lastDoc = obj
    66  		}
    67  		return
    68  	})
    69  	if lastDoc != nil && err == nil {
    70  		lastDoc.handleRawRecords()
    71  		err = callback(lastDoc)
    72  	}
    73  	return err
    74  }