Class: InterMine::PathQuery::ConstraintFactory
- Inherits:
-
Object
- Object
- InterMine::PathQuery::ConstraintFactory
- Defined in:
- lib/intermine/query.rb
Direct Known Subclasses
Instance Method Summary collapse
-
#initialize(query) ⇒ ConstraintFactory
constructor
A new instance of ConstraintFactory.
- #make_constraint(args) ⇒ Object
Constructor Details
#initialize(query) ⇒ ConstraintFactory
Returns a new instance of ConstraintFactory.
849 850 851 852 853 854 855 856 857 |
# File 'lib/intermine/query.rb', line 849 def initialize(query) @classes = [ SingleValueConstraint, SubClassConstraint, LookupConstraint, MultiValueConstraint, UnaryConstraint, LoopConstraint, ListConstraint] @query = query end |
Instance Method Details
#make_constraint(args) ⇒ Object
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 |
# File 'lib/intermine/query.rb', line 859 def make_constraint(args) case args.length when 2 parameters = {:path => args[0], :op => args[1]} when 3 if args[2].is_a?(Array) parameters = {:path => args[0], :op => args[1], :values => args[2]} elsif LoopConstraint.valid_ops.include?(args[1]) parameters = {:path => args[0], :op => args[1], :loopPath => args[2]} else parameters = {:path => args[0], :op => args[1], :value => args[2]} end when 4 parameters = {:path => args[0], :op => args[1], :value => args[2], :extra_value => args[3]} else parameters = args.first end attr_keys = parameters.keys suitable_classes = @classes.select { |cls| is_suitable = true attr_keys.each { |key| is_suitable = is_suitable && (cls.method_defined?(key)) if key.to_s == "op" is_suitable = is_suitable && cls.valid_ops.include?(parameters[key]) end } is_suitable } if suitable_classes.size > 1 raise ArgumentError, "More than one class found for #{parameters.inspect}" elsif suitable_classes.size < 1 raise ArgumentError, "No suitable classes found for #{parameters.inspect}" end cls = suitable_classes.first con = cls.new parameters.each_pair { |key, value| if key == :path || key == :loopPath value = @query.path(value) end if key == :sub_class value = InterMine::Metadata::Path.new(value, @query.model) end con.send(key.to_s + '=', value) } con.validate if con.respond_to?(:code) code = con.code if code.nil? con.code = @query.next_code else code = code.to_s unless Query.is_valid_code(code) raise ArgumentError, "Coded must be between A and Z, got: #{code}" end if @query.used_codes.include?(code) con.code = @query.next_code end end end return con end |