konzeptheft.txt 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. Gesamtprojekt - Methodik
  2. ---
  3. *Lastenheft
  4. Ziele
  5. - Crowdsourcing einer Tag-Semantik
  6. - Backend für Anwendungen
  7. - Ermögliche komplexe Anfragen auf sichere Weise
  8. - Ermögliche Punkt-In-Polygon-Abfrage
  9. *Pflichtenheft
  10. Vorgehen
  11. Design als Server mit den folgenden Eigenschaften:
  12. - Als Datenmodell werden die räumlichen Daten von OSM gespiegelt plus abgeleitete Daten
  13. - Die Regeln für die Datenableitung werden Crowdgesourct
  14. - Der Server gestattet Abfragen gespiegelte und abgeleitete Daten
  15. - Es wird eine möglichst einfache Syntax, einheitlich für Regeln und Abfragen, verwendet. Wir verwenden XML, weil dies Unklarheiten mit Sonderzeichen minimiert und das Parsen erspart, verzichten aber auf eine formale DTD
  16. - Der Server analysiert Abfragen auf ihren Aufwand und verhindert so eine Überlastung a-priori
  17. - Die Datenaktualisierung erfolgt blockweise, so dass der Server gegenüber OSM immer einige Stunden im Rückstand ist
  18. Datenmodell
  19. Abfragesprache
  20. Vorhersageregeln
  21. Priorisierung
  22. 1. der Server soll einfache Abfragen der gespiegelten Daten beantworten können, ohne Aufwandsvorhersage
  23. 2. der Server soll alle Abfragen der gespiegelten Daten beantworten können, ohne Aufwandsvorhersage
  24. 3. der Server soll alle Abfragen der gespiegelten Daten beantworten können, mit Aufwandsvorhersage
  25. 4. der Server soll Regeln bearbeiten können
  26. 5. der Server soll alle Abfragen der gespiegelten und abgeleiteten Daten beantworten können, mit Aufwandsvorhersage
  27. 7. Optimierung, z.B. area_query
  28. 8. Beschleunigung durch Bündelung
  29. 9. Refaktorisierung
  30. 10. Download-Suchmaschine
  31. 11. PBF anbinden
  32. 12. Refaktorisierung Linienanzeige
  33. 13. Liniennetz-Generator
  34. *Projektstrukturplan
  35. Vorab:
  36. 0. Struktur des Systems
  37. 6. Review der Dokumentation
  38. Zu jeder Phase:
  39. a) Spezifikation, Dokumentation
  40. b) (Gesamt-)Tests, Regression beachten
  41. c) strukturelle Implikationen, ggf. Refactoring
  42. d) Implementierung
  43. Entwurf des Projektstrukturplans:
  44. 0, 1a, 1b, 1c, 1d, 2a, 2b, 2c, 2d, 3a, 3b, 3c, 3d, 4a, 4b, 4c, 4d, 5a, 5b, 5c, 5d
  45. Abhängigkeiten sind strikt linear. Da nur eine Person implementiert, ist weitere Gliederung nicht nötig
  46. ---
  47. ad 0.:
  48. Strukturierung des Servers in
  49. - Disponenten
  50. - Frontend
  51. - Regelbearbeitung
  52. OSM-Backend: Dieser Teil des Systems ist verantwortlich dafür, die Daten aus der OSM-Datenbank in die interne Datenbank zu spiegeln.
  53. generisches Backend: Dieser Teil übernimmt die Umsetzung der abstrakten Datenbank-Operationen Lesen und Update in das Lesen und Schreiben in Dateien
  54. Setup der Tools:
  55. Verwendung von C++ mit POSIX-Systemfunktionen. Modularisiert wird über die Einteilung in Klassen. Vererbung wird ausschließlich genutzt, um Subtyping, insbesondere Polymorphie zu realisieren. Die Deklaration wird, sofern möglich, in .h-Dateien durchgeführt, die Definition befindet sich möglichst in .cc-Dateien.
  56. Automatische Quellcode-Builds mit den GNU Autotools, grob nach Standard:
  57. Im Detail:
  58. src/ - Enthält die kompletten Quellen
  59. build/ - Hilfsverzeichnis für configure/make
  60. cgi-bin/ - Enthält die aus dem Netz aufrufbaren Programme
  61. html/ - Enthält die Dokumentation
  62. bin/ - Enthält die übrigen Programme des Produktivsystems
  63. test-bin/ - Enthält die Programme für Testzwecke
  64. Versionverwaltung mit CVS
  65. ---
  66. ad 1.:
  67. /!\ die modulare Gliederung erfordert eine Änderung des Projektstrukturplans
  68. 1.1 erst a-d für das generische Backend durchlaufen und dieses Teilsystem funktionsfähig bekommen
  69. 1.2 dann a-d für das OSM-Backend durchlaufen und dieses Teilsystem funktionsfähig bekommen
  70. 1.3 dann a-d für die Skriptbearbeitung durchlaufen und dieses Teilsystem funktionsfähig bekommen
  71. 1.4 dann a-d für Frontend durchlaufen und dieses Teilsystem funktionsfähig bekommen
  72. ad 1.1.a):
  73. keine expliziten Artefakte erstellt, Schnittstellen:
  74. aus src/backend/block_backend.h:
  75. template< class TIndex >
  76. struct Default_Range_Iterator : set< pair< TIndex, TIndex > >::const_iterator
  77. {
  78. Default_Range_Iterator
  79. (const typename set< pair< TIndex, TIndex > >::const_iterator it);
  80. Default_Range_Iterator();
  81. const TIndex& lower_bound() const;
  82. const TIndex& upper_bound() const;
  83. };
  84. template< class TIndex, class TObject >
  85. struct Block_Backend
  86. {
  87. typedef ... Flat_Iterator;
  88. typedef ... Discrete_Iterator;
  89. typedef ... Range_Iterator;
  90. Block_Backend
  91. (const File_Properties& file_prop, bool writeable,
  92. string file_name_extension = "");
  93. Flat_Iterator flat_begin();
  94. Flat_Iterator flat_end() const;
  95. Discrete_Iterator discrete_begin
  96. (typename set< TIndex >::const_iterator begin,
  97. typename set< TIndex >::const_iterator end);
  98. Discrete_Iterator discrete_end() const;
  99. Range_Iterator range_begin
  100. (Default_Range_Iterator< TIndex > begin,
  101. Default_Range_Iterator< TIndex > end);
  102. Range_Iterator range_end() const;
  103. void update
  104. (const map< TIndex, set< TObject > >& to_delete,
  105. const map< TIndex, set< TObject > >& to_insert);
  106. }
  107. aus src/backend/random_file.h:
  108. template< class TIndex >
  109. struct Random_File
  110. {
  111. Random_File(const File_Properties& file_prop, bool writeable);
  112. ~Random_File();
  113. TIndex get(uint32 pos) const;
  114. void put(uint32 pos, const TIndex& index);
  115. }
  116. ---
  117. ad 1.1.b):
  118. erstellter Sourcecode: src/backend/block_backend.test.cc, src/backend/file_blocks.test.cc, src/backend/random_file.test.cc
  119. daraus ergeben sich nach 1.1.d): test-bin/block_backend, test-bin/file_blocks, test-bin/random_file
  120. ---
  121. ad 1.1.c):
  122. Vorbereitungen für 1.1.d)
  123. ---
  124. ad 1.1.d):
  125. erstellter Sourcecode: src/backend/block_backend.cc, src/backend/file_blocks.cc, src/backend/random_file.cc
  126. daraus ergeben sich nun: test-bin/block_backend, test-bin/file_blocks, test-bin/random_file
  127. ---
  128. ad 1.2.a):
  129. Das Programm apply_osc liest eine OSM-Change-Datei oder OSM-XML-Datei in die Datenbank ein; mit weiteren OSM-Change-Dateien kann es die Datenbank aktualisieren.
  130. ---
  131. ad 1.2.b):
  132. erstellter Sourcecode: src/osm-backend/diff_updater.test.cc, src/osm-backend/node_updater.test.cc, src/osm-backend/complete_updater.test.cc, src/osm-backend/way_updater.test.cc, src/osm-backend/relation_updater.test.cc, src/osm-backend/dump_database.test.cc
  133. daraus ergeben sich nach 1.2.d): test-bin/example_queries, test-bin/dump_database, test-bin/node_updater, test-bin/apply_osc.test.sh, test-bin/relation_updater, test-bin/way_updater, test-bin/complete_updater, test-bin/diff_updater
  134. Ausgeführt werden soll test-bin/apply_osc.test.sh
  135. ---
  136. ad 1.2.c):
  137. Vorbereitungen für 1.2.d)
  138. ---
  139. ad 1.2.d):
  140. erstellter Sourcecode: src/osm-backend/apply_osc.cc, src/osm-backend/relation_updater.h, src/osm-backend/way_updater.h, src/osm-backend/example_queries.cc, src/osm-backend/update_database.cc, src/osm-backend/node_updater.h, src/core/datatypes.h, src/core/settings.h, src/core/type_way.h, src/core/basic_types.h, src/core/type_relation.h, src/core/settings.cc, src/core/type_node.h
  141. daraus ergeben sich nun: bin/apply_osc, bin/update_database, test-bin/example_queries, test-bin/dump_database, test-bin/node_updater, test-bin/apply_osc.test.sh, test-bin/relation_updater, test-bin/way_updater, test-bin/complete_updater, test-bin/diff_updater
  142. Ausgeführt werden soll test-bin/apply_osc.test.sh
  143. Ab dieser Stelle können mit apply_osc Dateien im OSM-Change-Format eingelesen werden. Es gibt allerdings noch keine sinnvolle Abfragemöglichkeit.
  144. ---
  145. ad 1.3.a):
  146. Die grundliegenden Funktionen in der Skriptbearbeitung sind "id-query", "print" und "recurse". Diese sollen erst einmal funktionsfähig bekommen werden. Als Testmenge verwenden wir diesmal echte Testdaten, und zwar einen Nordrhein-Westfalen-Extrakt.
  147. Wir verwenden eine generische Schnittstelle für Statements wie folgt:
  148. class Statement
  149. {
  150. public:
  151. Statement(int line_number_);
  152. virtual void set_attributes(const char **attr) = 0;
  153. virtual void add_statement(Statement* statement, string text);
  154. virtual void add_final_text(string text);
  155. virtual string get_name() const = 0;
  156. virtual string get_result_name() const = 0;
  157. virtual void forecast() = 0;
  158. virtual void execute(map< string, Set >& maps) = 0;
  159. virtual ~Statement() {}
  160. int get_line_number() const;
  161. int get_startpos() const;
  162. void set_startpos(int pos);
  163. int get_endpos() const;
  164. void set_endpos(int pos);
  165. int get_tagendpos() const;
  166. void set_tagendpos(int pos);
  167. void display_full();
  168. void display_starttag();
  169. static Statement* create_statement(string element, int line_number);
  170. static void set_error_output(Error_Output* error_output_);
  171. const static int NODE = 1;
  172. const static int WAY = 2;
  173. const static int RELATION = 3;
  174. protected:
  175. void eval_cstr_array
  176. (string element, map< string, string >& attributes, const char **attr);
  177. void assure_no_text(string text, string name);
  178. void substatement_error(string parent, Statement* child);
  179. void add_static_error(string error);
  180. void add_static_remark(string remark);
  181. void runtime_remark(string error);
  182. };
  183. Zu diesem Zweck sind alle Statements als Unterklassen der Klasse Statement realisiert.
  184. ---
  185. ad 1.3.b):
  186. erstellter Sourcecode: src/statements/statement.h, src/statements/id_query.test.cc, src/statements/print.test.cc, src/statements/recurse.test.cc
  187. daraus ergeben sich nach 1.3.d): test-bin/id_query, test-bin/print, test-bin/recurse
  188. ---
  189. ad 1.3.c):
  190. Vorbereitungen für 1.3.d)
  191. ---
  192. ad 1.3.d):
  193. erstellter Sourcecode: src/statements/statement.cc, src/statements/id_query.h, src/statements/print.h, src/statements/recurse.h, src/statements/id_query.cc, src/statements/print.cc, src/statements/recurse.cc
  194. daraus ergeben sich nun: test-bin/id_query, test-bin/print, test-bin/recurse
  195. Zwar steht nun noch keine Möglichkeit zur XML-Abfrage zur Verfügung, aber mit einfachen Anmpassungen des Sourcescodes der .test.cc können im Rahmen der drei Statements alle Abfragen realisiert werden.
  196. ---
  197. ad 1.4.a):
  198. Das Frontend nimmt Eingaben über die Console entgegen bzw. in dem Stil, in dem Apache die Eingabe eines POST-Requests umsetzt. Darüber hinaus wird vorrangig geprüft, ob eine Eingabe im Stil eines GET-Requests vorliegt und ggf. diese verarbeitet.
  199. Die Ausgabe erfolgt vorläufig auf die Standardausgabe, mit ggf. unterdrücktem Mime-Typ, ohne Kompression.
  200. Im Hintergrund laufen zwei Datenbanken, die jeweils abwechselnd aktualisiert werden oder für Abfragen zur Verfügung stehen.
  201. ---
  202. ad 1.4.b):
  203. erstellter Sourcecode: src/dispatch/dispatcher.test.cc
  204. daraus ergeben sich nach 1.4.d): test-bin/test_dispatcher
  205. Darüber hinaus muss osm3s_query darauf gestestet werden, ob es korrekte Ergebnisse liefert.
  206. ---
  207. ad 1.4.c):
  208. Wir strukturieren das Frontend wie folgt:
  209. osm3s_query enthält die eigentliche Programmlogik zur Ausführung der Abfrage, wobei zur Vereinfachung die Ausgabe stets auf die Standardausgabe erfolgt.
  210. Die Aufbereitung der Benutzereingabe ist nach user_interface ausgelagert. Die Fehlerausgabe wird über das leicht austauschbare Modul console_output abgewickelt. Das Parsen der Benutzereingabe wird in expat/expat_justparse_interface erledigt.
  211. Die Koordination der Datenbanken sowie der laufenden Anfragen übernimmt dispatcher.
  212. Die Datenbank-Aktualisierung übernimmt apply_osc_to_db.
  213. Die Kommunikation zwischen den Prozessen erfolgt über Datei-Semaphoren bzw. Shared Memory.
  214. ---
  215. ad 1.4.d):
  216. erstellter Sourcecode: src/dispatch/dispatcher.cc, src/dispatch/dispatcher.h, src/dispatch/osm3s_query.cc, src/expat/expat_justparse_interface.cc, src/expat/expat_justparse_interface.h, src/frontend/cgi-helper.cc, src/frontend/cgi-helper.h, src/frontend/console_output.cc, src/frontend/console_output.h, src/frontend/user_interface.cc, src/frontend/user_interface.h, src/osm-backend/apply_osc.cc
  217. daraus ergeben sich nun: test-bin/test_dispatcher, bin/osm3s_query
  218. osm3s_query kann jetzt an der Konsole für Abfragen auf die Datenbank benutzt werden.
  219. ---
  220. ad 2.:
  221. Die Bearbeitung von Flächen ist zwar eigentlich erst in Teil 4 vorgesehen, aber aus zwei Gründen ziehen wir dies vor: Zum einen ist die Flächenverarbeitung mit hohem Rechenaufwand und eigenen Datentabellen recht aufwendig. Zum anderen sollen die Statements durchgängig sinnvoll mit Flächen umgehen können; dies kann nur mit erzeugten Flächen auch sinnvoll getestet werden. Wir teilen daher ein.
  222. 2.1 Statements ohne Flächenbezug
  223. 2.2 Statements mit Flächenbezug
  224. ad 2.1.a):
  225. Zu bearbeiten sind die verbleibenden Statements "bbox_query", "foreach", "item", "query" und "union". Zusätzlich wird mittels Benchmark geprüft, ob die Neuimplementierung eine akzeptable Geschwindigkeit aufweist.
  226. ---
  227. ad 2.1.b):
  228. erstellter Sourcecode: src/statements/bbox_query.test.cc, src/statements/foreach.test.cc, src/statements/query.test.cc, src/statements/union.test.cc
  229. daraus ergeben sich nach 2.1.d): test-bin/bbox_query, test-bin/foreach_query, test-bin/query, test-bin/union
  230. ---
  231. ad 2.1.c):
  232. Vorarbeiten für 2.1.d). Die zusätzlichen Statements erzeugen keinen Bedarf für Refaktorisierung.
  233. ---
  234. ad 2.1.d):
  235. erstellter Sourcecode: src/statements/bbox_query.h, src/statements/bbox_query.cc, src/statements/foreach.h, src/statements/foreach.cc, src/statements/item.h, src/statements/item.cc, src/statements/query.h, src/statements/query.cc, src/statements/union.h, src/statements/union.cc
  236. daraus ergeben sich nun: test-bin/bbox_query, test-bin/foreach_query, test-bin/query, test-bin/union
  237. Die Abfragefunktionalität ohne abgeleitete Daten ist nun komplett vorhanden.
  238. An dieser Stelle hat ein externes Ereignis (schwerwiegende Störung im alten Code) dafür gesorgt, dass dieser Code produktiv gehen muss. Dies ist unschädlich, da der Code noch nicht öffentlich erreichbar wird, sondern nur als Komponente für die ÖPNV-Funktionalität zur Verfügung steht.
  239. ---
  240. src/backend/block_backend.h
  241. src/backend/block_backend.test.cc
  242. src/backend/file_blocks.h
  243. src/backend/file_blocks.test.cc
  244. src/backend/random_file.h
  245. src/backend/random_file.test.cc
  246. src/backend/types.h
  247. src/bin/apply_osc_to_db.sh
  248. src/core/basic_types.h
  249. src/core/datatypes.h
  250. src/core/settings.cc
  251. src/core/settings.h
  252. src/core/type_area.h
  253. src/core/type_node.h
  254. src/core/type_relation.h
  255. src/core/type_way.h
  256. src/dispatch/dispatcher.cc
  257. src/dispatch/dispatcher.h
  258. src/dispatch/dispatcher.test.cc
  259. src/dispatch/osm3s_query.cc
  260. src/expat/expat_justparse_interface.cc
  261. src/expat/expat_justparse_interface.h
  262. src/frontend/cgi-helper.cc
  263. src/frontend/cgi-helper.h
  264. src/frontend/console_output.cc
  265. src/frontend/console_output.h
  266. src/frontend/user_interface.cc
  267. src/frontend/user_interface.h
  268. src/osm-backend/apply_osc.cc
  269. src/osm-backend/area_updater.h
  270. src/osm-backend/complete_updater.test.cc
  271. src/osm-backend/diff_updater.test.cc
  272. src/osm-backend/dump_database.test.cc
  273. src/osm-backend/example_queries.cc
  274. src/osm-backend/node_updater.h
  275. src/osm-backend/node_updater.test.cc
  276. src/osm-backend/relation_updater.h
  277. src/osm-backend/relation_updater.test.cc
  278. src/osm-backend/update_database.cc
  279. src/osm-backend/way_updater.h
  280. src/osm-backend/way_updater.test.cc
  281. src/statements/bbox_query.cc
  282. src/statements/bbox_query.h
  283. src/statements/bbox_query.test.cc
  284. src/statements/benchmark.cc
  285. src/statements/coord_query.cc
  286. src/statements/coord_query.h
  287. src/statements/foreach.cc
  288. src/statements/foreach.h
  289. src/statements/foreach.test.cc
  290. src/statements/id_query.cc
  291. src/statements/id_query.h
  292. src/statements/id_query.test.cc
  293. src/statements/item.cc
  294. src/statements/item.h
  295. src/statements/make_area.cc
  296. src/statements/make_area.h
  297. src/statements/make_area.test.cc
  298. src/statements/osm_script.cc
  299. src/statements/osm_script.h
  300. src/statements/print.cc
  301. src/statements/print.h
  302. src/statements/print.test.cc
  303. src/statements/query.cc
  304. src/statements/query.h
  305. src/statements/query.test.cc
  306. src/statements/recurse.cc
  307. src/statements/recurse.h
  308. src/statements/recurse.test.cc
  309. src/statements/statement.cc
  310. src/statements/statement.h
  311. src/statements/union.cc
  312. src/statements/union.h
  313. src/statements/union.test.cc
  314. src/test-bin/apply_osc.test.sh