Skip to content

Commit 2c52fd4

Browse files
committed
Refactor parameter handling in add_parameter! function and update delete_objects and update_field functions to use parameters correctly; add tests for filtering with 'nin' operator.
1 parent b7e56b8 commit 2c52fd4

2 files changed

Lines changed: 32 additions & 21 deletions

File tree

src/QueryBuilder.jl

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,17 @@ end
8989
get_parameter(connection::PormGPostgres) = PgParameterizedQuery("", Any[], 0)
9090

9191
function add_parameter!(pq::PormGPostgresParam, value::AbstractArray; contains::Bool = false)
92-
parameters::Vector{String} = String[]
93-
for v in value
94-
pq.parameter_count += 1
95-
push!(pq.parameters, v)
96-
push!(parameters, "\$$(pq.parameter_count)")
97-
end
98-
return parameters
92+
# parameters::Vector{String} = String[]
93+
# for v in value
94+
# pq.parameter_count += 1
95+
# push!(pq.parameters, v)
96+
# push!(parameters, "\$$(pq.parameter_count)")
97+
# end
98+
contains && (throw(ArgumentError("Contains option is not supported for array parameters")))
99+
pq.parameter_count += 1
100+
push!(pq.parameters, value)
101+
# push!(pq.parameters, "ANY(\$$(pq.parameter_count))")
102+
return "\$$(pq.parameter_count)"
99103
end
100104
function add_parameter!(pq::PormGPostgresParam, value; contains::Bool = false)::String
101105
contains && (value = string("%", value |> escape_like_pattern, "%")) # Escape LIKE patterns if needed
@@ -1613,7 +1617,7 @@ function _get_filter_query(v::SQLTypeOper, instruc::SQLInstruction)
16131617
return string(column, " ", v.operator, " ", placeholders)
16141618
elseif v.operator in ["in", "not in"]
16151619
if isa(placeholders, String)
1616-
return string(column, " ", v.operator, " (", placeholders, ")")
1620+
return string(column, " ", v.operator == "in" ? "= ANY" : "<> ALL", "(", placeholders, ")")
16171621
elseif isa(placeholders, AbstractArray)
16181622
return string(column, " ", v.operator, " (", join(placeholders, ", "), ")")
16191623
else
@@ -2268,7 +2272,7 @@ function update(objct::SQLObject; table_alias::Union{Nothing, SQLTableAlias} = n
22682272
"""
22692273
end
22702274

2271-
@info sql
2275+
# @info sql
22722276

22732277
@infiltrate false
22742278

@@ -2468,9 +2472,10 @@ function bulk_insert(objct::SQLObjectHandler, df_o::DataFrames.DataFrame;
24682472
for (index, row) in enumerate(eachrow(df))
24692473
values = String[]
24702474
try
2471-
values = [model.fields[field].formater(row[field]) for field in fields_df]
2472-
param_placeholders = add_parameter!(parameters, values)
2475+
param_placeholders = [add_parameter!(parameters, model.fields[field].formater(row[field])) for field in fields_df]
2476+
# param_placeholders = add_parameter!(parameters, values)
24732477
catch e
2478+
@infiltrate false
24742479
_depuration_values_bulk_insert(fields_df, model, row, index, django_prefix)
24752480
throw("Error in bulk_update, the row $(index) has a problem: $(e)")
24762481
end
@@ -2761,8 +2766,8 @@ function _bulk_update(objct::SQLObjectHandler, df::DataFrames.DataFrame,
27612766
for (index, row) in enumerate(eachrow(df))
27622767
values = String[]
27632768
try
2764-
values = [model.fields[field].formater(row[field]) for field in joined_columns]
2765-
param_placeholders = add_parameter!(instruction.parameters, values)
2769+
param_placeholders = [add_parameter!(instruction.parameters, model.fields[field].formater(row[field])) for field in joined_columns]
2770+
# param_placeholders = add_parameter!(instruction.parameters, values)
27662771
catch e
27672772
_depuration_values_bulk_insert(fields_df, model, row, index, settings.django_prefix !== nothing)
27682773
throw("Error in bulk_update, the row $(index) has a problem: $(e)")
@@ -2971,7 +2976,7 @@ function delete(objct::SQLObjectHandler;
29712976

29722977
# Process field updates (for SET_NULL, SET_DEFAULT, etc.)
29732978
for ((field, value), affected_models) in collector.field_updates
2974-
@infiltrate
2979+
@infiltrate false
29752980
for (affected_model, keys) in affected_models
29762981
update_field(connection, affected_model, field, value, keys, show_query, conn)
29772982
end
@@ -3220,10 +3225,11 @@ function delete_objects(connection::Union{PormGPostgres, SQLite.DB}, model::Porm
32203225
@infiltrate false
32213226
# Execute the actual deletion SQL
32223227
_where = String[]
3228+
parameters = get_parameter(connection)
32233229
# @info keys[1][:objct] |> query
32243230
for key in keys
32253231
pk_field = key[:key]
3226-
push!(_where, """"$(pk_field)" IN ($(key[:objct] |> query))""")
3232+
push!(_where, """"$(pk_field)" IN ($(query(key[:objct], parameters=parameters)))""")
32273233
end
32283234
sql::String = ""
32293235
if size(keys, 1) == 1
@@ -3244,7 +3250,7 @@ function delete_objects(connection::Union{PormGPostgres, SQLite.DB}, model::Porm
32443250
deleted_counter[model.name] = _query |> do_count
32453251
_query.values(pk_field) # Ensure the query is built
32463252
@infiltrate false
3247-
sql = "DELETE FROM $(model.name |> lowercase) WHERE $(pk_field) IN ($(_query |> query))"
3253+
sql = "DELETE FROM $(model.name |> lowercase) WHERE $(pk_field) IN ($(query(_query, parameters=parameters)))"
32483254
end
32493255

32503256
sql == "" && throw("Error in delete, the SQL query is empty, this should not happen")
@@ -3253,23 +3259,25 @@ function delete_objects(connection::Union{PormGPostgres, SQLite.DB}, model::Porm
32533259
@info sql
32543260
return deleted_counter # Return count of deleted objects
32553261
end
3256-
result, conn = with_transaction(connection, sql, conn=conn)
3262+
@infiltrate false
3263+
result, conn = with_transaction(connection, sql, conn=conn, params=parameters)
32573264
return deleted_counter # Return count of deleted objects
32583265
end
32593266

32603267
function update_field(connection::PormGPostgres, model::PormGModel, field::String, value::Any, keys::Dict{Symbol, Union{String, SQLObjectHandler}}, show_query::Bool, conn::Union{Nothing, LibPQ.Connection})
32613268
# Update field values using query object like CASCADE
3262-
@infiltrate
3269+
@infiltrate false
32633270
pk_field = keys[:key]
32643271
_query = keys[:objct]
3272+
parameters = get_parameter(connection)
32653273
value_sql = value === nothing ? "NULL" : model.fields[field].formater(value)
3266-
sql = "UPDATE $(model.name |> lowercase) SET $(field) = $(value_sql) WHERE $(pk_field) IN ($(_query |> query))"
3274+
sql = "UPDATE $(model.name |> lowercase) SET $(field) = $(value_sql) WHERE $(pk_field) IN ($(query(_query, parameters=parameters)))"
32673275
if show_query
32683276
@info sql
32693277
return
32703278
end
3271-
LibPQ.execute(connection, sql)
3272-
with_transaction(connection, sql, conn=conn)
3279+
# LibPQ.execute(connection, sql)
3280+
with_transaction(connection, sql, conn=conn, params=parameters)
32733281
end
32743282

32753283

test/pg/test.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ end
233233
query = M.Result |> object;
234234
query.filter("raceid__circuitid__name__@in" => ["Circuit de Monaco", "monaco"]);
235235
@test query |> do_count == 1664
236+
query = M.Result |> object;
237+
query.filter("raceid__circuitid__name__@nin" => ["Circuit de Monaco", "monaco"]);
238+
@test query |> do_count == 25095
236239
end
237240

238241
@testset "Date Operations" begin

0 commit comments

Comments
 (0)