lib/sequel/plugins/bitemporal.rb in sequel_bitemporal-0.2.0 vs lib/sequel/plugins/bitemporal.rb in sequel_bitemporal-0.3.0
- old
+ new
@@ -29,23 +29,27 @@
version = opts[:version_class]
raise Error, "please specify version class to use for bitemporal plugin" unless version
required = [:master_id, :valid_from, :valid_to, :created_at, :expired_at]
missing = required - version.columns
raise Error, "bitemporal plugin requires the following missing column#{"s" if missing.size>1} on version class: #{missing.join(", ")}" unless missing.empty?
+ master.instance_eval do
+ @version_class = version
+ @current_version_name = "#{name ? underscore(demodulize(name)) : table_name}_current_version".to_sym
+ end
master.one_to_many :versions, class: version, key: :master_id
- master.one_to_one :current_version, class: version, key: :master_id, :graph_block=>(proc do |j, lj, js|
+ master.one_to_one master.current_version_name, class: version, key: :master_id, :graph_block=>(proc do |j, lj, js|
t = ::Sequel::Plugins::Bitemporal.point_in_time
n = ::Sequel::Plugins::Bitemporal.now
e = :expired_at.qualify(j)
(:created_at.qualify(j) <= t) & ({e=>nil} | (e > t)) & (:valid_from.qualify(j) <= n) & (:valid_to.qualify(j) > n)
end) do |ds|
t = ::Sequel::Plugins::Bitemporal.point_in_time
n = ::Sequel::Plugins::Bitemporal.now
ds.where{(created_at <= t) & ({expired_at=>nil} | (expired_at > t)) & (valid_from <= n) & (valid_to > n)}
end
master.def_dataset_method :with_current_version do
- eager_graph(:current_version).where({current_version__id: nil}.sql_negate)
+ eager_graph(model.current_version_name).where({:id.qualify(model.current_version_name) => nil}.sql_negate)
end
master.one_to_many :current_or_future_versions, class: version, key: :master_id, :graph_block=>(proc do |j, lj, js|
t = ::Sequel::Plugins::Bitemporal.point_in_time
n = ::Sequel::Plugins::Bitemporal.now
e = :expired_at.qualify(j)
@@ -71,13 +75,10 @@
end
def destroy
master.destroy_version self
end
end
- master.instance_eval do
- @version_class = version
- end
unless opts[:delegate]==false
(version.columns-required-[:id]).each do |column|
master.class_eval <<-EOS
def #{column}
pending_or_current_version.#{column} if pending_or_current_version
@@ -85,11 +86,11 @@
EOS
end
end
end
module ClassMethods
- attr_reader :version_class
+ attr_reader :version_class, :current_version_name
end
module DatasetMethods
end
module InstanceMethods
attr_reader :pending_version
@@ -102,9 +103,13 @@
def validate
super
pending_version.errors.each do |key, key_errors|
key_errors.each{|error| errors.add key, error}
end if pending_version && !pending_version.valid?
+ end
+
+ def current_version(*args)
+ send(self.class.current_version_name, *args)
end
def pending_or_current_version
pending_version || current_version
end