@@ -90,7 +90,69 @@ private static void appendDBTag(StringBuilder sb, ResultSet rs, String name) thr
9090 }
9191 }
9292
93- public DatabasePseudoTagProvider (String filename ) {
93+ public DatabasePseudoTagProvider (String filename , String jdbcurl ) {
94+ if (filename != null ) doFileImport (filename );
95+ if (jdbcurl != null ) doDatabaseImport (jdbcurl );
96+ }
97+
98+ private void doDatabaseImport (String jdbcurl ) {
99+
100+ try (Connection conn = DriverManager .getConnection (jdbcurl )) {
101+
102+ System .out .println ("DatabasePseudoTagProvider reading from database: " + jdbcurl );
103+ conn .setAutoCommit (false );
104+
105+
106+ Map <Map <String , String >, Map <String , String >> mapUnifier = new HashMap <>();
107+ CompactLongMap <Map <String , String >> data = new CompactLongMap <>();
108+
109+ String sql_all_tags = "SELECT * from all_tags" ;
110+ try (PreparedStatement psAllTags = conn .prepareStatement (sql_all_tags )) {
111+
112+ psAllTags .setFetchSize (100 );
113+
114+ // process the results
115+ ResultSet rs = psAllTags .executeQuery ();
116+
117+ long dbRows = 0L ;
118+ while (rs .next ()) {
119+ long osm_id = rs .getLong ("losmid" );
120+ Map <String , String > row = new HashMap <>(5 );
121+ addDBTag (row , rs , "noise_class" );
122+ addDBTag (row , rs , "river_class" );
123+ addDBTag (row , rs , "forest_class" );
124+ addDBTag (row , rs , "town_class" );
125+ addDBTag (row , rs , "traffic_class" );
126+
127+ // apply the instance-unifier for the row-map
128+ Map <String , String > knownRow = mapUnifier .get (row );
129+ if (knownRow != null ) {
130+ row = knownRow ;
131+ } else {
132+ mapUnifier .put (row , row );
133+ }
134+ data .put (osm_id , row );
135+ dbRows ++;
136+ if (dbRows % 1000000L == 0L ) {
137+ System .out .println (".. from database: rows =" + dbRows );
138+ }
139+ }
140+ System .out .println ("freezing result map.." );
141+ dbData = new FrozenLongMap <>(data );
142+ System .out .println ("read from database: rows =" + dbData .size () + " unique rows=" + mapUnifier .size ());
143+ }
144+
145+ } catch (SQLException g ) {
146+ System .err .format ("DatabasePseudoTagProvider execute sql .. SQL State: %s\n %s\n " , g .getSQLState (), g .getMessage ());
147+ System .exit (1 );
148+ } catch (Exception f ) {
149+ f .printStackTrace ();
150+ System .exit (1 );
151+ }
152+
153+ }
154+
155+ private void doFileImport (String filename ) {
94156
95157 try (BufferedReader br = new BufferedReader (new InputStreamReader (
96158 filename .endsWith (".gz" ) ? new GZIPInputStream (new FileInputStream (filename )) : new FileInputStream (filename )))) {
@@ -158,12 +220,22 @@ private List<String> tokenize(String s) {
158220 return l ;
159221 }
160222
161- private static void addTag (Map <String , String > row , String s , String name ) {
223+ private static void addTag (Map <String , String > row , String s , String name ) {
162224 if (!s .isEmpty ()) {
163225 row .put (name , s );
164226 }
165227 }
166228
229+ private static void addDBTag (Map <String , String > row , ResultSet rs , String name ) {
230+ String v = null ;
231+ try {
232+ v = rs .getString (name );
233+ } catch (Exception e ) {}
234+ if (v != null ) {
235+ row .put ("estimated_" + name , v );
236+ }
237+ }
238+
167239 public void addTags (long osm_id , Map <String , String > map ) {
168240
169241 if (map == null || !map .containsKey ("highway" )) {
@@ -194,6 +266,6 @@ public void addTags(long osm_id, Map<String, String> map) {
194266 pseudoTagsFound .put (key , cnt + 1L );
195267 }
196268 }
197-
198-
269+
270+
199271}
0 commit comments