github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/state/impl_result_storage.go (about) 1 /* 2 * Copyright (c) 2023-present unTill Pro, Ltd. 3 */ 4 5 package state 6 7 import ( 8 "github.com/voedger/voedger/pkg/appdef" 9 "github.com/voedger/voedger/pkg/istructs" 10 ) 11 12 type resultStorage struct { 13 cmdResultBuilderFunc ObjectBuilderFunc 14 appStructsFunc AppStructsFunc 15 resultBuilderFunc ObjectBuilderFunc 16 qryCallback ExecQueryCallbackFunc 17 qryValueBuilder *resultValueBuilder // last value builder 18 } 19 20 func newCmdResultStorage(cmdResultBuilderFunc ObjectBuilderFunc) *resultStorage { 21 return &resultStorage{ 22 cmdResultBuilderFunc: cmdResultBuilderFunc, 23 } 24 } 25 26 func newQueryResultStorage(appStructsFunc AppStructsFunc, resultBuilderFunc ObjectBuilderFunc, qryCallback ExecQueryCallbackFunc) *resultStorage { 27 return &resultStorage{ 28 appStructsFunc: appStructsFunc, 29 resultBuilderFunc: resultBuilderFunc, 30 qryCallback: qryCallback, 31 } 32 } 33 34 func (s *resultStorage) NewKeyBuilder(_ appdef.QName, _ istructs.IStateKeyBuilder) istructs.IStateKeyBuilder { 35 return newResultKeyBuilder() 36 } 37 38 func (s *resultStorage) Validate([]ApplyBatchItem) (err error) { 39 panic("not applicable") 40 } 41 42 func (s *resultStorage) sendPrevQueryObject() error { 43 if s.qryCallback != nil && s.qryValueBuilder != nil { // query processor, there's unsent object 44 obj, err := s.qryValueBuilder.resultBuilder.Build() 45 if err != nil { 46 return err 47 } 48 s.qryValueBuilder = nil 49 return s.qryCallback()(obj) 50 } 51 return nil 52 } 53 54 func (s *resultStorage) ApplyBatch([]ApplyBatchItem) (err error) { 55 return s.sendPrevQueryObject() 56 } 57 58 func (s *resultStorage) ProvideValueBuilder(istructs.IStateKeyBuilder, istructs.IStateValueBuilder) (istructs.IStateValueBuilder, error) { 59 if s.qryCallback != nil { // query processor 60 err := s.sendPrevQueryObject() 61 if err != nil { 62 return nil, err 63 } 64 s.qryValueBuilder = &resultValueBuilder{resultBuilder: s.resultBuilderFunc()} 65 return s.qryValueBuilder, nil 66 } 67 // command processor 68 builder := s.cmdResultBuilderFunc() 69 return &resultValueBuilder{resultBuilder: builder}, nil 70 }