Thanks to visit codestin.com
Credit goes to docs.rs

bevy_ecs/query/
state.rs

1use crate::{
2    archetype::{Archetype, ArchetypeGeneration, ArchetypeId},
3    component::{ComponentId, Tick},
4    entity::{Entity, EntityEquivalent, EntitySet, UniqueEntityArray},
5    entity_disabling::DefaultQueryFilters,
6    prelude::FromWorld,
7    query::{FilteredAccess, QueryCombinationIter, QueryIter, QueryParIter, WorldQuery},
8    storage::{SparseSetIndex, TableId},
9    system::Query,
10    world::{unsafe_world_cell::UnsafeWorldCell, World, WorldId},
11};
12
13#[cfg(all(not(target_arch = "wasm32"), feature = "multi_threaded"))]
14use crate::entity::UniqueEntityEquivalentSlice;
15
16use alloc::vec::Vec;
17use bevy_utils::prelude::DebugName;
18use core::{fmt, ptr};
19use fixedbitset::FixedBitSet;
20use log::warn;
21#[cfg(feature = "trace")]
22use tracing::Span;
23
24use super::{
25    NopWorldQuery, QueryBuilder, QueryData, QueryEntityError, QueryFilter, QueryManyIter,
26    QueryManyUniqueIter, QuerySingleError, ROQueryItem, ReadOnlyQueryData,
27};
28
29/// An ID for either a table or an archetype. Used for Query iteration.
30///
31/// Query iteration is exclusively dense (over tables) or archetypal (over archetypes) based on whether
32/// the query filters are dense or not. This is represented by the [`QueryState::is_dense`] field.
33///
34/// Note that `D::IS_DENSE` and `F::IS_DENSE` have no relationship with `QueryState::is_dense` and
35/// any combination of their values can happen.
36///
37/// This is a union instead of an enum as the usage is determined at compile time, as all [`StorageId`]s for
38/// a [`QueryState`] will be all [`TableId`]s or all [`ArchetypeId`]s, and not a mixture of both. This
39/// removes the need for discriminator to minimize memory usage and branching during iteration, but requires
40/// a safety invariant be verified when disambiguating them.
41///
42/// # Safety
43/// Must be initialized and accessed as a [`TableId`], if both generic parameters to the query are dense.
44/// Must be initialized and accessed as an [`ArchetypeId`] otherwise.
45#[derive(Clone, Copy)]
46pub(super) union StorageId {
47    pub(super) table_id: TableId,
48    pub(super) archetype_id: ArchetypeId,
49}
50
51/// Provides scoped access to a [`World`] state according to a given [`QueryData`] and [`QueryFilter`].
52///
53/// This data is cached between system runs, and is used to:
54/// - store metadata about which [`Table`] or [`Archetype`] are matched by the query. "Matched" means
55///   that the query will iterate over the data in the matched table/archetype.
56/// - cache the [`State`] needed to compute the [`Fetch`] struct used to retrieve data
57///   from a specific [`Table`] or [`Archetype`]
58/// - build iterators that can iterate over the query results
59///
60/// [`State`]: crate::query::world_query::WorldQuery::State
61/// [`Fetch`]: crate::query::world_query::WorldQuery::Fetch
62/// [`Table`]: crate::storage::Table
63#[repr(C)]
64// SAFETY NOTE:
65// Do not add any new fields that use the `D` or `F` generic parameters as this may
66// make `QueryState::as_transmuted_state` unsound if not done with care.
67pub struct QueryState<D: QueryData, F: QueryFilter = ()> {
68    world_id: WorldId,
69    pub(crate) archetype_generation: ArchetypeGeneration,
70    /// Metadata about the [`Table`](crate::storage::Table)s matched by this query.
71    pub(crate) matched_tables: FixedBitSet,
72    /// Metadata about the [`Archetype`]s matched by this query.
73    pub(crate) matched_archetypes: FixedBitSet,
74    /// [`FilteredAccess`] computed by combining the `D` and `F` access. Used to check which other queries
75    /// this query can run in parallel with.
76    /// Note that because we do a zero-cost reference conversion in `Query::as_readonly`,
77    /// the access for a read-only query may include accesses for the original mutable version,
78    /// but the `Query` does not have exclusive access to those components.
79    pub(crate) component_access: FilteredAccess,
80    // NOTE: we maintain both a bitset and a vec because iterating the vec is faster
81    pub(super) matched_storage_ids: Vec<StorageId>,
82    // Represents whether this query iteration is dense or not. When this is true
83    // `matched_storage_ids` stores `TableId`s, otherwise it stores `ArchetypeId`s.
84    pub(super) is_dense: bool,
85    pub(crate) fetch_state: D::State,
86    pub(crate) filter_state: F::State,
87    #[cfg(feature = "trace")]
88    par_iter_span: Span,
89}
90
91impl<D: QueryData, F: QueryFilter> fmt::Debug for QueryState<D, F> {
92    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
93        f.debug_struct("QueryState")
94            .field("world_id", &self.world_id)
95            .field("matched_table_count", &self.matched_tables.count_ones(..))
96            .field(
97                "matched_archetype_count",
98                &self.matched_archetypes.count_ones(..),
99            )
100            .finish_non_exhaustive()
101    }
102}
103
104impl<D: QueryData, F: QueryFilter> FromWorld for QueryState<D, F> {
105    fn from_world(world: &mut World) -> Self {
106        world.query_filtered()
107    }
108}
109
110impl<D: QueryData, F: QueryFilter> QueryState<D, F> {
111    /// Converts this `QueryState` reference to a `QueryState` that does not access anything mutably.
112    pub fn as_readonly(&self) -> &QueryState<D::ReadOnly, F> {
113        // SAFETY: invariant on `WorldQuery` trait upholds that `D::ReadOnly` and `F::ReadOnly`
114        // have a subset of the access, and match the exact same archetypes/tables as `D`/`F` respectively.
115        unsafe { self.as_transmuted_state::<D::ReadOnly, F>() }
116    }
117
118    /// Converts this `QueryState` reference to a `QueryState` that does not return any data
119    /// which can be faster.
120    ///
121    /// This doesn't use `NopWorldQuery` as it loses filter functionality, for example
122    /// `NopWorldQuery<Changed<T>>` is functionally equivalent to `With<T>`.
123    pub(crate) fn as_nop(&self) -> &QueryState<NopWorldQuery<D>, F> {
124        // SAFETY: `NopWorldQuery` doesn't have any accesses and defers to
125        // `D` for table/archetype matching
126        unsafe { self.as_transmuted_state::<NopWorldQuery<D>, F>() }
127    }
128
129    /// Converts this `QueryState` reference to any other `QueryState` with
130    /// the same `WorldQuery::State` associated types.
131    ///
132    /// Consider using `as_readonly` or `as_nop` instead which are safe functions.
133    ///
134    /// # Safety
135    ///
136    /// `NewD` must have a subset of the access that `D` does and match the exact same archetypes/tables
137    /// `NewF` must have a subset of the access that `F` does and match the exact same archetypes/tables
138    pub(crate) unsafe fn as_transmuted_state<
139        NewD: ReadOnlyQueryData<State = D::State>,
140        NewF: QueryFilter<State = F::State>,
141    >(
142        &self,
143    ) -> &QueryState<NewD, NewF> {
144        &*ptr::from_ref(self).cast::<QueryState<NewD, NewF>>()
145    }
146
147    /// Returns the components accessed by this query.
148    pub fn component_access(&self) -> &FilteredAccess {
149        &self.component_access
150    }
151
152    /// Returns the tables matched by this query.
153    pub fn matched_tables(&self) -> impl Iterator<Item = TableId> + '_ {
154        self.matched_tables.ones().map(TableId::from_usize)
155    }
156
157    /// Returns the archetypes matched by this query.
158    pub fn matched_archetypes(&self) -> impl Iterator<Item = ArchetypeId> + '_ {
159        self.matched_archetypes.ones().map(ArchetypeId::new)
160    }
161
162    /// Creates a new [`QueryState`] from a given [`World`] and inherits the result of `world.id()`.
163    pub fn new(world: &mut World) -> Self {
164        let mut state = Self::new_uninitialized(world);
165        state.update_archetypes(world);
166        state
167    }
168
169    /// Creates a new [`QueryState`] from an immutable [`World`] reference and inherits the result of `world.id()`.
170    ///
171    /// This function may fail if, for example,
172    /// the components that make up this query have not been registered into the world.
173    pub fn try_new(world: &World) -> Option<Self> {
174        let mut state = Self::try_new_uninitialized(world)?;
175        state.update_archetypes(world);
176        Some(state)
177    }
178
179    /// Creates a new [`QueryState`] but does not populate it with the matched results from the World yet
180    ///
181    /// `new_archetype` and its variants must be called on all of the World's archetypes before the
182    /// state can return valid query results.
183    fn new_uninitialized(world: &mut World) -> Self {
184        let fetch_state = D::init_state(world);
185        let filter_state = F::init_state(world);
186        Self::from_states_uninitialized(world, fetch_state, filter_state)
187    }
188
189    /// Creates a new [`QueryState`] but does not populate it with the matched results from the World yet
190    ///
191    /// `new_archetype` and its variants must be called on all of the World's archetypes before the
192    /// state can return valid query results.
193    fn try_new_uninitialized(world: &World) -> Option<Self> {
194        let fetch_state = D::get_state(world.components())?;
195        let filter_state = F::get_state(world.components())?;
196        Some(Self::from_states_uninitialized(
197            world,
198            fetch_state,
199            filter_state,
200        ))
201    }
202
203    /// Creates a new [`QueryState`] but does not populate it with the matched results from the World yet
204    ///
205    /// `new_archetype` and its variants must be called on all of the World's archetypes before the
206    /// state can return valid query results.
207    fn from_states_uninitialized(
208        world: &World,
209        fetch_state: <D as WorldQuery>::State,
210        filter_state: <F as WorldQuery>::State,
211    ) -> Self {
212        let mut component_access = FilteredAccess::default();
213        D::update_component_access(&fetch_state, &mut component_access);
214
215        // Use a temporary empty FilteredAccess for filters. This prevents them from conflicting with the
216        // main Query's `fetch_state` access. Filters are allowed to conflict with the main query fetch
217        // because they are evaluated *before* a specific reference is constructed.
218        let mut filter_component_access = FilteredAccess::default();
219        F::update_component_access(&filter_state, &mut filter_component_access);
220
221        // Merge the temporary filter access with the main access. This ensures that filter access is
222        // properly considered in a global "cross-query" context (both within systems and across systems).
223        component_access.extend(&filter_component_access);
224
225        // For queries without dynamic filters the dense-ness of the query is equal to the dense-ness
226        // of its static type parameters.
227        let mut is_dense = D::IS_DENSE && F::IS_DENSE;
228
229        if let Some(default_filters) = world.get_resource::<DefaultQueryFilters>() {
230            default_filters.modify_access(&mut component_access);
231            is_dense &= default_filters.is_dense(world.components());
232        }
233
234        Self {
235            world_id: world.id(),
236            archetype_generation: ArchetypeGeneration::initial(),
237            matched_storage_ids: Vec::new(),
238            is_dense,
239            fetch_state,
240            filter_state,
241            component_access,
242            matched_tables: Default::default(),
243            matched_archetypes: Default::default(),
244            #[cfg(feature = "trace")]
245            par_iter_span: tracing::info_span!(
246                "par_for_each",
247                query = core::any::type_name::<D>(),
248                filter = core::any::type_name::<F>(),
249            ),
250        }
251    }
252
253    /// Creates a new [`QueryState`] from a given [`QueryBuilder`] and inherits its [`FilteredAccess`].
254    pub fn from_builder(builder: &mut QueryBuilder<D, F>) -> Self {
255        let mut fetch_state = D::init_state(builder.world_mut());
256        let filter_state = F::init_state(builder.world_mut());
257
258        let mut component_access = FilteredAccess::default();
259        D::update_component_access(&fetch_state, &mut component_access);
260        D::provide_extra_access(
261            &mut fetch_state,
262            component_access.access_mut(),
263            builder.access().access(),
264        );
265
266        let mut component_access = builder.access().clone();
267
268        // For dynamic queries the dense-ness is given by the query builder.
269        let mut is_dense = builder.is_dense();
270
271        if let Some(default_filters) = builder.world().get_resource::<DefaultQueryFilters>() {
272            default_filters.modify_access(&mut component_access);
273            is_dense &= default_filters.is_dense(builder.world().components());
274        }
275
276        let mut state = Self {
277            world_id: builder.world().id(),
278            archetype_generation: ArchetypeGeneration::initial(),
279            matched_storage_ids: Vec::new(),
280            is_dense,
281            fetch_state,
282            filter_state,
283            component_access,
284            matched_tables: Default::default(),
285            matched_archetypes: Default::default(),
286            #[cfg(feature = "trace")]
287            par_iter_span: tracing::info_span!(
288                "par_for_each",
289                data = core::any::type_name::<D>(),
290                filter = core::any::type_name::<F>(),
291            ),
292        };
293        state.update_archetypes(builder.world());
294        state
295    }
296
297    /// Creates a [`Query`] from the given [`QueryState`] and [`World`].
298    ///
299    /// This will create read-only queries, see [`Self::query_mut`] for mutable queries.
300    pub fn query<'w, 's>(&'s mut self, world: &'w World) -> Query<'w, 's, D::ReadOnly, F> {
301        self.update_archetypes(world);
302        self.query_manual(world)
303    }
304
305    /// Creates a [`Query`] from the given [`QueryState`] and [`World`].
306    ///
307    /// This method is slightly more efficient than [`QueryState::query`] in some situations, since
308    /// it does not update this instance's internal cache. The resulting query may skip an entity that
309    /// belongs to an archetype that has not been cached.
310    ///
311    /// To ensure that the cache is up to date, call [`QueryState::update_archetypes`] before this method.
312    /// The cache is also updated in [`QueryState::new`], [`QueryState::get`], or any method with mutable
313    /// access to `self`.
314    ///
315    /// This will create read-only queries, see [`Self::query_mut`] for mutable queries.
316    pub fn query_manual<'w, 's>(&'s self, world: &'w World) -> Query<'w, 's, D::ReadOnly, F> {
317        self.validate_world(world.id());
318        // SAFETY:
319        // - We have read access to the entire world, and we call `as_readonly()` so the query only performs read access.
320        // - We called `validate_world`.
321        unsafe {
322            self.as_readonly()
323                .query_unchecked_manual(world.as_unsafe_world_cell_readonly())
324        }
325    }
326
327    /// Creates a [`Query`] from the given [`QueryState`] and [`World`].
328    pub fn query_mut<'w, 's>(&'s mut self, world: &'w mut World) -> Query<'w, 's, D, F> {
329        let last_run = world.last_change_tick();
330        let this_run = world.change_tick();
331        // SAFETY: We have exclusive access to the entire world.
332        unsafe { self.query_unchecked_with_ticks(world.as_unsafe_world_cell(), last_run, this_run) }
333    }
334
335    /// Creates a [`Query`] from the given [`QueryState`] and [`World`].
336    ///
337    /// # Safety
338    ///
339    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
340    /// have unique access to the components they query.
341    pub unsafe fn query_unchecked<'w, 's>(
342        &'s mut self,
343        world: UnsafeWorldCell<'w>,
344    ) -> Query<'w, 's, D, F> {
345        self.update_archetypes_unsafe_world_cell(world);
346        // SAFETY: Caller ensures we have the required access
347        unsafe { self.query_unchecked_manual(world) }
348    }
349
350    /// Creates a [`Query`] from the given [`QueryState`] and [`World`].
351    ///
352    /// This method is slightly more efficient than [`QueryState::query_unchecked`] in some situations, since
353    /// it does not update this instance's internal cache. The resulting query may skip an entity that
354    /// belongs to an archetype that has not been cached.
355    ///
356    /// To ensure that the cache is up to date, call [`QueryState::update_archetypes`] before this method.
357    /// The cache is also updated in [`QueryState::new`], [`QueryState::get`], or any method with mutable
358    /// access to `self`.
359    ///
360    /// # Safety
361    ///
362    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
363    /// have unique access to the components they query.
364    /// This does not validate that `world.id()` matches `self.world_id`. Calling this on a `world`
365    /// with a mismatched [`WorldId`] is unsound.
366    pub unsafe fn query_unchecked_manual<'w, 's>(
367        &'s self,
368        world: UnsafeWorldCell<'w>,
369    ) -> Query<'w, 's, D, F> {
370        let last_run = world.last_change_tick();
371        let this_run = world.change_tick();
372        // SAFETY:
373        // - The caller ensured we have the correct access to the world.
374        // - The caller ensured that the world matches.
375        unsafe { self.query_unchecked_manual_with_ticks(world, last_run, this_run) }
376    }
377
378    /// Creates a [`Query`] from the given [`QueryState`] and [`World`].
379    ///
380    /// # Safety
381    ///
382    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
383    /// have unique access to the components they query.
384    pub unsafe fn query_unchecked_with_ticks<'w, 's>(
385        &'s mut self,
386        world: UnsafeWorldCell<'w>,
387        last_run: Tick,
388        this_run: Tick,
389    ) -> Query<'w, 's, D, F> {
390        self.update_archetypes_unsafe_world_cell(world);
391        // SAFETY:
392        // - The caller ensured we have the correct access to the world.
393        // - We called `update_archetypes_unsafe_world_cell`, which calls `validate_world`.
394        unsafe { self.query_unchecked_manual_with_ticks(world, last_run, this_run) }
395    }
396
397    /// Creates a [`Query`] from the given [`QueryState`] and [`World`].
398    ///
399    /// This method is slightly more efficient than [`QueryState::query_unchecked_with_ticks`] in some situations, since
400    /// it does not update this instance's internal cache. The resulting query may skip an entity that
401    /// belongs to an archetype that has not been cached.
402    ///
403    /// To ensure that the cache is up to date, call [`QueryState::update_archetypes`] before this method.
404    /// The cache is also updated in [`QueryState::new`], [`QueryState::get`], or any method with mutable
405    /// access to `self`.
406    ///
407    /// # Safety
408    ///
409    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
410    /// have unique access to the components they query.
411    /// This does not validate that `world.id()` matches `self.world_id`. Calling this on a `world`
412    /// with a mismatched [`WorldId`] is unsound.
413    pub unsafe fn query_unchecked_manual_with_ticks<'w, 's>(
414        &'s self,
415        world: UnsafeWorldCell<'w>,
416        last_run: Tick,
417        this_run: Tick,
418    ) -> Query<'w, 's, D, F> {
419        // SAFETY:
420        // - The caller ensured we have the correct access to the world.
421        // - The caller ensured that the world matches.
422        unsafe { Query::new(world, self, last_run, this_run) }
423    }
424
425    /// Checks if the query is empty for the given [`World`], where the last change and current tick are given.
426    ///
427    /// This is equivalent to `self.iter().next().is_none()`, and thus the worst case runtime will be `O(n)`
428    /// where `n` is the number of *potential* matches. This can be notably expensive for queries that rely
429    /// on non-archetypal filters such as [`Added`], [`Changed`] or [`Spawned`] which must individually check
430    /// each query result for a match.
431    ///
432    /// # Panics
433    ///
434    /// If `world` does not match the one used to call `QueryState::new` for this instance.
435    ///
436    /// [`Added`]: crate::query::Added
437    /// [`Changed`]: crate::query::Changed
438    /// [`Spawned`]: crate::query::Spawned
439    #[inline]
440    pub fn is_empty(&self, world: &World, last_run: Tick, this_run: Tick) -> bool {
441        self.validate_world(world.id());
442        // SAFETY:
443        // - We have read access to the entire world, and `is_empty()` only performs read access.
444        // - We called `validate_world`.
445        unsafe {
446            self.query_unchecked_manual_with_ticks(
447                world.as_unsafe_world_cell_readonly(),
448                last_run,
449                this_run,
450            )
451        }
452        .is_empty()
453    }
454
455    /// Returns `true` if the given [`Entity`] matches the query.
456    ///
457    /// This is always guaranteed to run in `O(1)` time.
458    #[inline]
459    pub fn contains(&self, entity: Entity, world: &World, last_run: Tick, this_run: Tick) -> bool {
460        self.validate_world(world.id());
461        // SAFETY:
462        // - We have read access to the entire world, and `is_empty()` only performs read access.
463        // - We called `validate_world`.
464        unsafe {
465            self.query_unchecked_manual_with_ticks(
466                world.as_unsafe_world_cell_readonly(),
467                last_run,
468                this_run,
469            )
470        }
471        .contains(entity)
472    }
473
474    /// Updates the state's internal view of the [`World`]'s archetypes. If this is not called before querying data,
475    /// the results may not accurately reflect what is in the `world`.
476    ///
477    /// This is only required if a `manual` method (such as [`Self::get_manual`]) is being called, and it only needs to
478    /// be called if the `world` has been structurally mutated (i.e. added/removed a component or resource). Users using
479    /// non-`manual` methods such as [`QueryState::get`] do not need to call this as it will be automatically called for them.
480    ///
481    /// If you have an [`UnsafeWorldCell`] instead of `&World`, consider using [`QueryState::update_archetypes_unsafe_world_cell`].
482    ///
483    /// # Panics
484    ///
485    /// If `world` does not match the one used to call `QueryState::new` for this instance.
486    #[inline]
487    pub fn update_archetypes(&mut self, world: &World) {
488        self.update_archetypes_unsafe_world_cell(world.as_unsafe_world_cell_readonly());
489    }
490
491    /// Updates the state's internal view of the `world`'s archetypes. If this is not called before querying data,
492    /// the results may not accurately reflect what is in the `world`.
493    ///
494    /// This is only required if a `manual` method (such as [`Self::get_manual`]) is being called, and it only needs to
495    /// be called if the `world` has been structurally mutated (i.e. added/removed a component or resource). Users using
496    /// non-`manual` methods such as [`QueryState::get`] do not need to call this as it will be automatically called for them.
497    ///
498    /// # Note
499    ///
500    /// This method only accesses world metadata.
501    ///
502    /// # Panics
503    ///
504    /// If `world` does not match the one used to call `QueryState::new` for this instance.
505    pub fn update_archetypes_unsafe_world_cell(&mut self, world: UnsafeWorldCell) {
506        self.validate_world(world.id());
507        if self.component_access.required.is_empty() {
508            let archetypes = world.archetypes();
509            let old_generation =
510                core::mem::replace(&mut self.archetype_generation, archetypes.generation());
511
512            for archetype in &archetypes[old_generation..] {
513                // SAFETY: The validate_world call ensures that the world is the same the QueryState
514                // was initialized from.
515                unsafe {
516                    self.new_archetype(archetype);
517                }
518            }
519        } else {
520            // skip if we are already up to date
521            if self.archetype_generation == world.archetypes().generation() {
522                return;
523            }
524            // if there are required components, we can optimize by only iterating through archetypes
525            // that contain at least one of the required components
526            let potential_archetypes = self
527                .component_access
528                .required
529                .ones()
530                .filter_map(|idx| {
531                    let component_id = ComponentId::get_sparse_set_index(idx);
532                    world
533                        .archetypes()
534                        .component_index()
535                        .get(&component_id)
536                        .map(|index| index.keys())
537                })
538                // select the component with the fewest archetypes
539                .min_by_key(ExactSizeIterator::len);
540            if let Some(archetypes) = potential_archetypes {
541                for archetype_id in archetypes {
542                    // exclude archetypes that have already been processed
543                    if archetype_id < &self.archetype_generation.0 {
544                        continue;
545                    }
546                    // SAFETY: get_potential_archetypes only returns archetype ids that are valid for the world
547                    let archetype = &world.archetypes()[*archetype_id];
548                    // SAFETY: The validate_world call ensures that the world is the same the QueryState
549                    // was initialized from.
550                    unsafe {
551                        self.new_archetype(archetype);
552                    }
553                }
554            }
555            self.archetype_generation = world.archetypes().generation();
556        }
557    }
558
559    /// # Panics
560    ///
561    /// If `world_id` does not match the [`World`] used to call `QueryState::new` for this instance.
562    ///
563    /// Many unsafe query methods require the world to match for soundness. This function is the easiest
564    /// way of ensuring that it matches.
565    #[inline]
566    #[track_caller]
567    pub fn validate_world(&self, world_id: WorldId) {
568        #[inline(never)]
569        #[track_caller]
570        #[cold]
571        fn panic_mismatched(this: WorldId, other: WorldId) -> ! {
572            panic!("Encountered a mismatched World. This QueryState was created from {this:?}, but a method was called using {other:?}.");
573        }
574
575        if self.world_id != world_id {
576            panic_mismatched(self.world_id, world_id);
577        }
578    }
579
580    /// Update the current [`QueryState`] with information from the provided [`Archetype`]
581    /// (if applicable, i.e. if the archetype has any intersecting [`ComponentId`] with the current [`QueryState`]).
582    ///
583    /// # Safety
584    /// `archetype` must be from the `World` this state was initialized from.
585    pub unsafe fn new_archetype(&mut self, archetype: &Archetype) {
586        if D::matches_component_set(&self.fetch_state, &|id| archetype.contains(id))
587            && F::matches_component_set(&self.filter_state, &|id| archetype.contains(id))
588            && self.matches_component_set(&|id| archetype.contains(id))
589        {
590            let archetype_index = archetype.id().index();
591            if !self.matched_archetypes.contains(archetype_index) {
592                self.matched_archetypes.grow_and_insert(archetype_index);
593                if !self.is_dense {
594                    self.matched_storage_ids.push(StorageId {
595                        archetype_id: archetype.id(),
596                    });
597                }
598            }
599            let table_index = archetype.table_id().as_usize();
600            if !self.matched_tables.contains(table_index) {
601                self.matched_tables.grow_and_insert(table_index);
602                if self.is_dense {
603                    self.matched_storage_ids.push(StorageId {
604                        table_id: archetype.table_id(),
605                    });
606                }
607            }
608        }
609    }
610
611    /// Returns `true` if this query matches a set of components. Otherwise, returns `false`.
612    pub fn matches_component_set(&self, set_contains_id: &impl Fn(ComponentId) -> bool) -> bool {
613        self.component_access.filter_sets.iter().any(|set| {
614            set.with
615                .ones()
616                .all(|index| set_contains_id(ComponentId::get_sparse_set_index(index)))
617                && set
618                    .without
619                    .ones()
620                    .all(|index| !set_contains_id(ComponentId::get_sparse_set_index(index)))
621        })
622    }
623
624    /// Use this to transform a [`QueryState`] into a more generic [`QueryState`].
625    /// This can be useful for passing to another function that might take the more general form.
626    /// See [`Query::transmute_lens`](crate::system::Query::transmute_lens) for more details.
627    ///
628    /// You should not call [`update_archetypes`](Self::update_archetypes) on the returned [`QueryState`] as the result will be unpredictable.
629    /// You might end up with a mix of archetypes that only matched the original query + archetypes that only match
630    /// the new [`QueryState`]. Most of the safe methods on [`QueryState`] call [`QueryState::update_archetypes`] internally, so this
631    /// best used through a [`Query`]
632    pub fn transmute<'a, NewD: QueryData>(
633        &self,
634        world: impl Into<UnsafeWorldCell<'a>>,
635    ) -> QueryState<NewD> {
636        self.transmute_filtered::<NewD, ()>(world.into())
637    }
638
639    /// Creates a new [`QueryState`] with the same underlying [`FilteredAccess`], matched tables and archetypes
640    /// as self but with a new type signature.
641    ///
642    /// Panics if `NewD` or `NewF` require accesses that this query does not have.
643    pub fn transmute_filtered<'a, NewD: QueryData, NewF: QueryFilter>(
644        &self,
645        world: impl Into<UnsafeWorldCell<'a>>,
646    ) -> QueryState<NewD, NewF> {
647        let world = world.into();
648        self.validate_world(world.id());
649
650        let mut component_access = FilteredAccess::default();
651        let mut fetch_state = NewD::get_state(world.components()).expect("Could not create fetch_state, Please initialize all referenced components before transmuting.");
652        let filter_state = NewF::get_state(world.components()).expect("Could not create filter_state, Please initialize all referenced components before transmuting.");
653
654        let mut self_access = self.component_access.clone();
655        if D::IS_READ_ONLY {
656            // The current state was transmuted from a mutable
657            // `QueryData` to a read-only one.
658            // Ignore any write access in the current state.
659            self_access.access_mut().clear_writes();
660        }
661
662        NewD::update_component_access(&fetch_state, &mut component_access);
663        NewD::provide_extra_access(
664            &mut fetch_state,
665            component_access.access_mut(),
666            self_access.access(),
667        );
668
669        let mut filter_component_access = FilteredAccess::default();
670        NewF::update_component_access(&filter_state, &mut filter_component_access);
671
672        component_access.extend(&filter_component_access);
673        assert!(
674            component_access.is_subset(&self_access),
675            "Transmuted state for {} attempts to access terms that are not allowed by original state {}.",
676            DebugName::type_name::<(NewD, NewF)>(), DebugName::type_name::<(D, F)>()
677        );
678
679        QueryState {
680            world_id: self.world_id,
681            archetype_generation: self.archetype_generation,
682            matched_storage_ids: self.matched_storage_ids.clone(),
683            is_dense: self.is_dense,
684            fetch_state,
685            filter_state,
686            component_access: self_access,
687            matched_tables: self.matched_tables.clone(),
688            matched_archetypes: self.matched_archetypes.clone(),
689            #[cfg(feature = "trace")]
690            par_iter_span: tracing::info_span!(
691                "par_for_each",
692                query = core::any::type_name::<NewD>(),
693                filter = core::any::type_name::<NewF>(),
694            ),
695        }
696    }
697
698    /// Use this to combine two queries. The data accessed will be the intersection
699    /// of archetypes included in both queries. This can be useful for accessing a
700    /// subset of the entities between two queries.
701    ///
702    /// You should not call `update_archetypes` on the returned `QueryState` as the result
703    /// could be unpredictable. You might end up with a mix of archetypes that only matched
704    /// the original query + archetypes that only match the new `QueryState`. Most of the
705    /// safe methods on `QueryState` call [`QueryState::update_archetypes`] internally, so
706    /// this is best used through a `Query`.
707    ///
708    /// ## Performance
709    ///
710    /// This will have similar performance as constructing a new `QueryState` since much of internal state
711    /// needs to be reconstructed. But it will be a little faster as it only needs to compare the intersection
712    /// of matching archetypes rather than iterating over all archetypes.
713    ///
714    /// ## Panics
715    ///
716    /// Will panic if `NewD` contains accesses not in `Q` or `OtherQ`.
717    pub fn join<'a, OtherD: QueryData, NewD: QueryData>(
718        &self,
719        world: impl Into<UnsafeWorldCell<'a>>,
720        other: &QueryState<OtherD>,
721    ) -> QueryState<NewD, ()> {
722        self.join_filtered::<_, (), NewD, ()>(world, other)
723    }
724
725    /// Use this to combine two queries. The data accessed will be the intersection
726    /// of archetypes included in both queries.
727    ///
728    /// ## Panics
729    ///
730    /// Will panic if `NewD` or `NewF` requires accesses not in `Q` or `OtherQ`.
731    pub fn join_filtered<
732        'a,
733        OtherD: QueryData,
734        OtherF: QueryFilter,
735        NewD: QueryData,
736        NewF: QueryFilter,
737    >(
738        &self,
739        world: impl Into<UnsafeWorldCell<'a>>,
740        other: &QueryState<OtherD, OtherF>,
741    ) -> QueryState<NewD, NewF> {
742        if self.world_id != other.world_id {
743            panic!("Joining queries initialized on different worlds is not allowed.");
744        }
745
746        let world = world.into();
747
748        self.validate_world(world.id());
749
750        let mut component_access = FilteredAccess::default();
751        let mut new_fetch_state = NewD::get_state(world.components())
752            .expect("Could not create fetch_state, Please initialize all referenced components before transmuting.");
753        let new_filter_state = NewF::get_state(world.components())
754            .expect("Could not create filter_state, Please initialize all referenced components before transmuting.");
755
756        let mut joined_component_access = self.component_access.clone();
757        joined_component_access.extend(&other.component_access);
758
759        if D::IS_READ_ONLY && self.component_access.access().has_any_write()
760            || OtherD::IS_READ_ONLY && other.component_access.access().has_any_write()
761        {
762            // One of the input states was transmuted from a mutable
763            // `QueryData` to a read-only one.
764            // Ignore any write access in that current state.
765            // The simplest way to do this is to clear *all* writes
766            // and then add back in any writes that are valid
767            joined_component_access.access_mut().clear_writes();
768            if !D::IS_READ_ONLY {
769                joined_component_access
770                    .access_mut()
771                    .extend(self.component_access.access());
772            }
773            if !OtherD::IS_READ_ONLY {
774                joined_component_access
775                    .access_mut()
776                    .extend(other.component_access.access());
777            }
778        }
779
780        NewD::update_component_access(&new_fetch_state, &mut component_access);
781        NewD::provide_extra_access(
782            &mut new_fetch_state,
783            component_access.access_mut(),
784            joined_component_access.access(),
785        );
786
787        let mut new_filter_component_access = FilteredAccess::default();
788        NewF::update_component_access(&new_filter_state, &mut new_filter_component_access);
789
790        component_access.extend(&new_filter_component_access);
791
792        assert!(
793            component_access.is_subset(&joined_component_access),
794            "Joined state for {} attempts to access terms that are not allowed by state {} joined with {}.",
795            DebugName::type_name::<(NewD, NewF)>(), DebugName::type_name::<(D, F)>(), DebugName::type_name::<(OtherD, OtherF)>()
796        );
797
798        if self.archetype_generation != other.archetype_generation {
799            warn!("You have tried to join queries with different archetype_generations. This could lead to unpredictable results.");
800        }
801
802        // the join is dense of both the queries were dense.
803        let is_dense = self.is_dense && other.is_dense;
804
805        // take the intersection of the matched ids
806        let mut matched_tables = self.matched_tables.clone();
807        let mut matched_archetypes = self.matched_archetypes.clone();
808        matched_tables.intersect_with(&other.matched_tables);
809        matched_archetypes.intersect_with(&other.matched_archetypes);
810        let matched_storage_ids = if is_dense {
811            matched_tables
812                .ones()
813                .map(|id| StorageId {
814                    table_id: TableId::from_usize(id),
815                })
816                .collect()
817        } else {
818            matched_archetypes
819                .ones()
820                .map(|id| StorageId {
821                    archetype_id: ArchetypeId::new(id),
822                })
823                .collect()
824        };
825
826        QueryState {
827            world_id: self.world_id,
828            archetype_generation: self.archetype_generation,
829            matched_storage_ids,
830            is_dense,
831            fetch_state: new_fetch_state,
832            filter_state: new_filter_state,
833            component_access: joined_component_access,
834            matched_tables,
835            matched_archetypes,
836            #[cfg(feature = "trace")]
837            par_iter_span: tracing::info_span!(
838                "par_for_each",
839                query = core::any::type_name::<NewD>(),
840                filter = core::any::type_name::<NewF>(),
841            ),
842        }
843    }
844
845    /// Gets the query result for the given [`World`] and [`Entity`].
846    ///
847    /// This can only be called for read-only queries, see [`Self::get_mut`] for write-queries.
848    ///
849    /// If you need to get multiple items at once but get borrowing errors,
850    /// consider using [`Self::update_archetypes`] followed by multiple [`Self::get_manual`] calls,
851    /// or making a single call with [`Self::get_many`]  or [`Self::iter_many`].
852    ///
853    /// This is always guaranteed to run in `O(1)` time.
854    #[inline]
855    pub fn get<'w>(
856        &mut self,
857        world: &'w World,
858        entity: Entity,
859    ) -> Result<ROQueryItem<'w, '_, D>, QueryEntityError> {
860        self.query(world).get_inner(entity)
861    }
862
863    /// Returns the read-only query results for the given array of [`Entity`].
864    ///
865    /// In case of a nonexisting entity or mismatched component, a [`QueryEntityError`] is
866    /// returned instead.
867    ///
868    /// Note that the unlike [`QueryState::get_many_mut`], the entities passed in do not need to be unique.
869    ///
870    /// # Examples
871    ///
872    /// ```
873    /// use bevy_ecs::prelude::*;
874    /// use bevy_ecs::query::QueryEntityError;
875    ///
876    /// #[derive(Component, PartialEq, Debug)]
877    /// struct A(usize);
878    ///
879    /// let mut world = World::new();
880    /// let entity_vec: Vec<Entity> = (0..3).map(|i|world.spawn(A(i)).id()).collect();
881    /// let entities: [Entity; 3] = entity_vec.try_into().unwrap();
882    ///
883    /// world.spawn(A(73));
884    ///
885    /// let mut query_state = world.query::<&A>();
886    ///
887    /// let component_values = query_state.get_many(&world, entities).unwrap();
888    ///
889    /// assert_eq!(component_values, [&A(0), &A(1), &A(2)]);
890    ///
891    /// let wrong_entity = Entity::from_raw_u32(365).unwrap();
892    ///
893    /// assert_eq!(match query_state.get_many(&mut world, [wrong_entity]).unwrap_err() {QueryEntityError::EntityDoesNotExist(error) => error.entity, _ => panic!()}, wrong_entity);
894    /// ```
895    #[inline]
896    pub fn get_many<'w, const N: usize>(
897        &mut self,
898        world: &'w World,
899        entities: [Entity; N],
900    ) -> Result<[ROQueryItem<'w, '_, D>; N], QueryEntityError> {
901        self.query(world).get_many_inner(entities)
902    }
903
904    /// Returns the read-only query results for the given [`UniqueEntityArray`].
905    ///
906    /// In case of a nonexisting entity or mismatched component, a [`QueryEntityError`] is
907    /// returned instead.
908    ///
909    /// # Examples
910    ///
911    /// ```
912    /// use bevy_ecs::{prelude::*, query::QueryEntityError, entity::{EntitySetIterator, UniqueEntityArray, UniqueEntityVec}};
913    ///
914    /// #[derive(Component, PartialEq, Debug)]
915    /// struct A(usize);
916    ///
917    /// let mut world = World::new();
918    /// let entity_set: UniqueEntityVec = world.spawn_batch((0..3).map(A)).collect_set();
919    /// let entity_set: UniqueEntityArray<3> = entity_set.try_into().unwrap();
920    ///
921    /// world.spawn(A(73));
922    ///
923    /// let mut query_state = world.query::<&A>();
924    ///
925    /// let component_values = query_state.get_many_unique(&world, entity_set).unwrap();
926    ///
927    /// assert_eq!(component_values, [&A(0), &A(1), &A(2)]);
928    ///
929    /// let wrong_entity = Entity::from_raw_u32(365).unwrap();
930    ///
931    /// assert_eq!(match query_state.get_many_unique(&mut world, UniqueEntityArray::from([wrong_entity])).unwrap_err() {QueryEntityError::EntityDoesNotExist(error) => error.entity, _ => panic!()}, wrong_entity);
932    /// ```
933    #[inline]
934    pub fn get_many_unique<'w, const N: usize>(
935        &mut self,
936        world: &'w World,
937        entities: UniqueEntityArray<N>,
938    ) -> Result<[ROQueryItem<'w, '_, D>; N], QueryEntityError> {
939        self.query(world).get_many_unique_inner(entities)
940    }
941
942    /// Gets the query result for the given [`World`] and [`Entity`].
943    ///
944    /// This is always guaranteed to run in `O(1)` time.
945    #[inline]
946    pub fn get_mut<'w>(
947        &mut self,
948        world: &'w mut World,
949        entity: Entity,
950    ) -> Result<D::Item<'w, '_>, QueryEntityError> {
951        self.query_mut(world).get_inner(entity)
952    }
953
954    /// Returns the query results for the given array of [`Entity`].
955    ///
956    /// In case of a nonexisting entity or mismatched component, a [`QueryEntityError`] is
957    /// returned instead.
958    ///
959    /// ```
960    /// use bevy_ecs::prelude::*;
961    /// use bevy_ecs::query::QueryEntityError;
962    ///
963    /// #[derive(Component, PartialEq, Debug)]
964    /// struct A(usize);
965    ///
966    /// let mut world = World::new();
967    ///
968    /// let entities: Vec<Entity> = (0..3).map(|i|world.spawn(A(i)).id()).collect();
969    /// let entities: [Entity; 3] = entities.try_into().unwrap();
970    ///
971    /// world.spawn(A(73));
972    ///
973    /// let mut query_state = world.query::<&mut A>();
974    ///
975    /// let mut mutable_component_values = query_state.get_many_mut(&mut world, entities).unwrap();
976    ///
977    /// for mut a in &mut mutable_component_values {
978    ///     a.0 += 5;
979    /// }
980    ///
981    /// let component_values = query_state.get_many(&world, entities).unwrap();
982    ///
983    /// assert_eq!(component_values, [&A(5), &A(6), &A(7)]);
984    ///
985    /// let wrong_entity = Entity::from_raw_u32(57).unwrap();
986    /// let invalid_entity = world.spawn_empty().id();
987    ///
988    /// assert_eq!(match query_state.get_many(&mut world, [wrong_entity]).unwrap_err() {QueryEntityError::EntityDoesNotExist(error) => error.entity, _ => panic!()}, wrong_entity);
989    /// assert_eq!(match query_state.get_many_mut(&mut world, [invalid_entity]).unwrap_err() {QueryEntityError::QueryDoesNotMatch(entity, _) => entity, _ => panic!()}, invalid_entity);
990    /// assert_eq!(query_state.get_many_mut(&mut world, [entities[0], entities[0]]).unwrap_err(), QueryEntityError::AliasedMutability(entities[0]));
991    /// ```
992    #[inline]
993    pub fn get_many_mut<'w, const N: usize>(
994        &mut self,
995        world: &'w mut World,
996        entities: [Entity; N],
997    ) -> Result<[D::Item<'w, '_>; N], QueryEntityError> {
998        self.query_mut(world).get_many_mut_inner(entities)
999    }
1000
1001    /// Returns the query results for the given [`UniqueEntityArray`].
1002    ///
1003    /// In case of a nonexisting entity or mismatched component, a [`QueryEntityError`] is
1004    /// returned instead.
1005    ///
1006    /// ```
1007    /// use bevy_ecs::{prelude::*, query::QueryEntityError, entity::{EntitySetIterator, UniqueEntityArray, UniqueEntityVec}};
1008    ///
1009    /// #[derive(Component, PartialEq, Debug)]
1010    /// struct A(usize);
1011    ///
1012    /// let mut world = World::new();
1013    ///
1014    /// let entity_set: UniqueEntityVec = world.spawn_batch((0..3).map(A)).collect_set();
1015    /// let entity_set: UniqueEntityArray<3> = entity_set.try_into().unwrap();
1016    ///
1017    /// world.spawn(A(73));
1018    ///
1019    /// let mut query_state = world.query::<&mut A>();
1020    ///
1021    /// let mut mutable_component_values = query_state.get_many_unique_mut(&mut world, entity_set).unwrap();
1022    ///
1023    /// for mut a in &mut mutable_component_values {
1024    ///     a.0 += 5;
1025    /// }
1026    ///
1027    /// let component_values = query_state.get_many_unique(&world, entity_set).unwrap();
1028    ///
1029    /// assert_eq!(component_values, [&A(5), &A(6), &A(7)]);
1030    ///
1031    /// let wrong_entity = Entity::from_raw_u32(57).unwrap();
1032    /// let invalid_entity = world.spawn_empty().id();
1033    ///
1034    /// assert_eq!(match query_state.get_many_unique(&mut world, UniqueEntityArray::from([wrong_entity])).unwrap_err() {QueryEntityError::EntityDoesNotExist(error) => error.entity, _ => panic!()}, wrong_entity);
1035    /// assert_eq!(match query_state.get_many_unique_mut(&mut world, UniqueEntityArray::from([invalid_entity])).unwrap_err() {QueryEntityError::QueryDoesNotMatch(entity, _) => entity, _ => panic!()}, invalid_entity);
1036    /// ```
1037    #[inline]
1038    pub fn get_many_unique_mut<'w, const N: usize>(
1039        &mut self,
1040        world: &'w mut World,
1041        entities: UniqueEntityArray<N>,
1042    ) -> Result<[D::Item<'w, '_>; N], QueryEntityError> {
1043        self.query_mut(world).get_many_unique_inner(entities)
1044    }
1045
1046    /// Gets the query result for the given [`World`] and [`Entity`].
1047    ///
1048    /// This method is slightly more efficient than [`QueryState::get`] in some situations, since
1049    /// it does not update this instance's internal cache. This method will return an error if `entity`
1050    /// belongs to an archetype that has not been cached.
1051    ///
1052    /// To ensure that the cache is up to date, call [`QueryState::update_archetypes`] before this method.
1053    /// The cache is also updated in [`QueryState::new`], `QueryState::get`, or any method with mutable
1054    /// access to `self`.
1055    ///
1056    /// This can only be called for read-only queries, see [`Self::get_mut`] for mutable queries.
1057    ///
1058    /// This is always guaranteed to run in `O(1)` time.
1059    #[inline]
1060    pub fn get_manual<'w>(
1061        &self,
1062        world: &'w World,
1063        entity: Entity,
1064    ) -> Result<ROQueryItem<'w, '_, D>, QueryEntityError> {
1065        self.query_manual(world).get_inner(entity)
1066    }
1067
1068    /// Gets the query result for the given [`World`] and [`Entity`].
1069    ///
1070    /// This is always guaranteed to run in `O(1)` time.
1071    ///
1072    /// # Safety
1073    ///
1074    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
1075    /// have unique access to the components they query.
1076    #[inline]
1077    pub unsafe fn get_unchecked<'w>(
1078        &mut self,
1079        world: UnsafeWorldCell<'w>,
1080        entity: Entity,
1081    ) -> Result<D::Item<'w, '_>, QueryEntityError> {
1082        self.query_unchecked(world).get_inner(entity)
1083    }
1084
1085    /// Returns an [`Iterator`] over the query results for the given [`World`].
1086    ///
1087    /// This can only be called for read-only queries, see [`Self::iter_mut`] for write-queries.
1088    ///
1089    /// If you need to iterate multiple times at once but get borrowing errors,
1090    /// consider using [`Self::update_archetypes`] followed by multiple [`Self::iter_manual`] calls.
1091    #[inline]
1092    pub fn iter<'w, 's>(&'s mut self, world: &'w World) -> QueryIter<'w, 's, D::ReadOnly, F> {
1093        self.query(world).into_iter()
1094    }
1095
1096    /// Returns an [`Iterator`] over the query results for the given [`World`].
1097    ///
1098    /// This iterator is always guaranteed to return results from each matching entity once and only once.
1099    /// Iteration order is not guaranteed.
1100    #[inline]
1101    pub fn iter_mut<'w, 's>(&'s mut self, world: &'w mut World) -> QueryIter<'w, 's, D, F> {
1102        self.query_mut(world).into_iter()
1103    }
1104
1105    /// Returns an [`Iterator`] over the query results for the given [`World`] without updating the query's archetypes.
1106    /// Archetypes must be manually updated before by using [`Self::update_archetypes`].
1107    ///
1108    /// This iterator is always guaranteed to return results from each matching entity once and only once.
1109    /// Iteration order is not guaranteed.
1110    ///
1111    /// This can only be called for read-only queries.
1112    #[inline]
1113    pub fn iter_manual<'w, 's>(&'s self, world: &'w World) -> QueryIter<'w, 's, D::ReadOnly, F> {
1114        self.query_manual(world).into_iter()
1115    }
1116
1117    /// Returns an [`Iterator`] over all possible combinations of `K` query results without repetition.
1118    /// This can only be called for read-only queries.
1119    ///
1120    /// A combination is an arrangement of a collection of items where order does not matter.
1121    ///
1122    /// `K` is the number of items that make up each subset, and the number of items returned by the iterator.
1123    /// `N` is the number of total entities output by query.
1124    ///
1125    /// For example, given the list [1, 2, 3, 4], where `K` is 2, the combinations without repeats are
1126    /// [1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4].
1127    /// And in this case, `N` would be defined as 4 since the size of the input list is 4.
1128    ///
1129    ///  For combinations of size `K` of query taking `N` inputs, you will get:
1130    /// - if `K == N`: one combination of all query results
1131    /// - if `K < N`: all possible `K`-sized combinations of query results, without repetition
1132    /// - if `K > N`: empty set (no `K`-sized combinations exist)
1133    ///
1134    /// The `iter_combinations` method does not guarantee order of iteration.
1135    ///
1136    /// This iterator is always guaranteed to return results from each unique pair of matching entities.
1137    /// Iteration order is not guaranteed.
1138    ///
1139    /// This can only be called for read-only queries, see [`Self::iter_combinations_mut`] for
1140    /// write-queries.
1141    #[inline]
1142    pub fn iter_combinations<'w, 's, const K: usize>(
1143        &'s mut self,
1144        world: &'w World,
1145    ) -> QueryCombinationIter<'w, 's, D::ReadOnly, F, K> {
1146        self.query(world).iter_combinations_inner()
1147    }
1148
1149    /// Returns an [`Iterator`] over all possible combinations of `K` query results without repetition.
1150    ///
1151    /// A combination is an arrangement of a collection of items where order does not matter.
1152    ///
1153    /// `K` is the number of items that make up each subset, and the number of items returned by the iterator.
1154    /// `N` is the number of total entities output by query.
1155    ///
1156    /// For example, given the list [1, 2, 3, 4], where `K` is 2, the combinations without repeats are
1157    /// [1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4].
1158    /// And in this case, `N` would be defined as 4 since the size of the input list is 4.
1159    ///
1160    ///  For combinations of size `K` of query taking `N` inputs, you will get:
1161    /// - if `K == N`: one combination of all query results
1162    /// - if `K < N`: all possible `K`-sized combinations of query results, without repetition
1163    /// - if `K > N`: empty set (no `K`-sized combinations exist)
1164    ///
1165    /// The `iter_combinations_mut` method does not guarantee order of iteration.
1166    #[inline]
1167    pub fn iter_combinations_mut<'w, 's, const K: usize>(
1168        &'s mut self,
1169        world: &'w mut World,
1170    ) -> QueryCombinationIter<'w, 's, D, F, K> {
1171        self.query_mut(world).iter_combinations_inner()
1172    }
1173
1174    /// Returns an [`Iterator`] over the read-only query items generated from an [`Entity`] list.
1175    ///
1176    /// Items are returned in the order of the list of entities.
1177    /// Entities that don't match the query are skipped.
1178    ///
1179    /// If you need to iterate multiple times at once but get borrowing errors,
1180    /// consider using [`Self::update_archetypes`] followed by multiple [`Self::iter_many_manual`] calls.
1181    ///
1182    /// # See also
1183    ///
1184    /// - [`iter_many_mut`](Self::iter_many_mut) to get mutable query items.
1185    #[inline]
1186    pub fn iter_many<'w, 's, EntityList: IntoIterator<Item: EntityEquivalent>>(
1187        &'s mut self,
1188        world: &'w World,
1189        entities: EntityList,
1190    ) -> QueryManyIter<'w, 's, D::ReadOnly, F, EntityList::IntoIter> {
1191        self.query(world).iter_many_inner(entities)
1192    }
1193
1194    /// Returns an [`Iterator`] over the read-only query items generated from an [`Entity`] list.
1195    ///
1196    /// Items are returned in the order of the list of entities.
1197    /// Entities that don't match the query are skipped.
1198    ///
1199    /// If `world` archetypes changed since [`Self::update_archetypes`] was last called,
1200    /// this will skip entities contained in new archetypes.
1201    ///
1202    /// This can only be called for read-only queries.
1203    ///
1204    /// # See also
1205    ///
1206    /// - [`iter_many`](Self::iter_many) to update archetypes.
1207    /// - [`iter_manual`](Self::iter_manual) to iterate over all query items.
1208    #[inline]
1209    pub fn iter_many_manual<'w, 's, EntityList: IntoIterator<Item: EntityEquivalent>>(
1210        &'s self,
1211        world: &'w World,
1212        entities: EntityList,
1213    ) -> QueryManyIter<'w, 's, D::ReadOnly, F, EntityList::IntoIter> {
1214        self.query_manual(world).iter_many_inner(entities)
1215    }
1216
1217    /// Returns an iterator over the query items generated from an [`Entity`] list.
1218    ///
1219    /// Items are returned in the order of the list of entities.
1220    /// Entities that don't match the query are skipped.
1221    #[inline]
1222    pub fn iter_many_mut<'w, 's, EntityList: IntoIterator<Item: EntityEquivalent>>(
1223        &'s mut self,
1224        world: &'w mut World,
1225        entities: EntityList,
1226    ) -> QueryManyIter<'w, 's, D, F, EntityList::IntoIter> {
1227        self.query_mut(world).iter_many_inner(entities)
1228    }
1229
1230    /// Returns an [`Iterator`] over the unique read-only query items generated from an [`EntitySet`].
1231    ///
1232    /// Items are returned in the order of the list of entities.
1233    /// Entities that don't match the query are skipped.
1234    ///
1235    /// # See also
1236    ///
1237    /// - [`iter_many_unique_mut`](Self::iter_many_unique_mut) to get mutable query items.
1238    #[inline]
1239    pub fn iter_many_unique<'w, 's, EntityList: EntitySet>(
1240        &'s mut self,
1241        world: &'w World,
1242        entities: EntityList,
1243    ) -> QueryManyUniqueIter<'w, 's, D::ReadOnly, F, EntityList::IntoIter> {
1244        self.query(world).iter_many_unique_inner(entities)
1245    }
1246
1247    /// Returns an [`Iterator`] over the unique read-only query items generated from an [`EntitySet`].
1248    ///
1249    /// Items are returned in the order of the list of entities.
1250    /// Entities that don't match the query are skipped.
1251    ///
1252    /// If `world` archetypes changed since [`Self::update_archetypes`] was last called,
1253    /// this will skip entities contained in new archetypes.
1254    ///
1255    /// This can only be called for read-only queries.
1256    ///
1257    /// # See also
1258    ///
1259    /// - [`iter_many_unique`](Self::iter_many) to update archetypes.
1260    /// - [`iter_many`](Self::iter_many) to iterate over a non-unique entity list.
1261    /// - [`iter_manual`](Self::iter_manual) to iterate over all query items.
1262    #[inline]
1263    pub fn iter_many_unique_manual<'w, 's, EntityList: EntitySet>(
1264        &'s self,
1265        world: &'w World,
1266        entities: EntityList,
1267    ) -> QueryManyUniqueIter<'w, 's, D::ReadOnly, F, EntityList::IntoIter> {
1268        self.query_manual(world).iter_many_unique_inner(entities)
1269    }
1270
1271    /// Returns an iterator over the unique query items generated from an [`EntitySet`].
1272    ///
1273    /// Items are returned in the order of the list of entities.
1274    /// Entities that don't match the query are skipped.
1275    #[inline]
1276    pub fn iter_many_unique_mut<'w, 's, EntityList: EntitySet>(
1277        &'s mut self,
1278        world: &'w mut World,
1279        entities: EntityList,
1280    ) -> QueryManyUniqueIter<'w, 's, D, F, EntityList::IntoIter> {
1281        self.query_mut(world).iter_many_unique_inner(entities)
1282    }
1283    /// Returns an [`Iterator`] over the query results for the given [`World`].
1284    ///
1285    /// This iterator is always guaranteed to return results from each matching entity once and only once.
1286    /// Iteration order is not guaranteed.
1287    ///
1288    /// # Safety
1289    ///
1290    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
1291    /// have unique access to the components they query.
1292    #[inline]
1293    pub unsafe fn iter_unchecked<'w, 's>(
1294        &'s mut self,
1295        world: UnsafeWorldCell<'w>,
1296    ) -> QueryIter<'w, 's, D, F> {
1297        self.query_unchecked(world).into_iter()
1298    }
1299
1300    /// Returns an [`Iterator`] over all possible combinations of `K` query results for the
1301    /// given [`World`] without repetition.
1302    /// This can only be called for read-only queries.
1303    ///
1304    /// This iterator is always guaranteed to return results from each unique pair of matching entities.
1305    /// Iteration order is not guaranteed.
1306    ///
1307    /// # Safety
1308    ///
1309    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
1310    /// have unique access to the components they query.
1311    #[inline]
1312    pub unsafe fn iter_combinations_unchecked<'w, 's, const K: usize>(
1313        &'s mut self,
1314        world: UnsafeWorldCell<'w>,
1315    ) -> QueryCombinationIter<'w, 's, D, F, K> {
1316        self.query_unchecked(world).iter_combinations_inner()
1317    }
1318
1319    /// Returns a parallel iterator over the query results for the given [`World`].
1320    ///
1321    /// This can only be called for read-only queries, see [`par_iter_mut`] for write-queries.
1322    ///
1323    /// Note that you must use the `for_each` method to iterate over the
1324    /// results, see [`par_iter_mut`] for an example.
1325    ///
1326    /// [`par_iter_mut`]: Self::par_iter_mut
1327    #[inline]
1328    pub fn par_iter<'w, 's>(
1329        &'s mut self,
1330        world: &'w World,
1331    ) -> QueryParIter<'w, 's, D::ReadOnly, F> {
1332        self.query(world).par_iter_inner()
1333    }
1334
1335    /// Returns a parallel iterator over the query results for the given [`World`].
1336    ///
1337    /// This can only be called for mutable queries, see [`par_iter`] for read-only-queries.
1338    ///
1339    /// # Examples
1340    ///
1341    /// ```
1342    /// use bevy_ecs::prelude::*;
1343    /// use bevy_ecs::query::QueryEntityError;
1344    ///
1345    /// #[derive(Component, PartialEq, Debug)]
1346    /// struct A(usize);
1347    ///
1348    /// # bevy_tasks::ComputeTaskPool::get_or_init(|| bevy_tasks::TaskPool::new());
1349    ///
1350    /// let mut world = World::new();
1351    ///
1352    /// # let entities: Vec<Entity> = (0..3).map(|i| world.spawn(A(i)).id()).collect();
1353    /// # let entities: [Entity; 3] = entities.try_into().unwrap();
1354    ///
1355    /// let mut query_state = world.query::<&mut A>();
1356    ///
1357    /// query_state.par_iter_mut(&mut world).for_each(|mut a| {
1358    ///     a.0 += 5;
1359    /// });
1360    ///
1361    /// # let component_values = query_state.get_many(&world, entities).unwrap();
1362    ///
1363    /// # assert_eq!(component_values, [&A(5), &A(6), &A(7)]);
1364    ///
1365    /// # let wrong_entity = Entity::from_raw_u32(57).unwrap();
1366    /// # let invalid_entity = world.spawn_empty().id();
1367    ///
1368    /// # assert_eq!(match query_state.get_many(&mut world, [wrong_entity]).unwrap_err() {QueryEntityError::EntityDoesNotExist(error) => error.entity, _ => panic!()}, wrong_entity);
1369    /// assert_eq!(match query_state.get_many_mut(&mut world, [invalid_entity]).unwrap_err() {QueryEntityError::QueryDoesNotMatch(entity, _) => entity, _ => panic!()}, invalid_entity);
1370    /// # assert_eq!(query_state.get_many_mut(&mut world, [entities[0], entities[0]]).unwrap_err(), QueryEntityError::AliasedMutability(entities[0]));
1371    /// ```
1372    ///
1373    /// # Panics
1374    /// The [`ComputeTaskPool`] is not initialized. If using this from a query that is being
1375    /// initialized and run from the ECS scheduler, this should never panic.
1376    ///
1377    /// [`par_iter`]: Self::par_iter
1378    /// [`ComputeTaskPool`]: bevy_tasks::ComputeTaskPool
1379    #[inline]
1380    pub fn par_iter_mut<'w, 's>(&'s mut self, world: &'w mut World) -> QueryParIter<'w, 's, D, F> {
1381        self.query_mut(world).par_iter_inner()
1382    }
1383
1384    /// Runs `func` on each query result in parallel for the given [`World`], where the last change and
1385    /// the current change tick are given. This is faster than the equivalent
1386    /// `iter()` method, but cannot be chained like a normal [`Iterator`].
1387    ///
1388    /// # Panics
1389    /// The [`ComputeTaskPool`] is not initialized. If using this from a query that is being
1390    /// initialized and run from the ECS scheduler, this should never panic.
1391    ///
1392    /// # Safety
1393    ///
1394    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
1395    /// have unique access to the components they query.
1396    /// This does not validate that `world.id()` matches `self.world_id`. Calling this on a `world`
1397    /// with a mismatched [`WorldId`] is unsound.
1398    ///
1399    /// [`ComputeTaskPool`]: bevy_tasks::ComputeTaskPool
1400    #[cfg(all(not(target_arch = "wasm32"), feature = "multi_threaded"))]
1401    pub(crate) unsafe fn par_fold_init_unchecked_manual<'w, 's, T, FN, INIT>(
1402        &'s self,
1403        init_accum: INIT,
1404        world: UnsafeWorldCell<'w>,
1405        batch_size: u32,
1406        func: FN,
1407        last_run: Tick,
1408        this_run: Tick,
1409    ) where
1410        FN: Fn(T, D::Item<'w, 's>) -> T + Send + Sync + Clone,
1411        INIT: Fn() -> T + Sync + Send + Clone,
1412    {
1413        // NOTE: If you are changing query iteration code, remember to update the following places, where relevant:
1414        // QueryIter, QueryIterationCursor, QueryManyIter, QueryCombinationIter,QueryState::par_fold_init_unchecked_manual,
1415        // QueryState::par_many_fold_init_unchecked_manual, QueryState::par_many_unique_fold_init_unchecked_manual
1416        use arrayvec::ArrayVec;
1417
1418        bevy_tasks::ComputeTaskPool::get().scope(|scope| {
1419            // SAFETY: We only access table data that has been registered in `self.component_access`.
1420            let tables = unsafe { &world.storages().tables };
1421            let archetypes = world.archetypes();
1422            let mut batch_queue = ArrayVec::new();
1423            let mut queue_entity_count = 0;
1424
1425            // submit a list of storages which smaller than batch_size as single task
1426            let submit_batch_queue = |queue: &mut ArrayVec<StorageId, 128>| {
1427                if queue.is_empty() {
1428                    return;
1429                }
1430                let queue = core::mem::take(queue);
1431                let mut func = func.clone();
1432                let init_accum = init_accum.clone();
1433                scope.spawn(async move {
1434                    #[cfg(feature = "trace")]
1435                    let _span = self.par_iter_span.enter();
1436                    let mut iter = self
1437                        .query_unchecked_manual_with_ticks(world, last_run, this_run)
1438                        .into_iter();
1439                    let mut accum = init_accum();
1440                    for storage_id in queue {
1441                        accum = iter.fold_over_storage_range(accum, &mut func, storage_id, None);
1442                    }
1443                });
1444            };
1445
1446            // submit single storage larger than batch_size
1447            let submit_single = |count, storage_id: StorageId| {
1448                for offset in (0..count).step_by(batch_size as usize) {
1449                    let mut func = func.clone();
1450                    let init_accum = init_accum.clone();
1451                    let len = batch_size.min(count - offset);
1452                    let batch = offset..offset + len;
1453                    scope.spawn(async move {
1454                        #[cfg(feature = "trace")]
1455                        let _span = self.par_iter_span.enter();
1456                        let accum = init_accum();
1457                        self.query_unchecked_manual_with_ticks(world, last_run, this_run)
1458                            .into_iter()
1459                            .fold_over_storage_range(accum, &mut func, storage_id, Some(batch));
1460                    });
1461                }
1462            };
1463
1464            let storage_entity_count = |storage_id: StorageId| -> u32 {
1465                if self.is_dense {
1466                    tables[storage_id.table_id].entity_count()
1467                } else {
1468                    archetypes[storage_id.archetype_id].len()
1469                }
1470            };
1471
1472            for storage_id in &self.matched_storage_ids {
1473                let count = storage_entity_count(*storage_id);
1474
1475                // skip empty storage
1476                if count == 0 {
1477                    continue;
1478                }
1479                // immediately submit large storage
1480                if count >= batch_size {
1481                    submit_single(count, *storage_id);
1482                    continue;
1483                }
1484                // merge small storage
1485                batch_queue.push(*storage_id);
1486                queue_entity_count += count;
1487
1488                // submit batch_queue
1489                if queue_entity_count >= batch_size || batch_queue.is_full() {
1490                    submit_batch_queue(&mut batch_queue);
1491                    queue_entity_count = 0;
1492                }
1493            }
1494            submit_batch_queue(&mut batch_queue);
1495        });
1496    }
1497
1498    /// Runs `func` on each query result in parallel for the given [`EntitySet`],
1499    /// where the last change and the current change tick are given. This is faster than the
1500    /// equivalent `iter_many_unique()` method, but cannot be chained like a normal [`Iterator`].
1501    ///
1502    /// # Panics
1503    /// The [`ComputeTaskPool`] is not initialized. If using this from a query that is being
1504    /// initialized and run from the ECS scheduler, this should never panic.
1505    ///
1506    /// # Safety
1507    ///
1508    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
1509    /// have unique access to the components they query.
1510    /// This does not validate that `world.id()` matches `self.world_id`. Calling this on a `world`
1511    /// with a mismatched [`WorldId`] is unsound.
1512    ///
1513    /// [`ComputeTaskPool`]: bevy_tasks::ComputeTaskPool
1514    #[cfg(all(not(target_arch = "wasm32"), feature = "multi_threaded"))]
1515    pub(crate) unsafe fn par_many_unique_fold_init_unchecked_manual<'w, 's, T, FN, INIT, E>(
1516        &'s self,
1517        init_accum: INIT,
1518        world: UnsafeWorldCell<'w>,
1519        entity_list: &UniqueEntityEquivalentSlice<E>,
1520        batch_size: u32,
1521        mut func: FN,
1522        last_run: Tick,
1523        this_run: Tick,
1524    ) where
1525        FN: Fn(T, D::Item<'w, 's>) -> T + Send + Sync + Clone,
1526        INIT: Fn() -> T + Sync + Send + Clone,
1527        E: EntityEquivalent + Sync,
1528    {
1529        // NOTE: If you are changing query iteration code, remember to update the following places, where relevant:
1530        // QueryIter, QueryIterationCursor, QueryManyIter, QueryCombinationIter,QueryState::par_fold_init_unchecked_manual
1531        // QueryState::par_many_fold_init_unchecked_manual, QueryState::par_many_unique_fold_init_unchecked_manual
1532
1533        bevy_tasks::ComputeTaskPool::get().scope(|scope| {
1534            let chunks = entity_list.chunks_exact(batch_size as usize);
1535            let remainder = chunks.remainder();
1536
1537            for batch in chunks {
1538                let mut func = func.clone();
1539                let init_accum = init_accum.clone();
1540                scope.spawn(async move {
1541                    #[cfg(feature = "trace")]
1542                    let _span = self.par_iter_span.enter();
1543                    let accum = init_accum();
1544                    self.query_unchecked_manual_with_ticks(world, last_run, this_run)
1545                        .iter_many_unique_inner(batch)
1546                        .fold(accum, &mut func);
1547                });
1548            }
1549
1550            #[cfg(feature = "trace")]
1551            let _span = self.par_iter_span.enter();
1552            let accum = init_accum();
1553            self.query_unchecked_manual_with_ticks(world, last_run, this_run)
1554                .iter_many_unique_inner(remainder)
1555                .fold(accum, &mut func);
1556        });
1557    }
1558}
1559
1560impl<D: ReadOnlyQueryData, F: QueryFilter> QueryState<D, F> {
1561    /// Runs `func` on each read-only query result in parallel for the given [`Entity`] list,
1562    /// where the last change and the current change tick are given. This is faster than the equivalent
1563    /// `iter_many()` method, but cannot be chained like a normal [`Iterator`].
1564    ///
1565    /// # Panics
1566    /// The [`ComputeTaskPool`] is not initialized. If using this from a query that is being
1567    /// initialized and run from the ECS scheduler, this should never panic.
1568    ///
1569    /// # Safety
1570    ///
1571    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
1572    /// have unique access to the components they query.
1573    /// This does not validate that `world.id()` matches `self.world_id`. Calling this on a `world`
1574    /// with a mismatched [`WorldId`] is unsound.
1575    ///
1576    /// [`ComputeTaskPool`]: bevy_tasks::ComputeTaskPool
1577    #[cfg(all(not(target_arch = "wasm32"), feature = "multi_threaded"))]
1578    pub(crate) unsafe fn par_many_fold_init_unchecked_manual<'w, 's, T, FN, INIT, E>(
1579        &'s self,
1580        init_accum: INIT,
1581        world: UnsafeWorldCell<'w>,
1582        entity_list: &[E],
1583        batch_size: u32,
1584        mut func: FN,
1585        last_run: Tick,
1586        this_run: Tick,
1587    ) where
1588        FN: Fn(T, D::Item<'w, 's>) -> T + Send + Sync + Clone,
1589        INIT: Fn() -> T + Sync + Send + Clone,
1590        E: EntityEquivalent + Sync,
1591    {
1592        // NOTE: If you are changing query iteration code, remember to update the following places, where relevant:
1593        // QueryIter, QueryIterationCursor, QueryManyIter, QueryCombinationIter, QueryState::par_fold_init_unchecked_manual
1594        // QueryState::par_many_fold_init_unchecked_manual, QueryState::par_many_unique_fold_init_unchecked_manual
1595
1596        bevy_tasks::ComputeTaskPool::get().scope(|scope| {
1597            let chunks = entity_list.chunks_exact(batch_size as usize);
1598            let remainder = chunks.remainder();
1599
1600            for batch in chunks {
1601                let mut func = func.clone();
1602                let init_accum = init_accum.clone();
1603                scope.spawn(async move {
1604                    #[cfg(feature = "trace")]
1605                    let _span = self.par_iter_span.enter();
1606                    let accum = init_accum();
1607                    self.query_unchecked_manual_with_ticks(world, last_run, this_run)
1608                        .iter_many_inner(batch)
1609                        .fold(accum, &mut func);
1610                });
1611            }
1612
1613            #[cfg(feature = "trace")]
1614            let _span = self.par_iter_span.enter();
1615            let accum = init_accum();
1616            self.query_unchecked_manual_with_ticks(world, last_run, this_run)
1617                .iter_many_inner(remainder)
1618                .fold(accum, &mut func);
1619        });
1620    }
1621}
1622
1623impl<D: QueryData, F: QueryFilter> QueryState<D, F> {
1624    /// Returns a single immutable query result when there is exactly one entity matching
1625    /// the query.
1626    ///
1627    /// This can only be called for read-only queries,
1628    /// see [`single_mut`](Self::single_mut) for write-queries.
1629    ///
1630    /// If the number of query results is not exactly one, a [`QuerySingleError`] is returned
1631    /// instead.
1632    ///
1633    /// # Example
1634    ///
1635    /// Sometimes, you might want to handle the error in a specific way,
1636    /// generally by spawning the missing entity.
1637    ///
1638    /// ```rust
1639    /// use bevy_ecs::prelude::*;
1640    /// use bevy_ecs::query::QuerySingleError;
1641    ///
1642    /// #[derive(Component)]
1643    /// struct A(usize);
1644    ///
1645    /// fn my_system(query: Query<&A>, mut commands: Commands) {
1646    ///     match query.single() {
1647    ///         Ok(a) => (), // Do something with `a`
1648    ///         Err(err) => match err {
1649    ///             QuerySingleError::NoEntities(_) => {
1650    ///                 commands.spawn(A(0));
1651    ///             }
1652    ///             QuerySingleError::MultipleEntities(_) => panic!("Multiple entities found!"),
1653    ///         },
1654    ///     }
1655    /// }
1656    /// ```
1657    ///
1658    /// However in most cases, this error can simply be handled with a graceful early return.
1659    /// If this is an expected failure mode, you can do this using the `let else` pattern like so:
1660    /// ```rust
1661    /// use bevy_ecs::prelude::*;
1662    ///
1663    /// #[derive(Component)]
1664    /// struct A(usize);
1665    ///
1666    /// fn my_system(query: Query<&A>) {
1667    ///   let Ok(a) = query.single() else {
1668    ///     return;
1669    ///   };
1670    ///
1671    ///   // Do something with `a`
1672    /// }
1673    /// ```
1674    ///
1675    /// If this is unexpected though, you should probably use the `?` operator
1676    /// in combination with Bevy's error handling apparatus.
1677    ///
1678    /// ```rust
1679    /// use bevy_ecs::prelude::*;
1680    ///
1681    /// #[derive(Component)]
1682    /// struct A(usize);
1683    ///
1684    /// fn my_system(query: Query<&A>) -> Result {
1685    ///  let a = query.single()?;
1686    ///
1687    ///  // Do something with `a`
1688    ///  Ok(())
1689    /// }
1690    /// ```
1691    ///
1692    /// This allows you to globally control how errors are handled in your application,
1693    /// by setting up a custom error handler.
1694    /// See the [`bevy_ecs::error`] module docs for more information!
1695    /// Commonly, you might want to panic on an error during development, but log the error and continue
1696    /// execution in production.
1697    ///
1698    /// Simply unwrapping the [`Result`] also works, but should generally be reserved for tests.
1699    #[inline]
1700    pub fn single<'w>(
1701        &mut self,
1702        world: &'w World,
1703    ) -> Result<ROQueryItem<'w, '_, D>, QuerySingleError> {
1704        self.query(world).single_inner()
1705    }
1706
1707    /// Returns a single mutable query result when there is exactly one entity matching
1708    /// the query.
1709    ///
1710    /// If the number of query results is not exactly one, a [`QuerySingleError`] is returned
1711    /// instead.
1712    ///
1713    /// # Examples
1714    ///
1715    /// Please see [`Query::single`] for advice on handling the error.
1716    #[inline]
1717    pub fn single_mut<'w>(
1718        &mut self,
1719        world: &'w mut World,
1720    ) -> Result<D::Item<'w, '_>, QuerySingleError> {
1721        self.query_mut(world).single_inner()
1722    }
1723
1724    /// Returns a query result when there is exactly one entity matching the query.
1725    ///
1726    /// If the number of query results is not exactly one, a [`QuerySingleError`] is returned
1727    /// instead.
1728    ///
1729    /// # Safety
1730    ///
1731    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
1732    /// have unique access to the components they query.
1733    #[inline]
1734    pub unsafe fn single_unchecked<'w>(
1735        &mut self,
1736        world: UnsafeWorldCell<'w>,
1737    ) -> Result<D::Item<'w, '_>, QuerySingleError> {
1738        self.query_unchecked(world).single_inner()
1739    }
1740
1741    /// Returns a query result when there is exactly one entity matching the query,
1742    /// where the last change and the current change tick are given.
1743    ///
1744    /// If the number of query results is not exactly one, a [`QuerySingleError`] is returned
1745    /// instead.
1746    ///
1747    /// # Safety
1748    ///
1749    /// This does not check for mutable query correctness. To be safe, make sure mutable queries
1750    /// have unique access to the components they query.
1751    /// This does not validate that `world.id()` matches `self.world_id`. Calling this on a `world`
1752    /// with a mismatched [`WorldId`] is unsound.
1753    #[inline]
1754    pub unsafe fn single_unchecked_manual<'w>(
1755        &self,
1756        world: UnsafeWorldCell<'w>,
1757        last_run: Tick,
1758        this_run: Tick,
1759    ) -> Result<D::Item<'w, '_>, QuerySingleError> {
1760        // SAFETY:
1761        // - The caller ensured we have the correct access to the world.
1762        // - The caller ensured that the world matches.
1763        self.query_unchecked_manual_with_ticks(world, last_run, this_run)
1764            .single_inner()
1765    }
1766}
1767
1768impl<D: QueryData, F: QueryFilter> From<QueryBuilder<'_, D, F>> for QueryState<D, F> {
1769    fn from(mut value: QueryBuilder<D, F>) -> Self {
1770        QueryState::from_builder(&mut value)
1771    }
1772}
1773
1774#[cfg(test)]
1775mod tests {
1776    use crate::{
1777        component::Component,
1778        entity_disabling::DefaultQueryFilters,
1779        prelude::*,
1780        system::{QueryLens, RunSystemOnce},
1781        world::{FilteredEntityMut, FilteredEntityRef},
1782    };
1783
1784    #[test]
1785    #[should_panic]
1786    fn right_world_get() {
1787        let mut world_1 = World::new();
1788        let world_2 = World::new();
1789
1790        let mut query_state = world_1.query::<Entity>();
1791        let _panics = query_state.get(&world_2, Entity::from_raw_u32(0).unwrap());
1792    }
1793
1794    #[test]
1795    #[should_panic]
1796    fn right_world_get_many() {
1797        let mut world_1 = World::new();
1798        let world_2 = World::new();
1799
1800        let mut query_state = world_1.query::<Entity>();
1801        let _panics = query_state.get_many(&world_2, []);
1802    }
1803
1804    #[test]
1805    #[should_panic]
1806    fn right_world_get_many_mut() {
1807        let mut world_1 = World::new();
1808        let mut world_2 = World::new();
1809
1810        let mut query_state = world_1.query::<Entity>();
1811        let _panics = query_state.get_many_mut(&mut world_2, []);
1812    }
1813
1814    #[derive(Component, PartialEq, Debug)]
1815    struct A(usize);
1816
1817    #[derive(Component, PartialEq, Debug)]
1818    struct B(usize);
1819
1820    #[derive(Component, PartialEq, Debug)]
1821    struct C(usize);
1822
1823    #[test]
1824    fn can_transmute_to_more_general() {
1825        let mut world = World::new();
1826        world.spawn((A(1), B(0)));
1827
1828        let query_state = world.query::<(&A, &B)>();
1829        let mut new_query_state = query_state.transmute::<&A>(&world);
1830        assert_eq!(new_query_state.iter(&world).len(), 1);
1831        let a = new_query_state.single(&world).unwrap();
1832
1833        assert_eq!(a.0, 1);
1834    }
1835
1836    #[test]
1837    fn cannot_get_data_not_in_original_query() {
1838        let mut world = World::new();
1839        world.spawn((A(0), B(0)));
1840        world.spawn((A(1), B(0), C(0)));
1841
1842        let query_state = world.query_filtered::<(&A, &B), Without<C>>();
1843        let mut new_query_state = query_state.transmute::<&A>(&world);
1844        // even though we change the query to not have Without<C>, we do not get the component with C.
1845        let a = new_query_state.single(&world).unwrap();
1846
1847        assert_eq!(a.0, 0);
1848    }
1849
1850    #[test]
1851    fn can_transmute_empty_tuple() {
1852        let mut world = World::new();
1853        world.register_component::<A>();
1854        let entity = world.spawn(A(10)).id();
1855
1856        let q = world.query::<()>();
1857        let mut q = q.transmute::<Entity>(&world);
1858        assert_eq!(q.single(&world).unwrap(), entity);
1859    }
1860
1861    #[test]
1862    fn can_transmute_immut_fetch() {
1863        let mut world = World::new();
1864        world.spawn(A(10));
1865
1866        let q = world.query::<&A>();
1867        let mut new_q = q.transmute::<Ref<A>>(&world);
1868        assert!(new_q.single(&world).unwrap().is_added());
1869
1870        let q = world.query::<Ref<A>>();
1871        let _ = q.transmute::<&A>(&world);
1872    }
1873
1874    #[test]
1875    fn can_transmute_mut_fetch() {
1876        let mut world = World::new();
1877        world.spawn(A(0));
1878
1879        let q = world.query::<&mut A>();
1880        let _ = q.transmute::<Ref<A>>(&world);
1881        let _ = q.transmute::<&A>(&world);
1882    }
1883
1884    #[test]
1885    fn can_transmute_entity_mut() {
1886        let mut world = World::new();
1887        world.spawn(A(0));
1888
1889        let q: QueryState<EntityMut<'_>> = world.query::<EntityMut>();
1890        let _ = q.transmute::<EntityRef>(&world);
1891    }
1892
1893    #[test]
1894    fn can_generalize_with_option() {
1895        let mut world = World::new();
1896        world.spawn((A(0), B(0)));
1897
1898        let query_state = world.query::<(Option<&A>, &B)>();
1899        let _ = query_state.transmute::<Option<&A>>(&world);
1900        let _ = query_state.transmute::<&B>(&world);
1901    }
1902
1903    #[test]
1904    #[should_panic]
1905    fn cannot_transmute_to_include_data_not_in_original_query() {
1906        let mut world = World::new();
1907        world.register_component::<A>();
1908        world.register_component::<B>();
1909        world.spawn(A(0));
1910
1911        let query_state = world.query::<&A>();
1912        let mut _new_query_state = query_state.transmute::<(&A, &B)>(&world);
1913    }
1914
1915    #[test]
1916    #[should_panic]
1917    fn cannot_transmute_immut_to_mut() {
1918        let mut world = World::new();
1919        world.spawn(A(0));
1920
1921        let query_state = world.query::<&A>();
1922        let mut _new_query_state = query_state.transmute::<&mut A>(&world);
1923    }
1924
1925    #[test]
1926    #[should_panic]
1927    fn cannot_transmute_option_to_immut() {
1928        let mut world = World::new();
1929        world.spawn(C(0));
1930
1931        let query_state = world.query::<Option<&A>>();
1932        let mut new_query_state = query_state.transmute::<&A>(&world);
1933        let x = new_query_state.single(&world).unwrap();
1934        assert_eq!(x.0, 1234);
1935    }
1936
1937    #[test]
1938    #[should_panic]
1939    fn cannot_transmute_entity_ref() {
1940        let mut world = World::new();
1941        world.register_component::<A>();
1942
1943        let q = world.query::<EntityRef>();
1944        let _ = q.transmute::<&A>(&world);
1945    }
1946
1947    #[test]
1948    fn can_transmute_filtered_entity() {
1949        let mut world = World::new();
1950        let entity = world.spawn((A(0), B(1))).id();
1951        let query = QueryState::<(Entity, &A, &B)>::new(&mut world)
1952            .transmute::<(Entity, FilteredEntityRef)>(&world);
1953
1954        let mut query = query;
1955        // Our result is completely untyped
1956        let (_entity, entity_ref) = query.single(&world).unwrap();
1957
1958        assert_eq!(entity, entity_ref.id());
1959        assert_eq!(0, entity_ref.get::<A>().unwrap().0);
1960        assert_eq!(1, entity_ref.get::<B>().unwrap().0);
1961    }
1962
1963    #[test]
1964    fn can_transmute_added() {
1965        let mut world = World::new();
1966        let entity_a = world.spawn(A(0)).id();
1967
1968        let mut query = QueryState::<(Entity, &A, Has<B>)>::new(&mut world)
1969            .transmute_filtered::<(Entity, Has<B>), Added<A>>(&world);
1970
1971        assert_eq!((entity_a, false), query.single(&world).unwrap());
1972
1973        world.clear_trackers();
1974
1975        let entity_b = world.spawn((A(0), B(0))).id();
1976        assert_eq!((entity_b, true), query.single(&world).unwrap());
1977
1978        world.clear_trackers();
1979
1980        assert!(query.single(&world).is_err());
1981    }
1982
1983    #[test]
1984    fn can_transmute_changed() {
1985        let mut world = World::new();
1986        let entity_a = world.spawn(A(0)).id();
1987
1988        let mut detection_query = QueryState::<(Entity, &A)>::new(&mut world)
1989            .transmute_filtered::<Entity, Changed<A>>(&world);
1990
1991        let mut change_query = QueryState::<&mut A>::new(&mut world);
1992        assert_eq!(entity_a, detection_query.single(&world).unwrap());
1993
1994        world.clear_trackers();
1995
1996        assert!(detection_query.single(&world).is_err());
1997
1998        change_query.single_mut(&mut world).unwrap().0 = 1;
1999
2000        assert_eq!(entity_a, detection_query.single(&world).unwrap());
2001    }
2002
2003    #[test]
2004    #[should_panic]
2005    fn cannot_transmute_changed_without_access() {
2006        let mut world = World::new();
2007        world.register_component::<A>();
2008        world.register_component::<B>();
2009        let query = QueryState::<&A>::new(&mut world);
2010        let _new_query = query.transmute_filtered::<Entity, Changed<B>>(&world);
2011    }
2012
2013    #[test]
2014    #[should_panic]
2015    fn cannot_transmute_mutable_after_readonly() {
2016        let mut world = World::new();
2017        // Calling this method would mean we had aliasing queries.
2018        fn bad(_: Query<&mut A>, _: Query<&A>) {}
2019        world
2020            .run_system_once(|query: Query<&mut A>| {
2021                let mut readonly = query.as_readonly();
2022                let mut lens: QueryLens<&mut A> = readonly.transmute_lens();
2023                bad(lens.query(), query.as_readonly());
2024            })
2025            .unwrap();
2026    }
2027
2028    // Regression test for #14629
2029    #[test]
2030    #[should_panic]
2031    fn transmute_with_different_world() {
2032        let mut world = World::new();
2033        world.spawn((A(1), B(2)));
2034
2035        let mut world2 = World::new();
2036        world2.register_component::<B>();
2037
2038        world.query::<(&A, &B)>().transmute::<&B>(&world2);
2039    }
2040
2041    /// Regression test for issue #14528
2042    #[test]
2043    fn transmute_from_sparse_to_dense() {
2044        #[derive(Component)]
2045        struct Dense;
2046
2047        #[derive(Component)]
2048        #[component(storage = "SparseSet")]
2049        struct Sparse;
2050
2051        let mut world = World::new();
2052
2053        world.spawn(Dense);
2054        world.spawn((Dense, Sparse));
2055
2056        let mut query = world
2057            .query_filtered::<&Dense, With<Sparse>>()
2058            .transmute::<&Dense>(&world);
2059
2060        let matched = query.iter(&world).count();
2061        assert_eq!(matched, 1);
2062    }
2063    #[test]
2064    fn transmute_from_dense_to_sparse() {
2065        #[derive(Component)]
2066        struct Dense;
2067
2068        #[derive(Component)]
2069        #[component(storage = "SparseSet")]
2070        struct Sparse;
2071
2072        let mut world = World::new();
2073
2074        world.spawn(Dense);
2075        world.spawn((Dense, Sparse));
2076
2077        let mut query = world
2078            .query::<&Dense>()
2079            .transmute_filtered::<&Dense, With<Sparse>>(&world);
2080
2081        // Note: `transmute_filtered` is supposed to keep the same matched tables/archetypes,
2082        // so it doesn't actually filter out those entities without `Sparse` and the iteration
2083        // remains dense.
2084        let matched = query.iter(&world).count();
2085        assert_eq!(matched, 2);
2086    }
2087
2088    #[test]
2089    fn join() {
2090        let mut world = World::new();
2091        world.spawn(A(0));
2092        world.spawn(B(1));
2093        let entity_ab = world.spawn((A(2), B(3))).id();
2094        world.spawn((A(4), B(5), C(6)));
2095
2096        let query_1 = QueryState::<&A, Without<C>>::new(&mut world);
2097        let query_2 = QueryState::<&B, Without<C>>::new(&mut world);
2098        let mut new_query: QueryState<Entity, ()> = query_1.join_filtered(&world, &query_2);
2099
2100        assert_eq!(new_query.single(&world).unwrap(), entity_ab);
2101    }
2102
2103    #[test]
2104    fn join_with_get() {
2105        let mut world = World::new();
2106        world.spawn(A(0));
2107        world.spawn(B(1));
2108        let entity_ab = world.spawn((A(2), B(3))).id();
2109        let entity_abc = world.spawn((A(4), B(5), C(6))).id();
2110
2111        let query_1 = QueryState::<&A>::new(&mut world);
2112        let query_2 = QueryState::<&B, Without<C>>::new(&mut world);
2113        let mut new_query: QueryState<Entity, ()> = query_1.join_filtered(&world, &query_2);
2114
2115        assert!(new_query.get(&world, entity_ab).is_ok());
2116        // should not be able to get entity with c.
2117        assert!(new_query.get(&world, entity_abc).is_err());
2118    }
2119
2120    #[test]
2121    #[should_panic]
2122    fn cannot_join_wrong_fetch() {
2123        let mut world = World::new();
2124        world.register_component::<C>();
2125        let query_1 = QueryState::<&A>::new(&mut world);
2126        let query_2 = QueryState::<&B>::new(&mut world);
2127        let _query: QueryState<&C> = query_1.join(&world, &query_2);
2128    }
2129
2130    #[test]
2131    #[should_panic]
2132    fn cannot_join_wrong_filter() {
2133        let mut world = World::new();
2134        let query_1 = QueryState::<&A, Without<C>>::new(&mut world);
2135        let query_2 = QueryState::<&B, Without<C>>::new(&mut world);
2136        let _: QueryState<Entity, Changed<C>> = query_1.join_filtered(&world, &query_2);
2137    }
2138
2139    #[test]
2140    #[should_panic]
2141    fn cannot_join_mutable_after_readonly() {
2142        let mut world = World::new();
2143        // Calling this method would mean we had aliasing queries.
2144        fn bad(_: Query<(&mut A, &mut B)>, _: Query<&A>) {}
2145        world
2146            .run_system_once(|query_a: Query<&mut A>, mut query_b: Query<&mut B>| {
2147                let mut readonly = query_a.as_readonly();
2148                let mut lens: QueryLens<(&mut A, &mut B)> = readonly.join(&mut query_b);
2149                bad(lens.query(), query_a.as_readonly());
2150            })
2151            .unwrap();
2152    }
2153
2154    #[test]
2155    fn join_to_filtered_entity_mut() {
2156        let mut world = World::new();
2157        world.spawn((A(2), B(3)));
2158
2159        let query_1 = QueryState::<&mut A>::new(&mut world);
2160        let query_2 = QueryState::<&mut B>::new(&mut world);
2161        let mut new_query: QueryState<(Entity, FilteredEntityMut)> = query_1.join(&world, &query_2);
2162
2163        let (_entity, mut entity_mut) = new_query.single_mut(&mut world).unwrap();
2164        assert!(entity_mut.get_mut::<A>().is_some());
2165        assert!(entity_mut.get_mut::<B>().is_some());
2166    }
2167
2168    #[test]
2169    fn query_respects_default_filters() {
2170        let mut world = World::new();
2171        world.spawn((A(0), B(0)));
2172        world.spawn((B(0), C(0)));
2173        world.spawn(C(0));
2174
2175        world.register_disabling_component::<C>();
2176
2177        // Without<C> only matches the first entity
2178        let mut query = QueryState::<()>::new(&mut world);
2179        assert_eq!(1, query.iter(&world).count());
2180
2181        // With<C> matches the last two entities
2182        let mut query = QueryState::<(), With<C>>::new(&mut world);
2183        assert_eq!(2, query.iter(&world).count());
2184
2185        // Has should bypass the filter entirely
2186        let mut query = QueryState::<Has<C>>::new(&mut world);
2187        assert_eq!(3, query.iter(&world).count());
2188
2189        // Allow should bypass the filter entirely
2190        let mut query = QueryState::<(), Allow<C>>::new(&mut world);
2191        assert_eq!(3, query.iter(&world).count());
2192
2193        // Other filters should still be respected
2194        let mut query = QueryState::<Has<C>, Without<B>>::new(&mut world);
2195        assert_eq!(1, query.iter(&world).count());
2196    }
2197
2198    #[derive(Component)]
2199    struct Table;
2200
2201    #[derive(Component)]
2202    #[component(storage = "SparseSet")]
2203    struct Sparse;
2204
2205    #[test]
2206    fn query_default_filters_updates_is_dense() {
2207        let mut world = World::new();
2208        world.spawn((Table, Sparse));
2209        world.spawn(Table);
2210        world.spawn(Sparse);
2211
2212        let mut query = QueryState::<()>::new(&mut world);
2213        // There are no sparse components involved thus the query is dense
2214        assert!(query.is_dense);
2215        assert_eq!(3, query.query(&world).count());
2216
2217        world.register_disabling_component::<Sparse>();
2218
2219        let mut query = QueryState::<()>::new(&mut world);
2220        // The query doesn't ask for sparse components, but the default filters adds
2221        // a sparse components thus it is NOT dense
2222        assert!(!query.is_dense);
2223        assert_eq!(1, query.query(&world).count());
2224
2225        let mut df = DefaultQueryFilters::from_world(&mut world);
2226        df.register_disabling_component(world.register_component::<Table>());
2227        world.insert_resource(df);
2228
2229        let mut query = QueryState::<()>::new(&mut world);
2230        // If the filter is instead a table components, the query can still be dense
2231        assert!(query.is_dense);
2232        assert_eq!(1, query.query(&world).count());
2233
2234        let mut query = QueryState::<&Sparse>::new(&mut world);
2235        // But only if the original query was dense
2236        assert!(!query.is_dense);
2237        assert_eq!(1, query.query(&world).count());
2238    }
2239}