@@ -154,3 +154,95 @@ class MockRecord:
154154 invalid_geojson = json .dumps ({"invalid" : "data" })
155155 with self .assertRaises (ValidationError ):
156156 field .convert_to_column (invalid_geojson , MockRecord (), validate = True )
157+
158+
159+ class TestOperatorTableAlias (TransactionCase ):
160+ """Test that the Operator generates table-qualified column names in SQL."""
161+
162+ @classmethod
163+ def setUpClass (cls ):
164+ super ().setUpClass ()
165+ cls .env = cls .env (
166+ context = dict (
167+ cls .env .context ,
168+ test_queue_job_no_delay = True ,
169+ )
170+ )
171+
172+ def _make_field (self , name = "geo_polygon" , srid = 4326 ):
173+ """Create a mock field for the Operator."""
174+ from odoo .addons .spp_gis .fields import GeoPolygonField
175+
176+ field = GeoPolygonField ()
177+ field .name = name
178+ field .srid = srid
179+ return field
180+
181+ def test_operator_without_alias_uses_bare_field_name (self ):
182+ """Operator without table_alias uses bare field name (backward compat)."""
183+ from odoo .addons .spp_gis .operators import Operator
184+
185+ field = self ._make_field ()
186+ operator = Operator (field )
187+ self .assertEqual (operator .qualified_field_name , "geo_polygon" )
188+
189+ def test_operator_with_alias_qualifies_field_name (self ):
190+ """Operator with table_alias generates table-qualified column reference."""
191+ from odoo .addons .spp_gis .operators import Operator
192+
193+ field = self ._make_field ()
194+ operator = Operator (field , table_alias = "spp_area" )
195+ self .assertEqual (operator .qualified_field_name , '"spp_area"."geo_polygon"' )
196+
197+ def test_domain_query_with_alias_uses_qualified_name (self ):
198+ """domain_query generates SQL with table-qualified column names."""
199+ from odoo .addons .spp_gis .operators import Operator
200+
201+ field = self ._make_field ()
202+ operator = Operator (field , table_alias = "spp_area" )
203+
204+ geojson = {
205+ "type" : "Polygon" ,
206+ "coordinates" : [[[0 , 0 ], [1 , 0 ], [1 , 1 ], [0 , 1 ], [0 , 0 ]]],
207+ }
208+
209+ result = operator .domain_query ("gis_intersects" , geojson )
210+ sql_string = str (result )
211+
212+ self .assertIn ("ST_Intersects" , sql_string )
213+ self .assertIn ('"spp_area"."geo_polygon"' , sql_string )
214+ self .assertNotRegex (sql_string , r'(?<!")\bgeo_polygon\b(?!")' )
215+
216+ def test_domain_query_without_alias_uses_bare_name (self ):
217+ """domain_query without alias uses bare field name for backward compat."""
218+ from odoo .addons .spp_gis .operators import Operator
219+
220+ field = self ._make_field ()
221+ operator = Operator (field )
222+
223+ geojson = {
224+ "type" : "Polygon" ,
225+ "coordinates" : [[[0 , 0 ], [1 , 0 ], [1 , 1 ], [0 , 1 ], [0 , 0 ]]],
226+ }
227+
228+ result = operator .domain_query ("gis_intersects" , geojson )
229+ sql_string = str (result )
230+
231+ self .assertIn ("ST_Intersects" , sql_string )
232+ self .assertIn ("geo_polygon" , sql_string )
233+
234+ def test_get_postgis_query_with_alias_and_distance (self ):
235+ """get_postgis_query with distance also uses qualified field name."""
236+ from odoo .addons .spp_gis .operators import Operator
237+
238+ field = self ._make_field ()
239+ operator = Operator (field , table_alias = "spp_area" )
240+
241+ result = operator .get_postgis_query (
242+ operation = "intersects" ,
243+ coordinates = [79.86 , 6.93 ],
244+ distance = 1000 ,
245+ layer_type = "point" ,
246+ )
247+
248+ self .assertIn ('"spp_area"."geo_polygon"' , result )
0 commit comments