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 }