2 Commits

Author SHA1 Message Date
BlackMATov
9e74ddf9c3 mark INTERNAL trait as unique and explicit 2025-08-18 19:45:46 +07:00
BlackMATov
26de93405e find smallest minor chunks for wildcard execute 2025-08-18 19:43:30 +07:00

View File

@@ -1383,33 +1383,33 @@ function __new_chunk(chunk_parent, chunk_fragment)
end end
do do
local major_fragment = chunk_fragment local major = chunk_fragment
local major_chunks = __major_chunks[major_fragment] local major_chunks = __major_chunks[major]
if not major_chunks then if not major_chunks then
major_chunks = __assoc_list_new(4) major_chunks = __assoc_list_new(4)
__major_chunks[major_fragment] = major_chunks __major_chunks[major] = major_chunks
end end
__assoc_list_insert(major_chunks, chunk) __assoc_list_insert(major_chunks, chunk)
end end
for i = 1, chunk_fragment_count do for i = 1, chunk_fragment_count do
local minor_fragment = chunk_fragment_list[i] local minor = chunk_fragment_list[i]
local minor_chunks = __minor_chunks[minor_fragment] local minor_chunks = __minor_chunks[minor]
if not minor_chunks then if not minor_chunks then
minor_chunks = __assoc_list_new(4) minor_chunks = __assoc_list_new(4)
__minor_chunks[minor_fragment] = minor_chunks __minor_chunks[minor] = minor_chunks
end end
__assoc_list_insert(minor_chunks, chunk) __assoc_list_insert(minor_chunks, chunk)
end end
if __is_pair(chunk_fragment) then if __is_pair(chunk_fragment) then
local major_fragment = chunk_fragment local major = chunk_fragment
local major_primary_index, major_secondary_index = local major_primary_index, major_secondary_index =
__evolved_unpack(major_fragment) __evolved_unpack(major)
do do
local major_wildcard = __WILDCARD_PAIR local major_wildcard = __WILDCARD_PAIR
@@ -1461,9 +1461,9 @@ function __new_chunk(chunk_parent, chunk_fragment)
end end
for i = 1, chunk_pair_count do for i = 1, chunk_pair_count do
local minor_fragment = chunk_pair_list[i] local minor = chunk_pair_list[i]
local minor_primary_index, minor_secondary_index = local minor_primary_index, minor_secondary_index =
__evolved_unpack(minor_fragment) __evolved_unpack(minor)
do do
local minor_wildcard = __secondary_wildcard(minor_primary_index) local minor_wildcard = __secondary_wildcard(minor_primary_index)
@@ -2169,6 +2169,10 @@ end
---@return boolean ---@return boolean
---@nodiscard ---@nodiscard
local function __chunk_has_all_fragment_list(chunk, fragment_list, fragment_count) local function __chunk_has_all_fragment_list(chunk, fragment_list, fragment_count)
if fragment_count == 0 then
return true
end
local fs = chunk.__fragment_set local fs = chunk.__fragment_set
local has_f = __chunk_has_fragment local has_f = __chunk_has_fragment
@@ -2250,6 +2254,10 @@ end
---@return boolean ---@return boolean
---@nodiscard ---@nodiscard
local function __chunk_has_any_fragment_list(chunk, fragment_list, fragment_count) local function __chunk_has_any_fragment_list(chunk, fragment_list, fragment_count)
if fragment_count == 0 then
return false
end
local fs = chunk.__fragment_set local fs = chunk.__fragment_set
local has_f = __chunk_has_fragment local has_f = __chunk_has_fragment
@@ -3008,20 +3016,20 @@ local function __purge_chunk(chunk)
end end
do do
local major_fragment = chunk_fragment local major = chunk_fragment
local major_chunks = __major_chunks[major_fragment] local major_chunks = __major_chunks[major]
if major_chunks and __assoc_list_remove(major_chunks, chunk) == 0 then if major_chunks and __assoc_list_remove(major_chunks, chunk) == 0 then
__major_chunks[major_fragment] = nil __major_chunks[major] = nil
end end
end end
for i = 1, chunk_fragment_count do for i = 1, chunk_fragment_count do
local minor_fragment = chunk_fragment_list[i] local minor = chunk_fragment_list[i]
local minor_chunks = __minor_chunks[minor_fragment] local minor_chunks = __minor_chunks[minor]
if minor_chunks and __assoc_list_remove(minor_chunks, chunk) == 0 then if minor_chunks and __assoc_list_remove(minor_chunks, chunk) == 0 then
__minor_chunks[minor_fragment] = nil __minor_chunks[minor] = nil
end end
end end
@@ -5900,13 +5908,30 @@ function __evolved_execute(query)
local query_exclude_count = query_excludes and query_excludes.__item_count or 0 --[[@as integer]] local query_exclude_count = query_excludes and query_excludes.__item_count or 0 --[[@as integer]]
if query_include_count > 0 then if query_include_count > 0 then
local query_major_fragment = query_include_list[query_include_count] local query_major = query_include_list[query_include_count]
if __is_wildcard(query_major_fragment) then if __is_wildcard(query_major) then
local minor_chunks = __minor_chunks[query_major_fragment] local minor_chunks = __minor_chunks[query_major]
local minor_chunk_list = minor_chunks and minor_chunks.__item_list --[=[@as evolved.chunk[]]=] local minor_chunk_list = minor_chunks and minor_chunks.__item_list --[=[@as evolved.chunk[]]=]
local minor_chunk_count = minor_chunks and minor_chunks.__item_count or 0 --[[@as integer]] local minor_chunk_count = minor_chunks and minor_chunks.__item_count or 0 --[[@as integer]]
for query_include_index = 1, query_include_count - 1 do
local query_minor = query_include_list[query_include_index]
local query_chunks = __minor_chunks[query_minor]
local query_chunk_list = query_chunks and query_chunks.__item_list --[=[@as evolved.chunk[]]=]
local query_chunk_count = query_chunks and query_chunks.__item_count or 0 --[[@as integer]]
if query_chunk_count < minor_chunk_count then
minor_chunks, minor_chunk_list, minor_chunk_count =
query_chunks, query_chunk_list, query_chunk_count
if query_chunk_count == 0 then
break
end
end
end
for minor_chunk_index = 1, minor_chunk_count do for minor_chunk_index = 1, minor_chunk_count do
local minor_chunk = minor_chunk_list[minor_chunk_index] local minor_chunk = minor_chunk_list[minor_chunk_index]
@@ -5916,9 +5941,9 @@ function __evolved_execute(query)
is_minor_chunk_matched = false is_minor_chunk_matched = false
end end
if is_minor_chunk_matched and query_include_count > 1 then if is_minor_chunk_matched then
is_minor_chunk_matched = __chunk_has_all_fragment_list( is_minor_chunk_matched = __chunk_has_all_fragment_list(
minor_chunk, query_include_list, query_include_count - 1) minor_chunk, query_include_list, query_include_count)
end end
if is_minor_chunk_matched and query_exclude_count > 0 then if is_minor_chunk_matched and query_exclude_count > 0 then
@@ -5960,7 +5985,7 @@ function __evolved_execute(query)
return __iterator_fns.__execute_minor_iterator, execute_state return __iterator_fns.__execute_minor_iterator, execute_state
else else
local major_chunks = __major_chunks[query_major_fragment] local major_chunks = __major_chunks[query_major]
local major_chunk_list = major_chunks and major_chunks.__item_list --[=[@as evolved.chunk[]]=] local major_chunk_list = major_chunks and major_chunks.__item_list --[=[@as evolved.chunk[]]=]
local major_chunk_count = major_chunks and major_chunks.__item_count or 0 --[[@as integer]] local major_chunk_count = major_chunks and major_chunks.__item_count or 0 --[[@as integer]]
@@ -7064,6 +7089,8 @@ __evolved_set(__UNIQUE, __TAG)
__evolved_set(__EXPLICIT, __TAG) __evolved_set(__EXPLICIT, __TAG)
__evolved_set(__INTERNAL, __TAG) __evolved_set(__INTERNAL, __TAG)
__evolved_set(__INTERNAL, __UNIQUE)
__evolved_set(__INTERNAL, __EXPLICIT)
__evolved_set(__PREFAB, __TAG) __evolved_set(__PREFAB, __TAG)
__evolved_set(__PREFAB, __UNIQUE) __evolved_set(__PREFAB, __UNIQUE)