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