lib/bmg/sequel.rb in bmg-0.9.1 vs lib/bmg/sequel.rb in bmg-0.10.0
- old
+ new
@@ -1,11 +1,62 @@
+require 'bmg/sql'
require 'sequel'
require 'predicate/sequel'
module Bmg
- def sequel(dataset, type = Type::ANY)
- Sequel::Relation.new(type, dataset).spied(main_spy)
+ module Sequel
+
+ def sequel(*args, &bl)
+ source, sequel_db, type = sequel_params(*args, &bl)
+ builder = Sql::Builder.new
+ sexpr = builder.select_all(type.to_attrlist, source)
+ Sequel::Relation.new(type, builder, sexpr, sequel_db).spied(Bmg.main_spy)
+ end
+ module_function :sequel
+
+ def sequel_params(source, sequel_db = nil, type = nil)
+ sequel_db, type = nil, sequel_db if sequel_db.nil? or sequel_db.is_a?(Type)
+ sequel_db = source.db if sequel_db.nil? and source.is_a?(::Sequel::Dataset)
+ raise ArgumentError, "A Sequel::Database object is required" if sequel_db.nil?
+ raise ArgumentError, "Type's attrlist must be known (#{type})" if type && !type.knows_attrlist?
+ type = infer_type!(sequel_db, source) if type.nil?
+ [source, sequel_db, type]
+ end
+ module_function :sequel_params
+
+ def infer_type!(sequel_db, source)
+ raise "Sequel::Relation requires a type for `#{source}`" unless source.is_a?(Symbol)
+ TypeInference.new(sequel_db).call(source)
+ end
+ module_function :infer_type!
+
end
+
+ # Builds a Relation that uses Sequel for managing real data
+ # accesses.
+ #
+ # Supported signatures:
+ #
+ # # Table name, providing the Sequel's Database object
+ # Bmg.sequel(:suppliers, DB)
+ #
+ # # Sequel dataset object, embedding the Database object
+ # # `from_self` will be used at compilation time, you don't
+ # # need to call it yourself.
+ # Bmg.sequel(DB[:suppliers])
+ #
+ # # Similar, but with with a pure SQL query
+ # Bmg.sequel(DB[%Q{SELECT ... FROM ...}])
+ #
+ # # All signatures above with an explicit type object, e.g.:
+ # Bmg.sequel(:suppliers, DB, Type::ANY)
+ # Bmg.sequel(DB[:suppliers], Type::ANY)
+ #
+ def sequel(source, sequel_db = nil, type = nil)
+ Sequel.sequel(source, sequel_db, type)
+ end
module_function :sequel
end
+require_relative 'sequel/translator'
+require_relative 'sequel/type_inference'
require_relative 'sequel/relation'