Skip to content

Commit

Permalink
Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
frodrigo committed May 17, 2024
1 parent 489e89a commit 34c9f1e
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 29 deletions.
30 changes: 17 additions & 13 deletions lib/overpass_parser/nodes/filters.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,26 +23,30 @@ class Filter < T::Struct
const :area_id, T.nilable(String)
const :around, T.nilable(FilterAround)

def bbox_clauses(sql_dialect)
"#{sql_dialect.st_intersects_extent}(" \
"ST_Envelope('SRID=4326;LINESTRING(" \
"#{T.must(bbox)[1]} #{T.must(bbox)[0]}, " \
"#{T.must(bbox)[3]} #{T.must(bbox)[2]}" \
")'::geometry), geom)"
end

def poly_clauses(sql_dialect)
coords = T.must(poly).collect do |lat, lon|
"#{lon} #{lat}"
end.join(', ')
"#{sql_dialect.st_intersects}('SRID=4326;POLYGON(#{coords})'::geometry, geom)"
end

sig do
params(
sql_dialect: SqlDialect::SqlDialect
).returns(T.nilable(String))
end
def to_sql(sql_dialect)
clauses = []
unless bbox.nil?
clauses << "#{sql_dialect.st_intersects_extent}(" \
"ST_Envelope('SRID=4326;LINESTRING(" \
"#{T.must(bbox)[1]} #{T.must(bbox)[0]}, " \
"#{T.must(bbox)[3]} #{T.must(bbox)[2]}" \
")'::geometry), geom)"
end
unless poly.nil?
coords = T.must(poly).collect do |lat, lon|
"#{lon} #{lat}"
end.join(', ')
clauses << "#{sql_dialect.st_intersects}('SRID=4326;POLYGON(#{coords})'::geometry, geom)"
end
clauses << bbox_clauses(sql_dialect) unless bbox.nil?
clauses << poly_clauses(sql_dialect) unless poly.nil?
clauses << "id = ANY (ARRAY[#{ids&.collect(&:to_s)&.join(', ')}])" unless ids.nil?
clauses << "ST_Intersects(geom, (SELECT #{sql_dialect.st_union}(geom) FROM _#{area_id}))" unless area_id.nil?
unless around.nil?
Expand Down
34 changes: 18 additions & 16 deletions lib/overpass_parser/visitor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -119,12 +119,7 @@ def visit_filter(ctx)
visit_children(ctx)
r = Nodes::Filter.new(
bbox: ctx.filter_bbox&.number&.collect(&:text)&.collect(&:to_f),
poly: (
if !ctx&.filter_poly&.SIMPLE_QUOTED_STRING.nil?
ctx.filter_poly.SIMPLE_QUOTED_STRING.text[1..-2].gsub("\\'", "'")
elsif !ctx&.filter_poly&.DOUBLE_QUOTED_STRING.nil?
ctx.filter_poly.DOUBLE_QUOTED_STRING.text[1..-2].gsub('\\"', '"')
end)&.split(/\s+/)&.collect(&:to_f)&.each_slice(2)&.to_a,
poly: split_poly_ccords(ctx.filter_poly),
ids: (
ctx.filter_osm_id.nil? ? ctx.filter_osm_ids&.osm_id : [ctx.filter_osm_id])
&.collect(&:text)&.collect(&:to_i),
Expand All @@ -139,16 +134,23 @@ def visit_filter(ctx)

def visit_token(ctx)
visit_children(ctx)
text = (
if !ctx.SIMPLE_QUOTED_STRING.nil?
ctx.text[1..-2].gsub("\\'", "'")
elsif !ctx.DOUBLE_QUOTED_STRING.nil?
ctx.text[1..-2].gsub('\\"', '"')
else
(ctx.UNQUOTED_STRING || ctx.number).text
end
)
@stack.push(text)
@stack.push(unquote(ctx) || (ctx.UNQUOTED_STRING || ctx.number).text)
end

private

def unquote(ctx)
if !ctx.SIMPLE_QUOTED_STRING.nil?
ctx.SIMPLE_QUOTED_STRING.text[1..-2].gsub("\\'", "'")
elsif !ctx.DOUBLE_QUOTED_STRING.nil?
ctx.DOUBLE_QUOTED_STRING.text[1..-2].gsub('\\"', '"')
end
end

def split_poly_ccords(ctx)
return nil if ctx.nil?

unquote(ctx).split(/\s+/).collect(&:to_f).each_slice(2).to_a
end
end
end

0 comments on commit 34c9f1e

Please sign in to comment.