module Axiom::Optimizer::Optimizable

Allow operations to be optimizable

Public Class Methods

included(descendant) click to toggle source

Hook called when module is included

@param [Module] descendant

the module or class including Optimizable

@return [self]

@api private

# File lib/axiom/optimizer/optimizable.rb, line 18
def self.included(descendant)
  descendant.extend ClassMethods
  self
end

Public Instance Methods

optimize() click to toggle source

Optimize the operation

@example

optimized = operation.optimize

@return [Optimizable]

the optimized operation

@api public

@todo simplify by setting a default Identity optimizer for all relations

# File lib/axiom/optimizer/optimizable.rb, line 34
def optimize
  optimizer = self.class.optimizer || Optimizer::Identity
  optimized = optimizer.call(self)
  if equal?(optimized)                   then self
  elsif optimized.respond_to?(:optimize) then optimized.optimize
  else
    optimized
  end
end