Skip to content

Commit 29b1130

Browse files
authored
Refactor query handling #154 (#157)
1 parent 199b75a commit 29b1130

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

query.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,11 @@ func (q *Query) Iter(w World) iter.Seq[*Entry] {
125125
for _, entity := range archetype.Entities() {
126126
entry := w.Entry(entity)
127127
if entry.entity.IsReady() {
128+
archetype.Unlock()
128129
if !yield(entry) {
129-
archetype.Unlock()
130130
return
131131
}
132+
archetype.Lock()
132133
}
133134
}
134135
archetype.Unlock()

query_test.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,35 @@ var (
2323
orderableTest = donburi.NewComponentType[orderableComponentTest]()
2424
)
2525

26+
func TestQueryInQuery(t *testing.T) {
27+
world := donburi.NewWorld()
28+
world.Create(queryTagA)
29+
world.Create(queryTagC)
30+
world.Create(queryTagA, queryTagB)
31+
world.Create(queryTagA, queryTagB, queryTagC)
32+
33+
query := donburi.NewQuery(filter.Contains(queryTagA, queryTagB))
34+
count := 0
35+
36+
for entry := range query.Iter(world) {
37+
count++
38+
if entry.Archetype().Layout().HasComponent(queryTagA) == false {
39+
t.Errorf("PlayerTag should be in ent archetype")
40+
}
41+
innerQuery := donburi.NewQuery(filter.Contains(queryTagA, queryTagB, queryTagC))
42+
defer func() {
43+
if r := recover(); r != nil {
44+
t.Errorf("panic should not happen")
45+
}
46+
}()
47+
for innerEntry := range innerQuery.Iter(world) {
48+
if innerEntry.Archetype().Layout().HasComponent(queryTagA) == false {
49+
t.Errorf("PlayerTag should be in ent archetype")
50+
}
51+
}
52+
}
53+
}
54+
2655
func TestQuery(t *testing.T) {
2756
world := donburi.NewWorld()
2857
world.Create(queryTagA)
@@ -92,7 +121,7 @@ func BenchmarkQuery_EachOrdered(b *testing.B) {
92121
countOrdered := 0
93122
b.Run("Each", func(b *testing.B) {
94123
for i := 0; i < b.N; i++ {
95-
for _ = range query.Iter(world) {
124+
for range query.Iter(world) {
96125
countNormal++
97126
}
98127
}

0 commit comments

Comments
 (0)