00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00028 #ifndef _SUM_DELTAS_H_
00029 #define _SUM_DELTAS_H_
00030 #include <vector>
00031 #include "delta.h"
00032
00034
00040 inline work_node full_node_to_work_node(full_node& n_full,
00041 gptr<search_node> &ground)
00042 {
00043 ptr<model> ptr_to_model_from_n_full(*n_full.get_model_ptr());
00044 ptr<vdbl::database> ptr_to_dbase_from_n_full(*n_full.get_database_ptr());
00045
00046
00047 std::list<delta_id> empty_list_of_delta_id;
00048 return work_node(n_full.get_id(), n_full.get_dbuserid(),
00049 *new ptr<model>(ptr_to_model_from_n_full),
00050 *new ptr<vdbl::database>(ptr_to_dbase_from_n_full),
00051 n_full.get_annotations(), empty_list_of_delta_id, &ground);
00052 }
00053
00055
00060 class sum_deltas: public prepost_visitor<search_node*, search_node*>
00061 {
00062 public:
00064 std::vector<return_value> ancestors;
00066 return_value result;
00068 std::list<delta_id>* dels;
00070 std::set<search_node_id>* nds;
00072 const std::set<search_node_id>* c_nds;
00074 const search_node_id* psnid;
00075
00077 sum_deltas(std::list<delta_id>& _dels, std::set<search_node_id>& _nds) :
00078 result(NULL), dels(&_dels), nds(&_nds), c_nds(NULL), psnid(NULL)
00079 {
00080 #if DEBUG_SGRAPH_EXTRACT
00081 std::cerr << "sum_deltas:" << std::endl;
00082 #endif
00083 }
00084
00086 sum_deltas(std::list<delta_id>& _dels, std::set<search_node_id>& _nds,
00087 const std::set<search_node_id>& _c_nds) :
00088 result(NULL), dels(&_dels), nds(&_nds), c_nds(&_c_nds), psnid(NULL)
00089 {
00090 #if DEBUG_SGRAPH_EXTRACT
00091 std::cerr << "sum_deltas: c_nds: " << *c_nds << std::endl;
00092 #endif
00093 }
00094
00096 sum_deltas(std::list<delta_id>& _dels, std::set<search_node_id>& _nds,
00097 const search_node_id& _psnid) :
00098 result(NULL), dels(&_dels), nds(&_nds), c_nds(NULL), psnid(&_psnid)
00099 {
00100 #if DEBUG_SGRAPH_EXTRACT
00101 std::cerr << "sum_deltas: psnid: " << *psnid << std::endl;
00102 #endif
00103 }
00104
00106
00107 inline void vinit()
00108 {
00109
00110 }
00111
00112 inline void vcollect(return_value const &)
00113 {
00114
00115 throw api_exception(apiee_search_graph,
00116 "in sum_deltas::vcollect: do not know how to handle virtual nodes");
00117 }
00118
00119 inline return_value vvalue()
00120 {
00121
00122 return result;
00123 }
00124
00125 inline bool preorder(search_node* const& r)
00126 {
00127 bool res;
00128 search_node_id rid(r->get_id());
00129
00130 ancestors.clear();
00131
00132 res = r->is_delta() &&
00133 (!c_nds || c_nds->find(rid) == c_nds->end()) && (!psnid || *psnid != rid);
00134 if(!res)
00135 result = r;
00136 else
00137 nds->insert(rid);
00138 return res;
00139 }
00140
00141 inline void collect(search_node* const&, return_value const &ancestor)
00142 {
00143
00144 ancestors.push_back(ancestor);
00145 }
00146
00147 bool postorder(search_node* const &r)
00148 {
00149
00150 if(ancestors.size() >= 2)
00151 throw api_exception(apiee_search_graph,
00152 "in sum_deltas::postorder: search_node has several ancestors");
00153 else if(!result)
00154 {
00155 result = ancestors[0];
00156 delta_node *r_as_delta_node = (delta_node *) r;
00157 r_as_delta_node->get_deltas(*dels);
00158 #if DEBUG_SGRAPH_EXTRACT
00159 {
00160 std::list<delta_id> dels_dummy;
00161 r_as_delta_node->get_deltas(dels_dummy);
00162 std::cerr << "node: " << r->get_id() << ", deltas: " <<
00163 dels_dummy << std::endl;
00164 }
00165 #endif
00166 }
00167 return false;
00168 }
00169
00170 inline return_value value()
00171 {
00172
00173 return result;
00174 }
00176 };
00177 #endif // _SUM_DELTAS_H_