github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/sys/journal/impl_wlogdatesasyncprojector.go (about)

     1  /*
     2   * Copyright (c) 2021-present unTill Pro, Ltd.
     3   */
     4  
     5  package journal
     6  
     7  import (
     8  	"time"
     9  
    10  	"github.com/voedger/voedger/pkg/istructs"
    11  	"github.com/voedger/voedger/pkg/state"
    12  )
    13  
    14  var wLogDatesProjector = func(event istructs.IPLogEvent, s istructs.IState, intents istructs.IIntents) (err error) {
    15  	timestamp := time.UnixMilli(int64(event.RegisteredAt())).UTC()
    16  	kb, err := s.KeyBuilder(state.View, QNameViewWLogDates)
    17  	if err != nil {
    18  		return
    19  	}
    20  	kb.PutInt32(field_Year, int32(timestamp.Year()))
    21  	kb.PutInt32(field_DayOfYear, int32(timestamp.YearDay()))
    22  
    23  	sv, ok, err := s.CanExist(kb)
    24  	if err != nil {
    25  		return
    26  	}
    27  
    28  	lo := int64(event.WLogOffset())
    29  	fo := lo
    30  	if ok {
    31  		if sv.AsInt64(field_LastOffset) >= lo {
    32  			// skip for idempotency
    33  			return nil
    34  		}
    35  		fo = sv.AsInt64(field_FirstOffset)
    36  	}
    37  
    38  	vb, err := intents.NewValue(kb)
    39  	if err != nil {
    40  		return
    41  	}
    42  	vb.PutInt64(field_FirstOffset, fo)
    43  	vb.PutInt64(field_LastOffset, lo)
    44  	return
    45  }