|
@@ -77,7 +77,23 @@ func (pp *ProjectOp) Apply(ctx api.StreamContext, data interface{}, fv *xsql.Fun
|
|
}
|
|
}
|
|
return true, nil
|
|
return true, nil
|
|
})
|
|
})
|
|
|
|
+ if pp.EnableLimit && pp.LimitCount > 0 && input.Len() > pp.LimitCount {
|
|
|
|
+ var sel []int
|
|
|
|
+ sel = make([]int, pp.LimitCount, pp.LimitCount)
|
|
|
|
+ for i := 0; i < pp.LimitCount; i++ {
|
|
|
|
+ sel[i] = i
|
|
|
|
+ }
|
|
|
|
+ input = input.Filter(sel).(xsql.SingleCollection)
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
|
|
+ if pp.EnableLimit && pp.LimitCount > 0 && input.Len() > pp.LimitCount {
|
|
|
|
+ var sel []int
|
|
|
|
+ sel = make([]int, pp.LimitCount, pp.LimitCount)
|
|
|
|
+ for i := 0; i < pp.LimitCount; i++ {
|
|
|
|
+ sel[i] = i
|
|
|
|
+ }
|
|
|
|
+ input = input.Filter(sel).(xsql.SingleCollection)
|
|
|
|
+ }
|
|
err = input.RangeSet(func(_ int, row xsql.Row) (bool, error) {
|
|
err = input.RangeSet(func(_ int, row xsql.Row) (bool, error) {
|
|
aggData, ok := input.(xsql.AggregateData)
|
|
aggData, ok := input.(xsql.AggregateData)
|
|
if !ok {
|
|
if !ok {
|
|
@@ -93,15 +109,15 @@ func (pp *ProjectOp) Apply(ctx api.StreamContext, data interface{}, fv *xsql.Fun
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+ case xsql.GroupedCollection: // The order is important, because single collection usually is also a groupedCollection
|
|
if pp.EnableLimit && pp.LimitCount > 0 && input.Len() > pp.LimitCount {
|
|
if pp.EnableLimit && pp.LimitCount > 0 && input.Len() > pp.LimitCount {
|
|
var sel []int
|
|
var sel []int
|
|
sel = make([]int, pp.LimitCount, pp.LimitCount)
|
|
sel = make([]int, pp.LimitCount, pp.LimitCount)
|
|
for i := 0; i < pp.LimitCount; i++ {
|
|
for i := 0; i < pp.LimitCount; i++ {
|
|
sel[i] = i
|
|
sel[i] = i
|
|
}
|
|
}
|
|
- return input.Filter(sel)
|
|
|
|
|
|
+ input = input.Filter(sel).(xsql.GroupedCollection)
|
|
}
|
|
}
|
|
- case xsql.GroupedCollection: // The order is important, because single collection usually is also a groupedCollection
|
|
|
|
err := input.GroupRange(func(_ int, aggRow xsql.CollectionRow) (bool, error) {
|
|
err := input.GroupRange(func(_ int, aggRow xsql.CollectionRow) (bool, error) {
|
|
ve := pp.getVE(aggRow, aggRow, input.GetWindowRange(), fv, afv)
|
|
ve := pp.getVE(aggRow, aggRow, input.GetWindowRange(), fv, afv)
|
|
if err := pp.project(aggRow, ve); err != nil {
|
|
if err := pp.project(aggRow, ve); err != nil {
|
|
@@ -112,18 +128,9 @@ func (pp *ProjectOp) Apply(ctx api.StreamContext, data interface{}, fv *xsql.Fun
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- if pp.EnableLimit && pp.LimitCount > 0 && input.Len() > pp.LimitCount {
|
|
|
|
- var sel []int
|
|
|
|
- sel = make([]int, pp.LimitCount, pp.LimitCount)
|
|
|
|
- for i := 0; i < pp.LimitCount; i++ {
|
|
|
|
- sel[i] = i
|
|
|
|
- }
|
|
|
|
- return input.Filter(sel)
|
|
|
|
- }
|
|
|
|
default:
|
|
default:
|
|
return fmt.Errorf("run Select error: invalid input %[1]T(%[1]v)", input)
|
|
return fmt.Errorf("run Select error: invalid input %[1]T(%[1]v)", input)
|
|
}
|
|
}
|
|
-
|
|
|
|
return data
|
|
return data
|
|
}
|
|
}
|
|
|
|
|