github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/processors/query/operator-enrichment-impl.go (about)

     1  /*
     2   * Copyright (c) 2021-present unTill Pro, Ltd.
     3   */
     4  
     5  package queryprocessor
     6  
     7  import (
     8  	"context"
     9  	"time"
    10  
    11  	"github.com/voedger/voedger/pkg/appdef"
    12  	"github.com/voedger/voedger/pkg/istructs"
    13  	"github.com/voedger/voedger/pkg/pipeline"
    14  	"github.com/voedger/voedger/pkg/state"
    15  	coreutils "github.com/voedger/voedger/pkg/utils"
    16  )
    17  
    18  type EnrichmentOperator struct {
    19  	pipeline.AsyncNOOP
    20  	state      istructs.IState
    21  	elements   []IElement
    22  	fieldsDefs *fieldsDefs
    23  	metrics    IMetrics
    24  }
    25  
    26  func (o *EnrichmentOperator) DoAsync(ctx context.Context, work pipeline.IWorkpiece) (outWork pipeline.IWorkpiece, err error) {
    27  	begin := time.Now()
    28  	defer func() {
    29  		o.metrics.Increase(execEnrichSeconds, time.Since(begin).Seconds())
    30  	}()
    31  	outputRow := work.(IWorkpiece).OutputRow()
    32  	for _, element := range o.elements {
    33  		rows := outputRow.Value(element.Path().Name()).([]IOutputRow)
    34  		for i := range rows {
    35  			for _, field := range element.RefFields() {
    36  				if ctx.Err() != nil {
    37  					return work, ctx.Err()
    38  				}
    39  
    40  				kb, err := o.state.KeyBuilder(state.Record, appdef.NullQName)
    41  				if err != nil {
    42  					return work, err
    43  				}
    44  				kb.PutRecordID(state.Field_ID, rows[i].Value(field.Key()).(istructs.RecordID))
    45  
    46  				sv, err := o.state.MustExist(kb)
    47  				if err != nil {
    48  					return work, err
    49  				}
    50  				record := sv.AsRecord("")
    51  
    52  				recFields := o.fieldsDefs.get(record.QName())
    53  				value := coreutils.ReadByKind(field.RefField(), recFields[field.RefField()], record)
    54  				if element.Path().IsRoot() {
    55  					work.(IWorkpiece).PutEnrichedRootFieldKind(field.Key(), recFields[field.RefField()])
    56  				}
    57  				rows[i].Set(field.Key(), value)
    58  			}
    59  		}
    60  	}
    61  	return work, err
    62  }