function a_db = joinPages(db, with_db)
% joinPages - Joins the rows of the given db to the with_db rows matching with the PageIndex
% column.
%
% Usage:
% a_db = joinPages(db, with_db)
%
% Description:
% Replicates the desired columns in the with_db with rows having a
% page index and joins them next to desired columns from the current 3D_db. Flattens
% the resulting 3D_db to become a 2D db. Assumes each page index only
% appears once in with_db.
%
% Parameters:
% db: A tests_3D_db object.
% with_db: A tests_db object with a PageIndex column.
%
% Returns:
% a_db: A tests_db object.
%
% See also: tests_db
%
% $Id$
%
% Author: Cengiz Gunay <cgunay@emory.edu>, 2004/10/15
% Copyright (c) 2007 Cengiz Gunay <cengique@users.sf.net>.
% This work is licensed under the Academic Free License ("AFL")
% v. 3.0. To view a copy of this license, please look at the COPYING
% file distributed with this software or visit
% http://opensource.org/licenses/afl-3.0.php.
vs = warning('query', 'verbose');
verbose = strcmp(vs.state, 'on');
data = get(db, 'data');
w_data = get(with_db, 'data');
page_col = tests2cols(with_db, 'PageIndex');
pages = w_data(:, page_col);
size_db = dbsize(db);
size_wdb = dbsize(with_db);
cols = tests2cols(db, ':');
w_cols = tests2cols(with_db, ':');
%log_cols = true(1, size(with_db, 2));
%log_cols(page_col) = false(1);
page_size = size_db(1);
new_size(1) = page_size * size_wdb(1);
new_size(2) = length(cols) + length(w_cols); % Except the page index
new_data = repmat(NaN, new_size);
ones_vector = ones(page_size, 1);
% Do for each row in with_db
for new_page_num=1:size_wdb(1)
% Concat the data with replicated rows
new_data(((new_page_num - 1) * page_size + 1):(new_page_num * page_size), :) = ...
[ data(:, cols, pages(new_page_num)), ...
ones_vector * w_data(new_page_num, w_cols) ];
end
% Get the column names straight
cols_cell1 = fieldnames(get(db, 'col_idx'));
cols_cell2 = fieldnames(get(with_db, 'col_idx'));
if verbose
cols_cell1
cols_cell2
cols
w_cols
cols_cell1{cols}
cols_cell2{w_cols}
end
a_db = tests_db(new_data, ...
{ cols_cell1{cols}, cols_cell2{w_cols} }, ...
fieldnames(get(db, 'row_idx')), ...
[ get(db, 'id') ' joined with ' get(with_db, 'id')], ...
get(db, 'props'));