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.
827 828 829 830 831 832 833 834 835 |
# File 'lib/intermine/query.rb', line 827 def initialize(query) @classes = [ SingleValueConstraint, SubClassConstraint, LookupConstraint, MultiValueConstraint, UnaryConstraint, LoopConstraint, ListConstraint] @query = query end |
Instance Method Details
#make_constraint(args) ⇒ Object
837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 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 |
# File 'lib/intermine/query.rb', line 837 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 |