diff --git a/Manifest.txt b/Manifest.txt index 3b398674..4b24a42d 100644 --- a/Manifest.txt +++ b/Manifest.txt @@ -21,6 +21,7 @@ lib/dm-core/adapters/mysql_adapter.rb lib/dm-core/adapters/oracle_adapter.rb lib/dm-core/adapters/postgres_adapter.rb lib/dm-core/adapters/sqlite3_adapter.rb +lib/dm-core/adapters/sqlserver_adapter.rb lib/dm-core/adapters/yaml_adapter.rb lib/dm-core/associations/many_to_many.rb lib/dm-core/associations/many_to_one.rb @@ -28,6 +29,7 @@ lib/dm-core/associations/one_to_many.rb lib/dm-core/associations/one_to_one.rb lib/dm-core/associations/relationship.rb lib/dm-core/collection.rb +lib/dm-core/core_ext/enumerable.rb lib/dm-core/core_ext/kernel.rb lib/dm-core/core_ext/symbol.rb lib/dm-core/identity_map.rb @@ -89,6 +91,7 @@ spec/public/resource_spec.rb spec/public/sel_spec.rb spec/public/setup_spec.rb spec/public/shared/association_collection_shared_spec.rb +spec/public/shared/collection_finder_shared_spec.rb spec/public/shared/collection_shared_spec.rb spec/public/shared/finder_shared_spec.rb spec/public/shared/resource_shared_spec.rb @@ -101,6 +104,7 @@ spec/semipublic/adapters/mysql_adapter_spec.rb spec/semipublic/adapters/oracle_adapter_spec.rb spec/semipublic/adapters/postgres_adapter_spec.rb spec/semipublic/adapters/sqlite3_adapter_spec.rb +spec/semipublic/adapters/sqlserver_adapter_spec.rb spec/semipublic/adapters/yaml_adapter_spec.rb spec/semipublic/associations/many_to_one_spec.rb spec/semipublic/associations/relationship_spec.rb diff --git a/dm-core.gemspec b/dm-core.gemspec index a26e9207..012a7179 100644 --- a/dm-core.gemspec +++ b/dm-core.gemspec @@ -6,11 +6,11 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Dan Kubb"] - s.date = %q{2009-10-15} + s.date = %q{2009-10-27} s.description = %q{Faster, Better, Simpler.} s.email = ["dan.kubb@gmail.com"] s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"] - s.files = [".autotest", ".gitignore", "CONTRIBUTING", "FAQ", "History.txt", "MIT-LICENSE", "Manifest.txt", "QUICKLINKS", "README.txt", "Rakefile", "SPECS", "TODO", "deps.rip", "dm-core.gemspec", "lib/dm-core.rb", "lib/dm-core/adapters.rb", "lib/dm-core/adapters/abstract_adapter.rb", "lib/dm-core/adapters/data_objects_adapter.rb", "lib/dm-core/adapters/in_memory_adapter.rb", "lib/dm-core/adapters/mysql_adapter.rb", "lib/dm-core/adapters/oracle_adapter.rb", "lib/dm-core/adapters/postgres_adapter.rb", "lib/dm-core/adapters/sqlite3_adapter.rb", "lib/dm-core/adapters/yaml_adapter.rb", "lib/dm-core/associations/many_to_many.rb", "lib/dm-core/associations/many_to_one.rb", "lib/dm-core/associations/one_to_many.rb", "lib/dm-core/associations/one_to_one.rb", "lib/dm-core/associations/relationship.rb", "lib/dm-core/collection.rb", "lib/dm-core/core_ext/kernel.rb", "lib/dm-core/core_ext/symbol.rb", "lib/dm-core/identity_map.rb", "lib/dm-core/migrations.rb", "lib/dm-core/model.rb", "lib/dm-core/model/descendant_set.rb", "lib/dm-core/model/hook.rb", "lib/dm-core/model/is.rb", "lib/dm-core/model/property.rb", "lib/dm-core/model/relationship.rb", "lib/dm-core/model/scope.rb", "lib/dm-core/property.rb", "lib/dm-core/property_set.rb", "lib/dm-core/query.rb", "lib/dm-core/query/conditions/comparison.rb", "lib/dm-core/query/conditions/operation.rb", "lib/dm-core/query/direction.rb", "lib/dm-core/query/operator.rb", "lib/dm-core/query/path.rb", "lib/dm-core/query/sort.rb", "lib/dm-core/repository.rb", "lib/dm-core/resource.rb", "lib/dm-core/spec/adapter_shared_spec.rb", "lib/dm-core/spec/data_objects_adapter_shared_spec.rb", "lib/dm-core/support/chainable.rb", "lib/dm-core/support/deprecate.rb", "lib/dm-core/support/equalizer.rb", "lib/dm-core/support/logger.rb", "lib/dm-core/support/naming_conventions.rb", "lib/dm-core/transaction.rb", "lib/dm-core/type.rb", "lib/dm-core/types/boolean.rb", "lib/dm-core/types/discriminator.rb", "lib/dm-core/types/object.rb", "lib/dm-core/types/paranoid_boolean.rb", "lib/dm-core/types/paranoid_datetime.rb", "lib/dm-core/types/serial.rb", "lib/dm-core/types/text.rb", "lib/dm-core/version.rb", "script/performance.rb", "script/profile.rb", "spec/lib/adapter_helpers.rb", "spec/lib/collection_helpers.rb", "spec/lib/counter_adapter.rb", "spec/lib/pending_helpers.rb", "spec/lib/rspec_immediate_feedback_formatter.rb", "spec/public/associations/many_to_many_spec.rb", "spec/public/associations/many_to_one_spec.rb", "spec/public/associations/many_to_one_with_boolean_cpk_spec.rb", "spec/public/associations/one_to_many_spec.rb", "spec/public/associations/one_to_one_spec.rb", "spec/public/associations/one_to_one_with_boolean_cpk_spec.rb", "spec/public/collection_spec.rb", "spec/public/migrations_spec.rb", "spec/public/model/relationship_spec.rb", "spec/public/model_spec.rb", "spec/public/property_spec.rb", "spec/public/resource_spec.rb", "spec/public/sel_spec.rb", "spec/public/setup_spec.rb", "spec/public/shared/association_collection_shared_spec.rb", "spec/public/shared/collection_shared_spec.rb", "spec/public/shared/finder_shared_spec.rb", "spec/public/shared/resource_shared_spec.rb", "spec/public/shared/sel_shared_spec.rb", "spec/public/transaction_spec.rb", "spec/public/types/discriminator_spec.rb", "spec/semipublic/adapters/abstract_adapter_spec.rb", "spec/semipublic/adapters/in_memory_adapter_spec.rb", "spec/semipublic/adapters/mysql_adapter_spec.rb", "spec/semipublic/adapters/oracle_adapter_spec.rb", "spec/semipublic/adapters/postgres_adapter_spec.rb", "spec/semipublic/adapters/sqlite3_adapter_spec.rb", "spec/semipublic/adapters/yaml_adapter_spec.rb", "spec/semipublic/associations/many_to_one_spec.rb", "spec/semipublic/associations/relationship_spec.rb", "spec/semipublic/associations_spec.rb", "spec/semipublic/collection_spec.rb", "spec/semipublic/property_spec.rb", "spec/semipublic/query/conditions_spec.rb", "spec/semipublic/query/path_spec.rb", "spec/semipublic/query_spec.rb", "spec/semipublic/resource_spec.rb", "spec/semipublic/shared/condition_shared_spec.rb", "spec/semipublic/shared/resource_shared_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/ci.rb", "tasks/dm.rb", "tasks/doc.rb", "tasks/gemspec.rb", "tasks/hoe.rb", "tasks/install.rb"] + s.files = [".autotest", ".gitignore", "CONTRIBUTING", "FAQ", "History.txt", "MIT-LICENSE", "Manifest.txt", "QUICKLINKS", "README.txt", "Rakefile", "SPECS", "TODO", "deps.rip", "dm-core.gemspec", "lib/dm-core.rb", "lib/dm-core/adapters.rb", "lib/dm-core/adapters/abstract_adapter.rb", "lib/dm-core/adapters/data_objects_adapter.rb", "lib/dm-core/adapters/in_memory_adapter.rb", "lib/dm-core/adapters/mysql_adapter.rb", "lib/dm-core/adapters/oracle_adapter.rb", "lib/dm-core/adapters/postgres_adapter.rb", "lib/dm-core/adapters/sqlite3_adapter.rb", "lib/dm-core/adapters/sqlserver_adapter.rb", "lib/dm-core/adapters/yaml_adapter.rb", "lib/dm-core/associations/many_to_many.rb", "lib/dm-core/associations/many_to_one.rb", "lib/dm-core/associations/one_to_many.rb", "lib/dm-core/associations/one_to_one.rb", "lib/dm-core/associations/relationship.rb", "lib/dm-core/collection.rb", "lib/dm-core/core_ext/enumerable.rb", "lib/dm-core/core_ext/kernel.rb", "lib/dm-core/core_ext/symbol.rb", "lib/dm-core/identity_map.rb", "lib/dm-core/migrations.rb", "lib/dm-core/model.rb", "lib/dm-core/model/descendant_set.rb", "lib/dm-core/model/hook.rb", "lib/dm-core/model/is.rb", "lib/dm-core/model/property.rb", "lib/dm-core/model/relationship.rb", "lib/dm-core/model/scope.rb", "lib/dm-core/property.rb", "lib/dm-core/property_set.rb", "lib/dm-core/query.rb", "lib/dm-core/query/conditions/comparison.rb", "lib/dm-core/query/conditions/operation.rb", "lib/dm-core/query/direction.rb", "lib/dm-core/query/operator.rb", "lib/dm-core/query/path.rb", "lib/dm-core/query/sort.rb", "lib/dm-core/repository.rb", "lib/dm-core/resource.rb", "lib/dm-core/spec/adapter_shared_spec.rb", "lib/dm-core/spec/data_objects_adapter_shared_spec.rb", "lib/dm-core/support/chainable.rb", "lib/dm-core/support/deprecate.rb", "lib/dm-core/support/equalizer.rb", "lib/dm-core/support/logger.rb", "lib/dm-core/support/naming_conventions.rb", "lib/dm-core/transaction.rb", "lib/dm-core/type.rb", "lib/dm-core/types/boolean.rb", "lib/dm-core/types/discriminator.rb", "lib/dm-core/types/object.rb", "lib/dm-core/types/paranoid_boolean.rb", "lib/dm-core/types/paranoid_datetime.rb", "lib/dm-core/types/serial.rb", "lib/dm-core/types/text.rb", "lib/dm-core/version.rb", "script/performance.rb", "script/profile.rb", "spec/lib/adapter_helpers.rb", "spec/lib/collection_helpers.rb", "spec/lib/counter_adapter.rb", "spec/lib/pending_helpers.rb", "spec/lib/rspec_immediate_feedback_formatter.rb", "spec/public/associations/many_to_many_spec.rb", "spec/public/associations/many_to_one_spec.rb", "spec/public/associations/many_to_one_with_boolean_cpk_spec.rb", "spec/public/associations/one_to_many_spec.rb", "spec/public/associations/one_to_one_spec.rb", "spec/public/associations/one_to_one_with_boolean_cpk_spec.rb", "spec/public/collection_spec.rb", "spec/public/migrations_spec.rb", "spec/public/model/relationship_spec.rb", "spec/public/model_spec.rb", "spec/public/property_spec.rb", "spec/public/resource_spec.rb", "spec/public/sel_spec.rb", "spec/public/setup_spec.rb", "spec/public/shared/association_collection_shared_spec.rb", "spec/public/shared/collection_finder_shared_spec.rb", "spec/public/shared/collection_shared_spec.rb", "spec/public/shared/finder_shared_spec.rb", "spec/public/shared/resource_shared_spec.rb", "spec/public/shared/sel_shared_spec.rb", "spec/public/transaction_spec.rb", "spec/public/types/discriminator_spec.rb", "spec/semipublic/adapters/abstract_adapter_spec.rb", "spec/semipublic/adapters/in_memory_adapter_spec.rb", "spec/semipublic/adapters/mysql_adapter_spec.rb", "spec/semipublic/adapters/oracle_adapter_spec.rb", "spec/semipublic/adapters/postgres_adapter_spec.rb", "spec/semipublic/adapters/sqlite3_adapter_spec.rb", "spec/semipublic/adapters/sqlserver_adapter_spec.rb", "spec/semipublic/adapters/yaml_adapter_spec.rb", "spec/semipublic/associations/many_to_one_spec.rb", "spec/semipublic/associations/relationship_spec.rb", "spec/semipublic/associations_spec.rb", "spec/semipublic/collection_spec.rb", "spec/semipublic/property_spec.rb", "spec/semipublic/query/conditions_spec.rb", "spec/semipublic/query/path_spec.rb", "spec/semipublic/query_spec.rb", "spec/semipublic/resource_spec.rb", "spec/semipublic/shared/condition_shared_spec.rb", "spec/semipublic/shared/resource_shared_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/ci.rb", "tasks/dm.rb", "tasks/doc.rb", "tasks/gemspec.rb", "tasks/hoe.rb", "tasks/install.rb"] s.homepage = %q{http://datamapper.org} s.rdoc_options = ["--main", "README.txt"] s.require_paths = ["lib"] diff --git a/lib/dm-core.rb b/lib/dm-core.rb index 01488b26..f6a9391b 100644 --- a/lib/dm-core.rb +++ b/lib/dm-core.rb @@ -64,6 +64,7 @@ require dir / 'transaction' # TODO: move to dm-more require dir / 'version' +require dir / 'core_ext' / 'enumerable' require dir / 'core_ext' / 'kernel' # TODO: do not load automatically require dir / 'core_ext' / 'symbol' # TODO: do not load automatically diff --git a/lib/dm-core/adapters/data_objects_adapter.rb b/lib/dm-core/adapters/data_objects_adapter.rb index 2446e2c4..010009c7 100644 --- a/lib/dm-core/adapters/data_objects_adapter.rb +++ b/lib/dm-core/adapters/data_objects_adapter.rb @@ -615,10 +615,12 @@ def comparison_statement(comparison, qualify) else return conditions_statement(comparison.foreign_key_mapping, qualify) end - elsif @negated && comparison.slug == :in && !value.any? - return [ '1 = 1' ] # match everything - elsif comparison.slug == :in && !value.any? - return [ '1 = 0' ] # match nothing + elsif comparison.slug == :in && value.empty? + if @negated + return [ '1 = 1' ] # match everything + else + return [ '1 = 0' ] # match nothing + end end operator = comparison_operator(comparison) diff --git a/lib/dm-core/core_ext/enumerable.rb b/lib/dm-core/core_ext/enumerable.rb new file mode 100644 index 00000000..e5dbd245 --- /dev/null +++ b/lib/dm-core/core_ext/enumerable.rb @@ -0,0 +1,6 @@ +module Enumerable + def empty? + each { return false } + true + end +end diff --git a/lib/dm-core/query.rb b/lib/dm-core/query.rb index de081814..b3bf632c 100644 --- a/lib/dm-core/query.rb +++ b/lib/dm-core/query.rb @@ -55,7 +55,7 @@ def self.target_conditions(source, source_key, target_key) Array(source).each do |resource| next unless source_key.loaded?(resource) source_value = source_key.get!(resource) - next if source_value.any? { |value| value.nil? } + next unless target_key.valid?(source_value) source_values << source_value end end diff --git a/lib/dm-core/query/conditions/comparison.rb b/lib/dm-core/query/conditions/comparison.rb index 7a7647af..788f9785 100644 --- a/lib/dm-core/query/conditions/comparison.rb +++ b/lib/dm-core/query/conditions/comparison.rb @@ -511,7 +511,7 @@ def valid? when Range loaded_value.any? && valid_for_subject?(loaded_value.first) && valid_for_subject?(loaded_value.last) when Enumerable - (loaded_value.any? || negated?) && loaded_value.all? { |val| valid_for_subject?(val) } + (!loaded_value.empty? || negated?) && loaded_value.all? { |val| valid_for_subject?(val) } else false end