% AUTORIGHTS
% Copyright (C) 2007 Princeton University
%       
% This file is part of Ferret Toolkit.
% 
% Ferret Toolkit is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2, or (at your option)
% any later version.
% 
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
% 
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software Foundation,
% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
\section{Query Execution Plan}

\begin{itemize}
\item Interface to external database is achieved by using
cass\_qry\_filterset\_t within the cass\_qry\_param\_t.
\item To support multiple modality, we would expose functions to
  support AND, OR, VOTE methods to combine results from different
  query results.
\end{itemize}

\subsection {Multiple modality support}
\begin{verbatim}
typdef struct _cass_fusion_param_t {
    enum cass_fusion_method_t method;  // AND, OR, VOTE, Weighted_SUM, etc
    union {
        method_specific_data;
    }
} cass_fusion_param_t;

int cass_fusion(cass_env_t *env, 
                uint32_t num_qries,
                cass_vecset_t **qry_vecset, 
                cass_qry_param_t **param, 
                cass_fusion_param_t *fusion_param;
                cass_qry_result_t *qry);
// Need to add details on combining results, eg: index + rerank;
                filter + rerank (using sketch or ori_feat), etc.
\end{verbatim}


