class InterMine::PathQuery::ConstraintFactory

Public Class Methods

new(query) click to toggle source
    # File lib/intermine/query.rb
946 def initialize(query)
947     @classes = [
948         SingleValueConstraint, 
949         SubClassConstraint, 
950         LookupConstraint, MultiValueConstraint, RangeConstraint,
951         UnaryConstraint, LoopConstraint, ListConstraint]
952 
953     @query = query
954 end

Public Instance Methods

make_constraint(args) click to toggle source
     # File lib/intermine/query.rb
 956 def make_constraint(args)
 957     case args.length 
 958     when 2
 959         parameters = {:path => args[0], :op => args[1]}
 960     when 3
 961         if args[2].is_a?(Array)
 962             parameters = {:path => args[0], :op => args[1], :values => args[2]}
 963         elsif LoopConstraint.valid_ops.include?(args[1])
 964             parameters = {:path => args[0], :op => args[1], :loopPath => args[2]}
 965         else
 966             parameters = {:path => args[0], :op => args[1], :value => args[2]}
 967         end
 968     when 4
 969         parameters = {:path => args[0], :op => args[1], :value => args[2], :extra_value => args[3]}
 970     else
 971         parameters = args.first
 972     end
 973 
 974     attr_keys = parameters.keys
 975     suitable_classes = @classes.select { |cls| 
 976         attr_keys.reduce(true) do |suitable, k|
 977             suitable && cls.method_defined?(k) && (k.to_s != "op" or cls.valid_ops.include?(parameters[k]))
 978         end
 979     }
 980     if suitable_classes.size > 1
 981         raise ArgumentError, "More than one class found for #{parameters.inspect}"
 982     elsif suitable_classes.size < 1
 983         raise ArgumentError, "No suitable classes found for #{parameters.inspect}"
 984     end
 985 
 986     cls = suitable_classes.first
 987     con = cls.new
 988     parameters.each_pair { |key, value|
 989         if key == :path || key == :loopPath
 990             value = @query.path(value)
 991         end
 992         if key == :sub_class
 993             value = InterMine::Metadata::Path.new(value, @query.model)
 994         end
 995         con.send(key.to_s + '=', value)
 996     }
 997     con.validate
 998     if con.respond_to?(:code)
 999         code = con.code
1000         if code.nil?
1001             con.code = @query.next_code
1002         else
1003             code = code.to_s
1004             unless Query.is_valid_code(code)
1005                 raise ArgumentError, "Coded must be between A and Z, got: #{code}"
1006             end
1007             if @query.used_codes.include?(code)
1008                 con.code = @query.next_code
1009             end
1010         end
1011     end
1012 
1013     return con
1014 end