connection->getQueryBuilder(); $query->delete('memories_places') ->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT))) ; $query->executeStatement(); // Just remove from if the point is no longer valid if (null === $lat || null === $lon) { return; } // Construct WHERE clause depending on GIS type $where = null; if (1 === $gisType) { $where = "ST_Contains(geometry, ST_GeomFromText('POINT({$lon} {$lat})'))"; } elseif (2 === $gisType) { $where = "POINT('{$lon},{$lat}') <@ geometry"; } else { return; } // Make query to memories_planet table $query = $this->connection->getQueryBuilder(); $query->select($query->createFunction('DISTINCT(osm_id)')) ->from('memories_planet_geometry') ->where($query->createFunction($where)) ; // Cancel out inner rings $query->groupBy('poly_id', 'osm_id'); $query->having($query->createFunction('SUM(type_id) > 0')); // memories_planet_geometry has no *PREFIX* $sql = str_replace('*PREFIX*memories_planet_geometry', 'memories_planet_geometry', $query->getSQL()); // Run query $result = $this->connection->executeQuery($sql); $rows = $result->fetchAll(); // Insert records foreach ($rows as $row) { $query = $this->connection->getQueryBuilder(); $query->insert('memories_places') ->values([ 'fileid' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT), 'osm_id' => $query->createNamedParameter($row['osm_id'], IQueryBuilder::PARAM_INT), ]) ; $query->executeStatement(); } } }