GenieFramework / GenieFramework/SearchLight.jl

SQLColumn table_name get lost when doing a join operation

Open
#69 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Julia
Stars
149
Forks
18
PR merge metrics
No merged PRs in 30d

Description

I was trying to do a join query and came across this bug, I'm doing someting like this:

```julia
on = SQLOn( SQLColumn("comments.user_id"), SQLColumn("users.id"))
j = Vector{SQLJoin}([
SQLJoin(Users.User, columns = [SQLColumn("users.name")], [on])
])
q = SQLQuery(where = [SQLWhereExpression("$(SQLColumn(:topic_id)) = ?", topic_id)], order = SQLOrder(:datetime, "DESC"))
DataFrame(Comments.Comment, q, j)
```

And I get an error telling me "comments.name" doesn't exists, while I asked for "users.name" in my query. The `table_name` is lost and replaced during the preparation of the query ([in `prepare_column_name`](https://github.com/GenieFramework/SearchLight.jl/blob/0b72060b09cf9764429d86c6957adf7124082a0e/src/SearchLight.jl#L681)).

The issue is that `table_name` that was already parsed in `SQLColumn` constructor is ignored here :

https://github.com/GenieFramework/SearchLight.jl/blob/0b72060b09cf9764429d86c6957adf7124082a0e/src/SearchLight.jl#L956

This fixes the issue, but seems a bit hacky. Not sure why we need to parse the column again, feels like that should be the job of the constructor.

```julia
@eval SearchLight begin

function prepare_column_name(column::SearchLight.SQLColumn, m::Type{T})::String where {T<:SearchLight.AbstractModel}
if column.raw
column.value |> string
else
column_data::Dict{Symbol,Any} = SearchLight.from_literal_column_name(column)
if ! haskey(column_data, :table_name)
column_data[:table_name] = SearchLight.table(m)
end
if ! haskey(column_data, :alias)
column_data[:alias] = ""
end

column_data_to_column_name(column, column_data)
end
end

function from_literal_column_name(column::SearchLight.SQLColumn)
c = column.value
result = Dict{Symbol,String}()
result[:original_string] = c
result[:table_name] = column.table_name

# has alias?
if occursin(" AS ", c)
parts = split(c, " AS ")
result[:column_name] = parts[1]
result[:alias] = parts[2]
else
result[:column_name] = c
end

# is fully qualified?
if occursin(".", result[:column_name])
parts = split(result[:column_name], ".")
result[:table_name] = parts[1]
result[:column_name] = parts[2]
end

result
end
end
```

SearchLightSQLite v2.2.1

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.