mirror of
https://github.com/MontFerret/ferret.git
synced 2025-08-13 19:52:52 +02:00
Refactor loop compilation; update initialization logic for zero/one registers and adjust range iteration handling, restructure range iterator tests, and align imports for consistency
This commit is contained in:
@@ -74,15 +74,15 @@ func (cc *LoopCollectCompiler) compileGlobalAggregation(c fql.ICollectAggregator
|
||||
cc.ctx.Symbols.ExitScope()
|
||||
|
||||
// Now we can iterate over the grouped items
|
||||
zero := loadConstant(cc.ctx, runtime.Int(0))
|
||||
one := loadConstant(cc.ctx, runtime.Int(1))
|
||||
zero := cc.ctx.Registers.Allocate(core.Temp)
|
||||
cc.ctx.Emitter.EmitA(vm.OpLoadZero, zero)
|
||||
// We move the aggregator to a temporary register to access it later from the new loop
|
||||
aggregator := cc.ctx.Registers.Allocate(core.Temp)
|
||||
cc.ctx.Emitter.EmitAB(vm.OpMove, aggregator, parentLoop.Dst)
|
||||
|
||||
// CreateFor new loop with 1 iteration only
|
||||
cc.ctx.Symbols.EnterScope()
|
||||
cc.ctx.Emitter.EmitABC(vm.OpRange, parentLoop.Src, zero, one)
|
||||
cc.ctx.Emitter.EmitABC(vm.OpRange, parentLoop.Src, zero, zero)
|
||||
loop := cc.ctx.Loops.CreateFor(core.TemporalLoop, parentLoop.Src, parentLoop.Distinct)
|
||||
loop.Dst = parentLoop.Dst
|
||||
loop.Allocate = true
|
||||
|
@@ -2,6 +2,7 @@ package internal_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/MontFerret/ferret/pkg/vm/internal"
|
||||
"testing"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/runtime"
|
||||
@@ -12,8 +13,8 @@ import (
|
||||
func TestRangeIterator(t *testing.T) {
|
||||
Convey("Zero value", t, func() {
|
||||
ctx := context.Background()
|
||||
r := NewRange(0, 0)
|
||||
iter := NewRangeIterator(r)
|
||||
r := internal.NewRange(0, 0)
|
||||
iter := internal.NewRangeIterator(r)
|
||||
|
||||
hasNext, err := iter.HasNext(ctx)
|
||||
So(err, ShouldBeNil)
|
||||
@@ -32,8 +33,8 @@ func TestRangeIterator(t *testing.T) {
|
||||
|
||||
Convey("Two values", t, func() {
|
||||
ctx := context.Background()
|
||||
r := NewRange(0, 1)
|
||||
iter := NewRangeIterator(r)
|
||||
r := internal.NewRange(0, 1)
|
||||
iter := internal.NewRangeIterator(r)
|
||||
|
||||
hasNext, err := iter.HasNext(ctx)
|
||||
So(err, ShouldBeNil)
|
||||
@@ -58,8 +59,8 @@ func TestRangeIterator(t *testing.T) {
|
||||
|
||||
Convey("Two values (2)", t, func() {
|
||||
ctx := context.Background()
|
||||
r := NewRange(1, 2)
|
||||
iter := NewRangeIterator(r)
|
||||
r := internal.NewRange(1, 2)
|
||||
iter := internal.NewRangeIterator(r)
|
||||
|
||||
hasNext, err := iter.HasNext(ctx)
|
||||
So(err, ShouldBeNil)
|
||||
@@ -84,8 +85,8 @@ func TestRangeIterator(t *testing.T) {
|
||||
|
||||
Convey("Multiple ascending values", t, func() {
|
||||
ctx := context.Background()
|
||||
r := NewRange(0, 10)
|
||||
iter := NewRangeIterator(r)
|
||||
r := internal.NewRange(0, 10)
|
||||
iter := internal.NewRangeIterator(r)
|
||||
|
||||
actual := make([]runtime.Int, 0, 10)
|
||||
|
||||
@@ -104,8 +105,8 @@ func TestRangeIterator(t *testing.T) {
|
||||
|
||||
Convey("Multiple descending values", t, func() {
|
||||
ctx := context.Background()
|
||||
r := NewRange(10, 0)
|
||||
iter := NewRangeIterator(r)
|
||||
r := internal.NewRange(10, 0)
|
||||
iter := internal.NewRangeIterator(r)
|
||||
|
||||
actual := make([]runtime.Int, 0, 10)
|
||||
|
||||
@@ -126,8 +127,8 @@ func TestRangeIterator(t *testing.T) {
|
||||
func BenchmarkRangeIterator(b *testing.B) {
|
||||
size := 100
|
||||
ctx := context.Background()
|
||||
r := NewRange(0, int64(size))
|
||||
iter := NewRangeIterator(r)
|
||||
r := internal.NewRange(0, int64(size))
|
||||
iter := internal.NewRangeIterator(r)
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
|
Reference in New Issue
Block a user