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 }