lib/rasti/db/relations/many_to_many.rb in rasti-db-4.1.1 vs lib/rasti/db/relations/many_to_many.rb in rasti-db-4.2.0
- old
+ new
@@ -17,36 +17,42 @@
def relation_data_source_name
@relation_data_source_name ||= options[:relation_data_source_name] || source_collection_class.data_source_name
end
- def fetch_graph(environment, rows, selected_attributes=nil, excluded_attributes=nil, relations_graph=nil)
+ def fetch_graph(environment, rows, selected_attributes=nil, excluded_attributes=nil, queries=nil, relations_graph=nil)
pks = rows.map { |row| row[source_collection_class.primary_key] }
-
+
if target_collection_class.data_source_name == relation_data_source_name
target_data_source = environment.data_source_of target_collection_class
dataset = target_data_source.db.from(environment.qualify_collection(target_collection_class))
.join(qualified_relation_collection_name(environment), target_foreign_key => target_collection_class.primary_key)
.where(Sequel[relation_collection_name][source_foreign_key] => pks)
.select_all(target_collection_class.collection_name)
- selected_attributes ||= target_collection_class.collection_attributes - excluded_attributes if excluded_attributes
- dataset = dataset.select(*selected_attributes.map { |a| Sequel[target_collection_class.collection_name][a] }) if selected_attributes
+ selected_attributes ||= target_collection_class.collection_attributes - excluded_attributes unless excluded_attributes.nil?
+ dataset = dataset.select(*selected_attributes.map { |a| Sequel[target_collection_class.collection_name][a] }) unless selected_attributes.nil?
- join_rows = dataset.select_append(Sequel[relation_collection_name][source_foreign_key].as(:source_foreign_key)).all
+ query = Query.new collection_class: target_collection_class, dataset: dataset, environment: environment
+ query = queries.inject(query) { |new_query, sub_query| new_query.send(sub_query) } unless queries.nil?
+
+ join_rows = query.send(:dataset).select_append(Sequel[relation_collection_name][source_foreign_key].as(:source_foreign_key)).all
+
else
relation_data_source = environment.data_source relation_data_source_name
relation_index = relation_data_source.db.from(relation_data_source.qualify(relation_collection_name))
.where(source_foreign_key => pks)
.select_hash_groups(target_foreign_key, source_foreign_key)
query = target_collection_class.new environment
- query = query.exclude_attributes(*excluded_attributes) if excluded_attributes
- query = query.select_attributes(*selected_attributes) if selected_attributes
+ query = query.exclude_attributes(*excluded_attributes) unless excluded_attributes.nil?
+ query = query.select_attributes(*selected_attributes) unless selected_attributes.nil?
+ query = queries.inject(query) { |new_query, sub_query| new_query.send(sub_query) } unless queries.nil?
+
join_rows = query.where(target_collection_class.primary_key => relation_index.keys).raw.flat_map do |row|
relation_index[row[target_collection_class.primary_key]].map do |source_primary_key|
row.merge(source_foreign_key: source_primary_key)
end
end
@@ -108,6 +114,6 @@
end
end
end
end
-end
\ No newline at end of file
+end