@@ -15,6 +15,7 @@ import (
1515 "github.com/google/uuid"
1616
1717 "github.com/rudderlabs/rudder-server/enterprise/trackedusers"
18+ whutils "github.com/rudderlabs/rudder-server/warehouse/utils"
1819
1920 "golang.org/x/sync/errgroup"
2021
@@ -57,6 +58,7 @@ import (
5758 . "github.com/rudderlabs/rudder-server/utils/tx" //nolint:staticcheck
5859 "github.com/rudderlabs/rudder-server/utils/types"
5960 "github.com/rudderlabs/rudder-server/utils/workerpool"
61+ wtrans "github.com/rudderlabs/rudder-server/warehouse/transformer"
6062)
6163
6264const (
@@ -84,12 +86,18 @@ type trackedUsersReporter interface {
8486 GenerateReportsFromJobs (jobs []* jobsdb.JobT , sourceIdFilter map [string ]bool ) []* trackedusers.UsersReport
8587}
8688
89+ type warehouseTransformer interface {
90+ transformer.DestinationTransformer
91+ CompareAndLog (events []transformer.TransformerEvent , pResponse , wResponse transformer.Response , metadata * transformer.Metadata , eventsByMessageID map [string ]types.SingularEventWithReceivedAt )
92+ }
93+
8794// Handle is a handle to the processor module
8895type Handle struct {
89- conf * config.Config
90- tracer stats.Tracer
91- backendConfig backendconfig.BackendConfig
92- transformer transformer.Transformer
96+ conf * config.Config
97+ tracer stats.Tracer
98+ backendConfig backendconfig.BackendConfig
99+ transformer transformer.Transformer
100+ warehouseTransformer warehouseTransformer
93101
94102 gatewayDB jobsdb.JobsDB
95103 routerDB jobsdb.JobsDB
@@ -158,6 +166,7 @@ type Handle struct {
158166 eventAuditEnabled map [string ]bool
159167 credentialsMap map [string ][]transformer.Credential
160168 nonEventStreamSources map [string ]bool
169+ enableWarehouseTransformations config.ValueLoader [bool ]
161170 }
162171
163172 drainConfig struct {
@@ -617,6 +626,9 @@ func (proc *Handle) Setup(
617626 "partition" : partition ,
618627 })
619628 }
629+
630+ proc .warehouseTransformer = wtrans .New (proc .conf , proc .logger , proc .statsFactory )
631+
620632 if proc .config .enableDedup {
621633 var err error
622634 proc .dedup , err = dedup .New (proc .conf , proc .statsFactory )
@@ -817,6 +829,7 @@ func (proc *Handle) loadReloadableConfig(defaultPayloadLimit int64, defaultMaxEv
817829 proc .config .archivalEnabled = config .GetReloadableBoolVar (true , "archival.Enabled" )
818830 // Capture event name as a tag in event level stats
819831 proc .config .captureEventNameStats = config .GetReloadableBoolVar (false , "Processor.Stats.captureEventName" )
832+ proc .config .enableWarehouseTransformations = config .GetReloadableBoolVar (false , "Processor.enableWarehouseTransformations" )
820833}
821834
822835type connection struct {
@@ -2902,6 +2915,7 @@ func (proc *Handle) transformSrcDest(
29022915 proc .logger .Debug ("Dest Transform input size" , len (eventsToTransform ))
29032916 s := time .Now ()
29042917 response = proc .transformer .Transform (ctx , eventsToTransform , proc .config .transformBatchSize .Load ())
2918+ proc .handleWarehouseTransformations (ctx , eventsToTransform , response , commonMetaData , eventsByMessageID )
29052919
29062920 destTransformationStat := proc .newDestinationTransformationStat (sourceID , workspaceID , transformAt , destination )
29072921 destTransformationStat .transformTime .Since (s )
@@ -3060,6 +3074,27 @@ func (proc *Handle) transformSrcDest(
30603074 }
30613075}
30623076
3077+ func (proc * Handle ) handleWarehouseTransformations (
3078+ ctx context.Context ,
3079+ eventsToTransform []transformer.TransformerEvent ,
3080+ pResponse transformer.Response ,
3081+ commonMetaData * transformer.Metadata ,
3082+ eventsByMessageID map [string ]types.SingularEventWithReceivedAt ,
3083+ ) {
3084+ if len (eventsToTransform ) == 0 {
3085+ return
3086+ }
3087+ if _ , ok := whutils .WarehouseDestinationMap [commonMetaData .DestinationType ]; ! ok {
3088+ return
3089+ }
3090+ if ! proc .config .enableWarehouseTransformations .Load () {
3091+ return
3092+ }
3093+
3094+ wResponse := proc .warehouseTransformer .Transform (ctx , eventsToTransform , proc .config .transformBatchSize .Load ())
3095+ proc .warehouseTransformer .CompareAndLog (eventsToTransform , pResponse , wResponse , commonMetaData , eventsByMessageID )
3096+ }
3097+
30633098func (proc * Handle ) saveDroppedJobs (ctx context.Context , droppedJobs []* jobsdb.JobT , tx * Tx ) error {
30643099 if len (droppedJobs ) > 0 {
30653100 for i := range droppedJobs { // each dropped job should have a unique jobID in the scope of the batch
0 commit comments