@@ -52,7 +52,6 @@ def build_jsonpath(field_path: str, operator: str, value: str) -> str:
5252 Returns:
5353 PostgreSQL jsonpath query string
5454 """
55-
5655 # Handle regular field queries
5756 cast_val , is_numeric = determine_value_type (value )
5857
@@ -83,35 +82,35 @@ def build_jsonpath(field_path: str, operator: str, value: str) -> str:
8382 raw_value = f'"{ cast_val } "'
8483 raw_value = f"@ { sql_op } { raw_value } "
8584
86- # Check if we're querying an array field
85+ # Check if we're querying array fields
8786 path_parts = field_path .split ("." )
8887 if any (p .endswith ("[]" ) for p in path_parts ):
89- # Handle array field queries
88+ query = "$"
9089 path_segments = []
91- for i , part in enumerate (path_parts ):
90+
91+ for part in path_parts :
9292 if part .endswith ("[]" ):
93- # Convert path up to this point into the base path
94- base_path = "." .join (path_segments )
93+ # When we hit an array, add previous path segments if any
94+ if path_segments :
95+ query += "." + "." .join (path_segments )
96+ path_segments = []
97+ # Add the array access
9598 array_field = part [:- 2 ]
96- remaining_path = "." .join (path_parts [i + 1 :])
97-
98- if remaining_path :
99- full_path = (
100- f"{ base_path } .{ array_field } " if base_path else array_field
101- )
102- return f"$.{ full_path } [*] ? ({ raw_value } )" .replace (
103- "@" , f"@.{ remaining_path } "
104- )
105- else :
106- full_path = (
107- f"{ base_path } .{ array_field } " if base_path else array_field
108- )
109- return f"$.{ full_path } [*] ? ({ raw_value } )"
99+ query += f".{ array_field } [*]"
110100 else :
111101 path_segments .append (part )
112- else :
113- # Regular field query
114- return f"$.{ field_path } ? ({ raw_value } )"
102+
103+ # Add any remaining path segments
104+ if path_segments :
105+ query += "." + "." .join (path_segments )
106+
107+ # Add the filter condition
108+ query += f" ? ({ raw_value } )"
109+
110+ return query
111+
112+ # Regular field query
113+ return f"$.{ field_path } ? ({ raw_value } )"
115114
116115
117116def validate_pipeline_name (pipeline_name : str ) -> None :
@@ -185,11 +184,6 @@ def parse_json_filter(filter_str: str) -> tuple:
185184 pipeline_name , field_spec = parts
186185 validate_pipeline_name (pipeline_name )
187186
188- # Match array queries first
189- # array_match = re.match(r"(.+?)\[\]=(.+)", field_spec)
190- # if array_match:
191- # return pipeline_name, array_match.group(1), "[]", array_match.group(2)
192-
193187 # Then match regular field queries
194188 match = re .match (r"(.+?)(~|=|>=|<=|>|<)(.+)" , field_spec )
195189 if not match :
0 commit comments