@@ -214,24 +214,6 @@ void flex_table_column_t::add_expire(expire_config_t const &config)
214214}
215215
216216namespace {
217-
218- /* *
219- * This expires all geometries in "geoms" by themselves. Used when we don't
220- * need diff expire.
221- */
222- void separate_expire (std::vector<geom::geometry_t > const &geoms,
223- expire_config_t const &expire_config,
224- expire_tiles_t &expire_tiles,
225- std::vector<expire_output_t > *expire_outputs)
226- {
227- assert (expire_outputs);
228-
229- for (auto const &geom : geoms) {
230- expire_tiles.from_geometry (geom, expire_config);
231- }
232- expire_tiles.commit_tiles (&expire_outputs->at (expire_config.expire_output ));
233- }
234-
235217/* *
236218 * When doing diff expire, we need to calculate the symmetric difference
237219 * between old and new geometries. The difference is done by type, so points
@@ -282,28 +264,14 @@ void classify_geometries(T input_geoms, geom::multipoint_t *points,
282264}
283265// NOLINTEND(cppcoreguidelines-rvalue-reference-param-not-moved)
284266
285- template <typename T>
286- void diff_and_expire (geom::multigeometry_t <T> const &old_geoms,
287- geom::multigeometry_t <T> const &new_geoms,
288- expire_config_t const &expire_config,
289- expire_tiles_t &expire_tiles)
290- {
291- std::vector<T> diffs;
292- boost::geometry::sym_difference (old_geoms, new_geoms, diffs);
293- for (auto const &geom : diffs) {
294- expire_tiles.from_geometry (geom, expire_config);
295- }
296- }
297-
298- void diff_expire (std::vector<geom::geometry_t > *geoms_old,
299- std::vector<geom::geometry_t > *geoms_new,
300- expire_config_t const &expire_config,
301- expire_tiles_t &expire_tiles,
302- std::vector<expire_output_t > *expire_outputs)
267+ void find_difference (std::vector<geom::geometry_t > *geoms_old,
268+ std::vector<geom::geometry_t > *geoms_new,
269+ std::vector<geom::point_t > *diff_points,
270+ std::vector<geom::linestring_t > *diff_linestrings,
271+ std::vector<geom::polygon_t > *diff_polygons)
303272{
304273 assert (geoms_old);
305274 assert (geoms_new);
306- assert (expire_outputs);
307275
308276 geom::multipoint_t old_points;
309277 geom::multilinestring_t old_linestrings;
@@ -319,12 +287,10 @@ void diff_expire(std::vector<geom::geometry_t> *geoms_old,
319287 classify_geometries (geoms_new, &new_points, &new_linestrings,
320288 &new_polygons);
321289
322- diff_and_expire (old_points, new_points, expire_config, expire_tiles);
323- diff_and_expire (old_linestrings, new_linestrings, expire_config,
324- expire_tiles);
325- diff_and_expire (old_polygons, new_polygons, expire_config, expire_tiles);
326-
327- expire_tiles.commit_tiles (&expire_outputs->at (expire_config.expire_output ));
290+ boost::geometry::sym_difference (old_points, new_points, *diff_points);
291+ boost::geometry::sym_difference (old_linestrings, new_linestrings,
292+ *diff_linestrings);
293+ boost::geometry::sym_difference (old_polygons, new_polygons, *diff_polygons);
328294}
329295
330296} // anonymous namespace
@@ -340,19 +306,58 @@ void flex_table_column_t::do_expire(
340306 assert (expire);
341307 assert (expire_outputs);
342308
309+ // Sometimes it doesn't depend on the expire config whether we want to
310+ // do diff expire.
311+ bool const always_separate =
312+ !enable_diff_expire || geoms_old->empty () || geoms_new->empty ();
313+
314+ bool need_diff_expire = false ;
315+
343316 for (auto const &expire_config : m_expires) {
344317 assert (expire_config.expire_output < expire->size ());
345318 auto &expire_tiles = expire->at (expire_config.expire_output );
346319
347- if (!expire_config.diff_expire || !enable_diff_expire ||
348- geoms_old->empty () || geoms_new->empty ()) {
349- separate_expire (*geoms_old, expire_config, expire_tiles,
350- expire_outputs);
351- separate_expire (*geoms_new, expire_config, expire_tiles,
352- expire_outputs);
320+ if (!expire_config.diff_expire || always_separate) {
321+ for (auto const &geom : *geoms_old) {
322+ expire_tiles.from_geometry (geom, expire_config);
323+ }
324+ for (auto const &geom : *geoms_new) {
325+ expire_tiles.from_geometry (geom, expire_config);
326+ }
327+ expire_tiles.commit_tiles (
328+ &expire_outputs->at (expire_config.expire_output ));
353329 } else {
354- diff_expire (geoms_old, geoms_new, expire_config, expire_tiles,
355- expire_outputs);
330+ need_diff_expire = true ;
331+ }
332+ }
333+
334+ if (always_separate || !need_diff_expire) {
335+ return ;
336+ }
337+
338+ std::vector<geom::point_t > diff_points;
339+ std::vector<geom::linestring_t > diff_linestrings;
340+ std::vector<geom::polygon_t > diff_polygons;
341+
342+ find_difference (geoms_old, geoms_new, &diff_points, &diff_linestrings,
343+ &diff_polygons);
344+
345+ for (auto const &expire_config : m_expires) {
346+ assert (expire_config.expire_output < expire->size ());
347+ auto &expire_tiles = expire->at (expire_config.expire_output );
348+
349+ if (expire_config.diff_expire ) {
350+ for (auto const &geom : diff_points) {
351+ expire_tiles.from_geometry (geom, expire_config);
352+ }
353+ for (auto const &geom : diff_linestrings) {
354+ expire_tiles.from_geometry (geom, expire_config);
355+ }
356+ for (auto const &geom : diff_polygons) {
357+ expire_tiles.from_geometry (geom, expire_config);
358+ }
359+ expire_tiles.commit_tiles (
360+ &expire_outputs->at (expire_config.expire_output ));
356361 }
357362 }
358363}
0 commit comments