func determineReduceContextCreateFn(method string, value interface{}, rc pipeline.ReduceCreater) (fn createReduceContextFunc, err error) { switch value.(type) { case float64: switch { case rc.CreateFloatReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateFloatReducer() return &floatReduceContext{ floatPointAggregator: floatPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, floatPointEmitter: floatPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateFloatBulkReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateFloatBulkReducer() return &floatBulkReduceContext{ floatPointBulkAggregator: floatPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, floatPointEmitter: floatPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateFloatIntegerReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateFloatIntegerReducer() return &floatIntegerReduceContext{ floatPointAggregator: floatPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, integerPointEmitter: integerPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateFloatBulkIntegerReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateFloatBulkIntegerReducer() return &floatBulkIntegerReduceContext{ floatPointBulkAggregator: floatPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, integerPointEmitter: integerPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateFloatStringReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateFloatStringReducer() return &floatStringReduceContext{ floatPointAggregator: floatPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, stringPointEmitter: stringPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateFloatBulkStringReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateFloatBulkStringReducer() return &floatBulkStringReduceContext{ floatPointBulkAggregator: floatPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, stringPointEmitter: stringPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateFloatBooleanReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateFloatBooleanReducer() return &floatBooleanReduceContext{ floatPointAggregator: floatPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, booleanPointEmitter: booleanPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateFloatBulkBooleanReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateFloatBulkBooleanReducer() return &floatBulkBooleanReduceContext{ floatPointBulkAggregator: floatPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, booleanPointEmitter: booleanPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } default: err = fmt.Errorf("cannot apply %s to float64 field", method) } case int64: switch { case rc.CreateIntegerFloatReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateIntegerFloatReducer() return &integerFloatReduceContext{ integerPointAggregator: integerPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, floatPointEmitter: floatPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateIntegerBulkFloatReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateIntegerBulkFloatReducer() return &integerBulkFloatReduceContext{ integerPointBulkAggregator: integerPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, floatPointEmitter: floatPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateIntegerReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateIntegerReducer() return &integerReduceContext{ integerPointAggregator: integerPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, integerPointEmitter: integerPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateIntegerBulkReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateIntegerBulkReducer() return &integerBulkReduceContext{ integerPointBulkAggregator: integerPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, integerPointEmitter: integerPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateIntegerStringReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateIntegerStringReducer() return &integerStringReduceContext{ integerPointAggregator: integerPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, stringPointEmitter: stringPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateIntegerBulkStringReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateIntegerBulkStringReducer() return &integerBulkStringReduceContext{ integerPointBulkAggregator: integerPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, stringPointEmitter: stringPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateIntegerBooleanReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateIntegerBooleanReducer() return &integerBooleanReduceContext{ integerPointAggregator: integerPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, booleanPointEmitter: booleanPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateIntegerBulkBooleanReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateIntegerBulkBooleanReducer() return &integerBulkBooleanReduceContext{ integerPointBulkAggregator: integerPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, booleanPointEmitter: booleanPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } default: err = fmt.Errorf("cannot apply %s to int64 field", method) } case string: switch { case rc.CreateStringFloatReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateStringFloatReducer() return &stringFloatReduceContext{ stringPointAggregator: stringPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, floatPointEmitter: floatPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateStringBulkFloatReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateStringBulkFloatReducer() return &stringBulkFloatReduceContext{ stringPointBulkAggregator: stringPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, floatPointEmitter: floatPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateStringIntegerReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateStringIntegerReducer() return &stringIntegerReduceContext{ stringPointAggregator: stringPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, integerPointEmitter: integerPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateStringBulkIntegerReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateStringBulkIntegerReducer() return &stringBulkIntegerReduceContext{ stringPointBulkAggregator: stringPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, integerPointEmitter: integerPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateStringReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateStringReducer() return &stringReduceContext{ stringPointAggregator: stringPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, stringPointEmitter: stringPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateStringBulkReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateStringBulkReducer() return &stringBulkReduceContext{ stringPointBulkAggregator: stringPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, stringPointEmitter: stringPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateStringBooleanReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateStringBooleanReducer() return &stringBooleanReduceContext{ stringPointAggregator: stringPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, booleanPointEmitter: booleanPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateStringBulkBooleanReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateStringBulkBooleanReducer() return &stringBulkBooleanReduceContext{ stringPointBulkAggregator: stringPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, booleanPointEmitter: booleanPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } default: err = fmt.Errorf("cannot apply %s to string field", method) } case bool: switch { case rc.CreateBooleanFloatReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateBooleanFloatReducer() return &booleanFloatReduceContext{ booleanPointAggregator: booleanPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, floatPointEmitter: floatPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateBooleanBulkFloatReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateBooleanBulkFloatReducer() return &booleanBulkFloatReduceContext{ booleanPointBulkAggregator: booleanPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, floatPointEmitter: floatPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateBooleanIntegerReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateBooleanIntegerReducer() return &booleanIntegerReduceContext{ booleanPointAggregator: booleanPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, integerPointEmitter: integerPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateBooleanBulkIntegerReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateBooleanBulkIntegerReducer() return &booleanBulkIntegerReduceContext{ booleanPointBulkAggregator: booleanPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, integerPointEmitter: integerPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateBooleanStringReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateBooleanStringReducer() return &booleanStringReduceContext{ booleanPointAggregator: booleanPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, stringPointEmitter: stringPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateBooleanBulkStringReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateBooleanBulkStringReducer() return &booleanBulkStringReduceContext{ booleanPointBulkAggregator: booleanPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, stringPointEmitter: stringPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateBooleanReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateBooleanReducer() return &booleanReduceContext{ booleanPointAggregator: booleanPointAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, booleanPointEmitter: booleanPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } case rc.CreateBooleanBulkReducer != nil: fn = func(c baseReduceContext) reduceContext { a, e := rc.CreateBooleanBulkReducer() return &booleanBulkReduceContext{ booleanPointBulkAggregator: booleanPointBulkAggregator{ field: c.field, topBottomInfo: rc.TopBottomCallInfo, isSimpleSelector: rc.IsSimpleSelector, aggregator: a, }, booleanPointEmitter: booleanPointEmitter{ baseReduceContext: c, emitter: e, isSimpleSelector: rc.IsSimpleSelector, }, } } default: err = fmt.Errorf("cannot apply %s to bool field", method) } default: err = fmt.Errorf("invalid field type: %T", value) } return }