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  }