-
Notifications
You must be signed in to change notification settings - Fork 25k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SQL: Switch JDBC driver to libs/geo objects for geo_shapes #39204
Conversation
Switches JDBC driver to use libs/geo objects when server returns a geo_shape. This PR doesn't address the geo_points yet, which will be addressed in a separate PR.
Pinging @elastic/es-analytics-geo |
Pinging @elastic/es-search |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Left a minor comment.
@@ -269,11 +268,11 @@ else if (type == Types.DOUBLE) { | |||
} else if (type == Types.FLOAT) { | |||
assertEquals(msg, (float) expectedObject, (float) actualObject, lenientFloatingNumbers ? 1f : 0.0f); | |||
} else if (type == Types.OTHER) { | |||
if (expectedObject instanceof Geometry && actualObject instanceof String) { | |||
if (actualObject instanceof org.elasticsearch.geo.geometry.Geometry) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please import to avoid the qualifier.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bpintea can you please advice what type the ODBC driver indicates (if at all) for geo?
Own update: it looks like both geometry and geography are mapped to -151
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bpintea can you please advice what type the ODBC driver indicates (if at all) for geo?
Own update: it looks like both geometry and geography are mapped to
-151
.
@costin There isn't any specification on how the geo types should be conveyed in ODBC. Most DBMSes use private types/extensions (like MS SQL's "user defined" -151). WKT/B seems to have most support (also among some BI tools and Excel plug-ins), with GeoJSON picking up as well.
An idea would be to apply the same logic as with KEYWORD
, TEXT
and IP
: give the new geography/geometry types respective names, but reuse a character (12
) or the binary (-3
) type.
Since Geo is not part of the ODBC standard, no 3rd party existing app could "out of the box" make use of whatever data types we'll implement. OTOH, the values encoding (WKT/B) could be used.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
@@ -269,11 +268,11 @@ else if (type == Types.DOUBLE) { | |||
} else if (type == Types.FLOAT) { | |||
assertEquals(msg, (float) expectedObject, (float) actualObject, lenientFloatingNumbers ? 1f : 0.0f); | |||
} else if (type == Types.OTHER) { | |||
if (expectedObject instanceof Geometry && actualObject instanceof String) { | |||
if (actualObject instanceof org.elasticsearch.geo.geometry.Geometry) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bpintea can you please advice what type the ODBC driver indicates (if at all) for geo?
Own update: it looks like both geometry and geography are mapped to -151
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Left some minor comments.
@@ -269,11 +268,11 @@ else if (type == Types.DOUBLE) { | |||
} else if (type == Types.FLOAT) { | |||
assertEquals(msg, (float) expectedObject, (float) actualObject, lenientFloatingNumbers ? 1f : 0.0f); | |||
} else if (type == Types.OTHER) { | |||
if (expectedObject instanceof Geometry && actualObject instanceof String) { | |||
if (actualObject instanceof org.elasticsearch.geo.geometry.Geometry) { | |||
// We need to convert the actual object to Geometry for comparision |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here your comment mentions the actual object needing conversion, but two lines below you perform the operation for the "expected" value instead. Shouldn't be the "actual" one conversion attempt?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The comment is leftover from the previous implementation. Before we had string in actual and JTS Geometry in expected. With this change I am trying to reduce dependency on JTS and H2 in this code, so instead of converting everything to H2's JTS Geometry I am converting it to our geometry. I will update the comment. Good catch!
}); | ||
|
||
@ParametersFactory(argumentFormatting = PARAM_FORMATTING) | ||
public static List<Object[]> readScriptSpec() throws Exception { | ||
Parser parser = new SqlSpecParser(); | ||
List<Object[]> tests = new ArrayList<>(); | ||
tests.addAll(readScriptSpec("/geo/geosql.sql-spec", parser)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Picky comment: can you put the geo script file addition after "ogc"? (this is the order in the other two changes in this class - line 37 and line 56)
selectRegionUsingWktToSqlWithoutConvertion | ||
SELECT region, city, shape, ST_GEOMFROMTEXT(region_point) region_wkt FROM geo ORDER BY region, city; | ||
|
||
// TODO: the ordering of geometries differs so ORDER BY needs to be wrapped into string for now |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would create an issue for this TODO, just not to lose track of it. If there is one already, apologies.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like order of the elements is not defined by the standard. So, I will order by something else in this test and remove the TODO.
|
||
// TODO: the ordering of geometries differs so ORDER BY needs to be wrapped into string for now | ||
selectCitiesWithAGroupByWktToSql | ||
SELECT COUNT(city) city_by_region, ST_GEOMFROMTEXT(region_point) region FROM geo WHERE city LIKE '%a%' GROUP BY ST_GEOMFROMTEXT(region_point) ORDER BY ST_ASWKT(ST_GEOMFROMTEXT(region_point)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would add a test with a group by alias: SELECT COUNT(city) city_by_region, ST_GEOMFROMTEXT(region_point) region FROM geo GROUP BY region
.
SELECT COUNT(city) city_by_region, ST_GEOMFROMTEXT(region_point) region FROM geo WHERE city LIKE '%a%' GROUP BY ST_GEOMFROMTEXT(region_point) ORDER BY ST_ASWKT(ST_GEOMFROMTEXT(region_point)); | ||
|
||
selectCitiesWithEOrderByWktToSql | ||
SELECT region, city FROM geo WHERE city LIKE '%e%' ORDER BY ST_ASWKT(ST_GEOMFROMTEXT(region_point)), city; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same as above - a query with ORDER BY aliased geo function.
"region" VARCHAR(50), | ||
"region_point" VARCHAR(50), | ||
"shape" GEOMETRY | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove empty line?
Switches JDBC driver to use libs/geo objects when server returns a
geo_shape. This PR doesn't address the geo_points yet, which will be
addressed in a separate PR.