Skip to content
This repository has been archived by the owner on Oct 17, 2021. It is now read-only.

Commit

Permalink
Add delete! for redis and relational
Browse files Browse the repository at this point in the history
  • Loading branch information
lucianolorenti committed Feb 29, 2020
1 parent 3d59bda commit c13875b
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 6 deletions.
44 changes: 42 additions & 2 deletions src/NonRelational/Redis.jl
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,19 @@ function update!(mapper::DBMapper, ::Type{Redis.RedisConnection}, elem::T; field
result = Redis.hmset(conn, id, data)
release_connection(mapper.pool, conn)
end
function exists(mapper::DBMapper, dbtype::Type{Redis.RedisConnection}, T::Type{<:Model}; kwargs...)

function extract_id_from_kwargs(mapper::DBMapper, T::Type{<:Model}; kwargs...)
id_f = idfield(mapper, T)
params = Dict(kwargs...)
id = nothing
if haskey(params, id_f)
id = redis_id(T, pop!(params, id_f))
end
return (id, params)
end

function exists(mapper::DBMapper, dbtype::Type{Redis.RedisConnection}, T::Type{<:Model}; kwargs...)
(id, params) = extract_id_from_kwargs(mapper, T; kwargs...)
# Query with id
if id !== nothing
# Only id
Expand Down Expand Up @@ -104,4 +109,39 @@ function exists(mapper::DBMapper, dbtype::Type{Redis.RedisConnection}, T::Type{<
release_connection(mapper.pool, conn)
end
return false
end

function Base.delete!(mapper::DBMapper, ::Type{Redis.RedisConnection}, T::Type{<:Model}; kwargs...)
(id, params) = extract_id_from_kwargs(mapper, T; kwargs...)
if id !== nothing
if length(params) == 0
conn = get_connection(mapper.pool)
result = Redis.del(conn, id)
release_connection(mapper.pool, conn)
else
conn = get_connection(mapper.pool)
params_key = collect(keys(params))
elem_values = Redis.hmget(conn, id, params_key...)
release_connection(mapper.pool, conn)
elem = unmarshal(mapper, T, Dict(zip(params_key, elem_values)); partial=true)
if all([params[k] == elem[k] for k in params_key])
Redis.del(conn, id)
end
end
else
conn = get_connection(mapper.pool)
cursor = -1
params_key = collect(keys(params))
while cursor != 0
(cursor, results) = Redis.scan(conn, cursor == -1 ? 0 : cursor, "match", redis_wildcard(T))
for elem_key in results
elem_values = Redis.hmget(conn, elem_key, params_key...)
elem = unmarshal(mapper, T, Dict(zip(params_key, elem_values)); partial=true)
if all([params[k] == elem[k] for k in params_key])
Redis.del(conn, elem_key)
end
end
release_connection(mapper.pool, conn)
end
end
end
17 changes: 17 additions & 0 deletions src/Relational/Relational.jl
Original file line number Diff line number Diff line change
Expand Up @@ -247,3 +247,20 @@ function exists(mapper::DBMapper, dbtype::Type{Relational}, T::Type{<:Model}; kw
result = result |> totuple
return result[1][:count]
end

function Base.delete!(mapper::DBMapper, ::Type{Relational}, T::Type{<:Model}; kwargs...)
dbtype = mapper.pool.dbtype
table = mapper.tables[T]
cnames = join(column_names(mapper, T), ", ")
conditions = join(["$field=?" for (field, value) in kwargs], " AND ")
values = [v[2] for v in kwargs]
sql = clean_sql("""
DELETE FROM $(table.name)
WHERE $(conditions)
""")
@info sql
conn = get_connection(mapper.pool)
stmt = DBInterface.prepare(conn, sql)
DBInterface.execute(stmt, values)
release_connection(mapper.pool, conn)
end
20 changes: 17 additions & 3 deletions src/StructDatabaseMapping.jl
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
module StructDatabaseMapping
export select_one, update!, delete!, drop_table!, clean_table!,
update!, exists

export DBMapper, register!, create_table, DBId,
Nullable, analyze_relations, ForeignKey, select_one,
clean_table!, drop_table!, Model, getid, Foreign,
update!, exists, Cascade, SetNull, configure_relation,
Nullable, analyze_relations, ForeignKey, Model, getid, Foreign,
Cascade, SetNull, configure_relation,
Restrict

using Dates
Expand Down Expand Up @@ -440,6 +442,18 @@ function exists(mapper::DBMapper, dbtype::DataType, T::Type{<:Model}; kwargs...)
exists(mapper, database_kind(dbtype), T; kwargs...)
end

"""
function delete_one!(mapper::DBMapper, T::Type{<:Model}; kwargs...)
Select one element of type
"""
function Base.delete!(mapper::DBMapper, T::Type{<:Model}; kwargs...)
check_valid_type(mapper, T)
return delete!(mapper, mapper.pool.dbtype, T; kwargs...)
end
function Base.delete!(mapper::DBMapper, dbtype::DataType, T::Type{<:Model}; kwargs...)
return delete!(mapper, database_kind(dbtype), T; kwargs...)
end


"""
Expand Down
36 changes: 35 additions & 1 deletion test/includes/basic_test.jl
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,31 @@ function Book(;id::Union{String, Nothing}=nothing,
author::Foreign{Author}=Author(),
data::Dict{String, Integer}=Dict())
return Book(id, author, data)
end

function _test_on_delete()
mapper = DBMapper(creator)
register!(mapper, Author)
register!(mapper, Book)
configure_relation(mapper, Book, :author, on_delete=Cascade())

author = Author(name="Author 1", age=50)
insert!(mapper, Author(name="Author 1", age=50))
insert!(mapper, Author(name="Author 2", age=50))
insert!(mapper, Author(name="Author 3", age=50))
insert!(mapper, Author(name="Author 4", age=50))

author1 = select_one(mapper, Author, name="Author 1")
author3 = select_one(mapper, Author, name="Author 3")

insert!(mapper, Book(author=author1, data=Dict("key"=>"Some 1")))
insert!(mapper, Book(author=author1, data=Dict("key"=>"Some 2")))
insert!(mapper, Book(author=author1, data=Dict("key"=>"Some 3")))

insert!(mapper, Book(author=author3, data=Dict("key"=>"Some 3")))



end
function _test_basic_functionalities(creator)
mapper = DBMapper(creator)
Expand Down Expand Up @@ -82,10 +107,19 @@ function _test_basic_functionalities(creator)
a = select_one(mapper, Book, id="bbb")
@test isnothing(a)
a = select_one(mapper, Book, id="super_string_id")

@test a.id.x == "super_string_id"
@test get(a.author, mapper).name == "some_other_name"
@test a.data["some_data"] == 5

author = select_one(mapper, Author, id=id)
@test author.name == "some_other_name"
@test author.age == 5
delete!(mapper, Author, name="some_other_name")
author = select_one(mapper, Author, id=id)
@test isnothing(author)





Expand Down

0 comments on commit c13875b

Please sign in to comment.