Skip to content

Commit

Permalink
Fixed: Matching of wildcard queries
Browse files Browse the repository at this point in the history
Fixed: Matching of NO queries
  • Loading branch information
richardbiely committed May 24, 2024
1 parent 0ab85c4 commit 50f627e
Show file tree
Hide file tree
Showing 7 changed files with 590 additions and 284 deletions.
7 changes: 7 additions & 0 deletions include/gaia/core/utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -810,6 +810,13 @@ namespace gaia {
}
};

template <typename T>
struct is_smaller_or_equal {
constexpr bool operator()(const T& lhs, const T& rhs) const {
return lhs <= rhs;
}
};

template <typename T>
struct is_greater {
constexpr bool operator()(const T& lhs, const T& rhs) const {
Expand Down
50 changes: 26 additions & 24 deletions include/gaia/ecs/id.h
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,7 @@ namespace gaia {
struct All_ {};
struct ChildOf_ {};
struct Is_ {};
struct Traversable_ {};
// struct System2_;
struct DependsOn_ {};

Expand All @@ -484,36 +485,37 @@ namespace gaia {
inline Entity GAIA_ID(EntityDesc) = Entity(1, 0, false, false, EntityKind::EK_Gen);
inline Entity GAIA_ID(Component) = Entity(2, 0, false, false, EntityKind::EK_Gen);
// Cleanup rules
inline Entity OnDelete = Entity(3, false, false, false, EntityKind::EK_Gen);
inline Entity OnDeleteTarget = Entity(4, false, false, false, EntityKind::EK_Gen);
inline Entity Remove = Entity(5, false, false, false, EntityKind::EK_Gen);
inline Entity Delete = Entity(6, false, false, false, EntityKind::EK_Gen);
inline Entity Error = Entity(7, false, false, false, EntityKind::EK_Gen);
inline Entity OnDelete = Entity(3, 0, false, false, EntityKind::EK_Gen);
inline Entity OnDeleteTarget = Entity(4, 0, false, false, EntityKind::EK_Gen);
inline Entity Remove = Entity(5, 0, false, false, EntityKind::EK_Gen);
inline Entity Delete = Entity(6, 0, false, false, EntityKind::EK_Gen);
inline Entity Error = Entity(7, 0, false, false, EntityKind::EK_Gen);
// Entity dependencies
inline Entity Requires = Entity(8, false, false, false, EntityKind::EK_Gen);
inline Entity CantCombine = Entity(9, false, false, false, EntityKind::EK_Gen);
inline Entity Exclusive = Entity(10, false, false, false, EntityKind::EK_Gen);
// Graph restrictions
inline Entity Acyclic = Entity(11, false, false, false, EntityKind::EK_Gen);
inline Entity Requires = Entity(8, 0, false, false, EntityKind::EK_Gen);
inline Entity CantCombine = Entity(9, 0, false, false, EntityKind::EK_Gen);
inline Entity Exclusive = Entity(10, 0, false, false, EntityKind::EK_Gen);
// Graph properties
inline Entity Acyclic = Entity(11, 0, false, false, EntityKind::EK_Gen);
inline Entity Traversable = Entity(12, 0, false, false, EntityKind::EK_Gen);
// Wildcard query entity
inline Entity All = Entity(12, 0, false, false, EntityKind::EK_Gen);
inline Entity All = Entity(13, 0, false, false, EntityKind::EK_Gen);
// Entity representing a physical hierarchy.
// When the relationship target is deleted all children are deleted as well.
inline Entity ChildOf = Entity(13, 0, false, false, EntityKind::EK_Gen);
// Alias for a base entity
inline Entity Is = Entity(14, 0, false, false, EntityKind::EK_Gen);
inline Entity ChildOf = Entity(14, 0, false, false, EntityKind::EK_Gen);
// Alias for a base entity/inheritance
inline Entity Is = Entity(15, 0, false, false, EntityKind::EK_Gen);
// Systems
inline Entity System2 = Entity(15, 0, false, false, EntityKind::EK_Gen);
inline Entity DependsOn = Entity(16, 0, false, false, EntityKind::EK_Gen);
inline Entity System2 = Entity(16, 0, false, false, EntityKind::EK_Gen);
inline Entity DependsOn = Entity(17, 0, false, false, EntityKind::EK_Gen);
// Query variables
inline Entity Var0 = Entity(17, 0, false, false, EntityKind::EK_Gen);
inline Entity Var1 = Entity(18, 0, false, false, EntityKind::EK_Gen);
inline Entity Var2 = Entity(19, 0, false, false, EntityKind::EK_Gen);
inline Entity Var3 = Entity(20, 0, false, false, EntityKind::EK_Gen);
inline Entity Var4 = Entity(21, 0, false, false, EntityKind::EK_Gen);
inline Entity Var5 = Entity(22, 0, false, false, EntityKind::EK_Gen);
inline Entity Var6 = Entity(23, 0, false, false, EntityKind::EK_Gen);
inline Entity Var7 = Entity(24, 0, false, false, EntityKind::EK_Gen);
inline Entity Var0 = Entity(18, 0, false, false, EntityKind::EK_Gen);
inline Entity Var1 = Entity(19, 0, false, false, EntityKind::EK_Gen);
inline Entity Var2 = Entity(20, 0, false, false, EntityKind::EK_Gen);
inline Entity Var3 = Entity(21, 0, false, false, EntityKind::EK_Gen);
inline Entity Var4 = Entity(22, 0, false, false, EntityKind::EK_Gen);
inline Entity Var5 = Entity(23, 0, false, false, EntityKind::EK_Gen);
inline Entity Var6 = Entity(24, 0, false, false, EntityKind::EK_Gen);
inline Entity Var7 = Entity(25, 0, false, false, EntityKind::EK_Gen);

// Always has to match the last internal entity
inline Entity GAIA_ID(LastCoreComponent) = Var7;
Expand Down
19 changes: 16 additions & 3 deletions include/gaia/ecs/query_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -204,13 +204,26 @@ namespace gaia {
};
};

//! Smaller ops first. Smaller ids second.
//! Functor for sorting terms in a query before compilation
struct query_sort_cond {
constexpr bool operator()(const QueryTerm& lhs, const QueryTerm& rhs) const {
// Smaller ops first.
if (lhs.op != rhs.op)
return lhs.op < rhs.op;

return lhs.id < rhs.id;
// Smaller ids second.
if (lhs.id != rhs.id)
return lhs.id < rhs.id;

// Sources go last. Note, sources are never a pair.
// We want to do it this way because it would be expensive to build cache for
// the entire tree. Rather, we only cache fixed parts of the query without
// variables.
// TOOD: In theory, there might be a better way to sort sources.
// E.g. depending on the number of archetypes we'd have to traverse
// it might be benefitial to do a different ordering which is impossible
// to do at this point.
return lhs.src.id() < rhs.src.id();
}
};

Expand Down Expand Up @@ -245,7 +258,7 @@ namespace gaia {
data.remapping[i] = idxBeforeRemapping;
}

auto& terms = data.terms;
const auto& terms = data.terms;
if (!terms.empty()) {
uint32_t i = 0;
while (i < terms.size() && terms[i].op == QueryOp::All)
Expand Down
Loading

0 comments on commit 50f627e

Please sign in to comment.