lib/picky/backends/backend.rb in picky-4.0.0pre1 vs lib/picky/backends/backend.rb in picky-4.0.0pre2
- old
+ new
@@ -20,9 +20,46 @@
def extract_lambda_or thing, *args
thing && (thing.respond_to?(:call) && thing.call(*args) || thing)
end
+ # Returns the total score of the combinations.
+ #
+ # Default implementation. Override to speed up.
+ #
+ def weight combinations
+ combinations.score
+ end
+
+ # Returns the result ids for the allocation.
+ #
+ # Sorts the ids by size and & through them in the following order (sizes):
+ # 0. [100_000, 400, 30, 2]
+ # 1. [2, 30, 400, 100_000]
+ # 2. (100_000 & (400 & (30 & 2))) # => result
+ #
+ # Note: Uses a C-optimized intersection routine (in performant.c)
+ # for speed and memory efficiency.
+ #
+ # Note: In the memory based version we ignore the amount and
+ # offset hints.
+ # We cannot use the information to speed up the algorithm,
+ # unfortunately.
+ #
+ def ids combinations, _, _
+ # Get the ids for each combination.
+ #
+ id_arrays = combinations.inject([]) do |total, combination|
+ total << combination.ids
+ end
+
+ # Call the optimized C algorithm.
+ #
+ # Note: It orders the passed arrays by size.
+ #
+ Performant::Array.memory_efficient_intersect id_arrays
+ end
+
#
#
def to_s
self.class.name
end
\ No newline at end of file