package sig import ( "fmt" "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 }