diff --git a/lib/diplomat/entity.ex b/lib/diplomat/entity.ex index ba96f15..ac9f3a0 100644 --- a/lib/diplomat/entity.ex +++ b/lib/diplomat/entity.ex @@ -172,7 +172,7 @@ defmodule Diplomat.Entity do end # at some point we should validate the entity keys - @spec upsert([t] | t) :: {:ok, CommitResponse.t()} | Client.error() + @spec upsert([t] | t) :: CommitResponse.t() | Client.error() def upsert(%Entity{} = entity), do: upsert([entity]) def upsert(entities) when is_list(entities) do diff --git a/lib/diplomat/query.ex b/lib/diplomat/query.ex index 76adc11..6667005 100644 --- a/lib/diplomat/query.ex +++ b/lib/diplomat/query.ex @@ -47,7 +47,7 @@ defmodule Diplomat.Query do RunQueryRequest.new( query_type: {:gql_query, q |> Query.proto()}, - partition_id: PartitionId.new(namespace_id: namespace, proejct_id: project) + partition_id: %PartitionId{namespace_id: namespace, project_id: project} ) |> Diplomat.Client.run_query() end diff --git a/lib/diplomat/transaction.ex b/lib/diplomat/transaction.ex index 1bfe306..48c1f87 100644 --- a/lib/diplomat/transaction.ex +++ b/lib/diplomat/transaction.ex @@ -29,10 +29,12 @@ defmodule Diplomat.Transaction do RollbackRequest, RollbackResponse, LookupRequest, - ReadOptions + ReadOptions, + RunQueryRequest, + PartitionId } - alias Diplomat.{Transaction, Entity, Key, Client} + alias Diplomat.{Transaction, Entity, Key, Client, Query} @type t :: %__MODULE__{ id: integer, @@ -108,6 +110,18 @@ defmodule Diplomat.Transaction do find(transaction, [key]) end + @spec execute(Transaction.t(), Query.t(), String.t() | nil) :: list(Entity.t()) | Client.error() + def execute(%Transaction{id: id}, %Query{} = q, namespace \\ nil) do + {:ok, project} = Goth.Config.get(:project_id) + + RunQueryRequest.new( + query_type: {:gql_query, q |> Query.proto()}, + partition_id: %PartitionId{namespace_id: namespace, project_id: project}, + read_options: %ReadOptions{consistency_type: {:transaction, id}} + ) + |> Diplomat.Client.run_query() + end + # we could clean this up with some macros @spec insert(t, Entity.t() | [Entity.t()]) :: t def insert(%Transaction{} = t, %Entity{} = e), do: insert(t, [e])