diff --git a/content.module b/content.module index 4b84f5d..c95f841 100644 --- a/content.module +++ b/content.module @@ -538,23 +538,48 @@ function content_storage($op, $node) { $selects = array(); foreach ($type['fields'] as $field) { $db_info = content_database_info($field); + $table = $db_info['table']; if ($field['multiple']) { - $selects[$db_info['table']]['multiple'] = TRUE; + $table_name = $table; + $selects[$table_name]['table_name'] = $table_name; + $selects[$table_name]['multiple'] = TRUE; } + else if (!isset($primary_table) || count($selects[$primary_table]['join']) > 30) { + $table_name = $primary_table = $table; + $selects[$table_name]['table_name'] = $table_name; + } + else { + $table_name = $primary_table; + if ($table != $primary_table && (empty($selects[$primary_table]['join']) || !in_array($table, $selects[$primary_table]['join'])) { + $selects[$primary_table]['join'][] = $table; + } + } + foreach ($db_info['columns'] as $column => $attributes) { - $selects[$db_info['table']]['columns'][] = $attributes['column']; + // We should never multiple fields as the same name on different + // shared tables, but if we do, an alias for the field will need + // to be added. + $selects[$table_name]['columns'][] = $table .'.'. $attributes['column']; + $field['table'] = $table; $field['columns'][$column] = $attributes['column']; } - $selects[$db_info['table']]['fields'][] = $field; + $selects[$table_name]['fields'][] = $field; } foreach ($selects as $table => $select) { if ($select['multiple']) { - $select['columns'][] = 'delta'; + $select['columns'][] = $select['table_name'] .'.delta'; + } + + $join = ''; + if (!empty($select['join'])) { + content_storage_format_join($select['table_name'], TRUE); + $join = ' '. implode(' ', array_map('content_storage_format_join', $select['join'])); } - $sql = 'SELECT '. implode(', ', $select['columns']) .' FROM {'. $table .'} WHERE vid = %d'; + + $sql = 'SELECT '. implode(', ', $select['columns']) .' FROM {'. $table .'} '. $select['table_name'] . $join .' WHERE '. $select['table_name'] .'.vid = %d'; if ($select['multiple']) { - $result = db_query($sql .' ORDER BY delta', $node->vid); + $result = db_query($sql .' ORDER BY delta ASC', $node->vid); } else { $result = db_query_range($sql, $node->vid, 0, 1); @@ -718,6 +743,18 @@ function content_storage($op, $node) { } /** + * Format the joining of the shared tables + */ +function content_storage_format_join($a, $init = FALSE) { + static $table_name = ''; + if ($init) { + $table_name = $a; + } + return 'LEFT JOIN {'. $a .'} '. $a .' ON '. $table_name .'.vid = '. $a + .'.vid'; +} + +/** * */ function content_type_placeholder($type) {