You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

65 lines
1.9 KiB

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
}