package sig import ( "sig-pub/pkg/indicator" ) type IndicatorSummary struct { indicator.IIndicatorSummary indicatorContext IOffsetIndicatorContext summaryIndicatorNewer func() indicator.ISummaryIndicator cachedSummaryIndicators map[string]indicator.ISummaryIndicator } func NewIndicatorSummary(summaryIndicatorNewer func() indicator.ISummaryIndicator, indicatorContext IOffsetIndicatorContext) *IndicatorSummary { return &IndicatorSummary{ summaryIndicatorNewer: summaryIndicatorNewer, indicatorContext: indicatorContext, cachedSummaryIndicators: make(map[string]indicator.ISummaryIndicator), } } // Summary 0 10, 0 20, 1 30 func (s *IndicatorSummary) Summary(offset, count int16) (summary any, rok bool) { // key := fmt.Sprintf("%d,%d", offset, count) // summaryIndicator, ok := s.cachedSummaryIndicators[key] // if ok { // s.indicatorContext.AddOffset(offset + count + 1) // eliminater, ok := summaryIndicator.(indicator.ISummaryIndicatorEliminater) // if ok { // eliminater.Eliminate(s.indicatorContext) // } // s.indicatorContext.AddOffset(-(offset + count + 1)) // s.indicatorContext.AddOffset(offset) // summaryIndicator.Accumulate(s.indicatorContext) // summary, ok = summaryIndicator.Summary(s.indicatorContext) // s.indicatorContext.AddOffset(-offset) // return // } // 初始化, 计算全量数据 summaryIndicator := s.summaryIndicatorNewer() if err := summaryIndicator.Init(s.indicatorContext.Input()); err != nil { panic(err) } // s.cachedSummaryIndicators[key] = summaryIndicator // 设置当前相对offset offset = offset + count s.indicatorContext.AddOffset(offset) for range count { summaryIndicator.Accumulate(s.indicatorContext) offset-- s.indicatorContext.AddOffset(-1) } // 获取结果 summary, rok = summaryIndicator.Summary(s.indicatorContext) // 计算结束后还原offset s.indicatorContext.AddOffset(-offset) return }