defmodule Ravix.Documents.Commands.ExecuteQueryCommand do
@moduledoc """
Command to execute a queryy on RavenDB
## Fields
- Query: the RQL to be executed
- QueryParameters: The query parameters
"""
@derive {Jason.Encoder, only: [:Query, :QueryParameters]}
use Ravix.Documents.Commands.RavenCommand,
Query: nil,
QueryParameters: %{},
query_hash: nil
import Ravix.Documents.Commands.RavenCommand
alias Ravix.Documents.Commands.ExecuteQueryCommand
alias Ravix.Documents.Protocols.{ToJson, CreateRequest}
alias Ravix.Connection.ServerNode
command_type(%{
Query: String.t(),
QueryParameters: map()
})
def hash_query(%ExecuteQueryCommand{Query: query, QueryParameters: query_params}) do
joined_params = Map.values(query_params) |> Enum.join()
:crypto.hash(:sha256, query <> joined_params) |> Base.encode64()
end
defimpl CreateRequest, for: ExecuteQueryCommand do
@spec create_request(ExecuteQueryCommand.t(), ServerNode.t()) :: ExecuteQueryCommand.t()
def create_request(%ExecuteQueryCommand{} = command, %ServerNode{} = server_node) do
url = server_node |> ServerNode.node_database_path()
%ExecuteQueryCommand{
command
| url: url <> "/queries",
data: fix_body(command)
}
end
defp fix_body(command) do
case command.method do
:patch -> %{Query: command} |> ToJson.to_json()
_ -> command |> ToJson.to_json()
end
end
end
end