defmodule Noizu.Weaviate.Api.Objects do
@moduledoc """
Functions for interacting with data objects in Weaviate.
"""
require Noizu.Weaviate
import Noizu.Weaviate
def query(query, options \\ nil) do
url = api_base() <> "v1/graphql"
# decoder = options[:decoder] || (case query do
# %{class: class} when is_atom(class) -> class
# _ -> :json
# end)
api_call(:post, url, query, :json, options)
end
def list(class, options \\ nil) do
class_name = case class do
%{meta: %{class: class}} -> class
v when is_bitstring(class) -> class
end
decoder = options[:decoder] || Noizu.Weaviate.Class.Protocol.decoder(class, options)
query_params =
[]
|> then(& [{"class", class_name}| &1])
|> then(& options[:limit] && [{"limit", options[:limit]}| &1] || &1)
|> then(& options[:offset] && [{"offset", options[:offset]}| &1] || &1)
|> then(& options[:after] && [{"after", options[:after]}| &1] || &1)
|> then(& options[:include] && [{"include", options[:include]}| &1] || &1)
|> then(& options[:sort] && [{"sort", options[:sort]}| &1] || &1)
|> then(& options[:order] && [{"order", options[:order]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
url = api_base() <> "v1/objects#{query_params && "?" <> query_params || ""}"
api_call(:get, url, nil, decoder, options)
end
def exists?(object, options \\ nil) do
query_params =
[]
|> then(& options[:consistency_level] && [{"consistency_level", options[:consistency_level]}| &1] || &1)
|> then(& options[:tenant] && [{"tenant", options[:tenant]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
decoder = options[:decoder] || Noizu.Weaviate.Class.Protocol.decoder(object, options)
class = Noizu.Weaviate.Class.Protocol.class(object, options)
id = Noizu.Weaviate.Class.Protocol.id(object, options)
url = api_base() <> "v1/objects/#{class}/#{id}#{query_params && "?" <> query_params || ""}"
api_call(:head, url, nil, decoder, options)
end
def validate?(object, options \\ nil) do
query_params =
[]
|> then(& options[:consistency_level] && [{"consistency_level", options[:consistency_level]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
url = api_base() <> "v1/objects/validate#{query_params && "?" <> query_params || ""}"
decoder = options[:decoder] || Noizu.Weaviate.Class.Protocol.decoder(object, options)
api_call(:post, url, object, decoder, options)
end
def create(object, options \\ nil) do
query_params =
[]
|> then(& options[:consistency_level] && [{"consistency_level", options[:consistency_level]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
url = api_base() <> "v1/objects#{query_params && "?" <> query_params || ""}"
decoder = options[:decoder] || Noizu.Weaviate.Class.Protocol.decoder(object, options)
api_call(:post, url, object, decoder, options)
end
def get(object, options \\ nil) do
query_params =
[]
|> then(& options[:consistency_level] && [{"consistency_level", options[:consistency_level]}| &1] || &1)
|> then(& options[:tenant] && [{"tenant", options[:tenant]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
decoder = options[:decoder] || Noizu.Weaviate.Class.Protocol.decoder(object, options)
class = Noizu.Weaviate.Class.Protocol.class(object, options)
id = Noizu.Weaviate.Class.Protocol.id(object, options)
url = api_base() <> "v1/objects/#{class}/#{id}#{query_params && "?" <> query_params || ""}"
api_call(:get, url, nil, decoder, options)
end
def get(class, object, options) when is_bitstring(class) and is_bitstring(object) do
query_params =
[]
|> then(& options[:consistency_level] && [{"consistency_level", options[:consistency_level]}| &1] || &1)
|> then(& options[:tenant] && [{"tenant", options[:tenant]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
url = api_base() <> "v1/objects/#{class}/#{object}#{query_params && "?" <> query_params || ""}"
decoder = options[:decoder] || :json
api_call(:get, url, nil, decoder, options)
end
def update(object, options \\ nil) do
query_params =
[]
|> then(& options[:consistency_level] && [{"consistency_level", options[:consistency_level]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
decoder = options[:decoder] || Noizu.Weaviate.Class.Protocol.decoder(object, options)
class = Noizu.Weaviate.Class.Protocol.class(object, options)
id = Noizu.Weaviate.Class.Protocol.id(object, options)
url = api_base() <> "v1/objects/#{class}/#{id}#{query_params && "?" <> query_params || ""}"
api_call(:put, url, object, decoder, options)
end
def patch(object, options \\ nil) do
query_params =
[]
|> then(& options[:consistency_level] && [{"consistency_level", options[:consistency_level]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
decoder = options[:decoder] || Noizu.Weaviate.Class.Protocol.decoder(object, options)
class = Noizu.Weaviate.Class.Protocol.class(object, options)
id = Noizu.Weaviate.Class.Protocol.id(object, options)
url = api_base() <> "v1/objects/#{class}/#{id}#{query_params && "?" <> query_params || ""}"
api_call(:patch, url, object, decoder, options)
end
def delete(object, options \\ nil) do
query_params =
[]
|> then(& options[:consistency_level] && [{"consistency_level", options[:consistency_level]}| &1] || &1)
|> then(& options[:tenant] && [{"tenant", options[:tenant]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
class = Noizu.Weaviate.Class.Protocol.class(object, options)
id = Noizu.Weaviate.Class.Protocol.id(object, options)
url = api_base() <> "v1/objects/#{class}/#{id}#{query_params && "?" <> query_params || ""}"
api_call(:delete, url, nil, :json, options)
end
defmodule CrossReference do
def add(object, reference, beacon, options \\ nil) do
query_params =
[]
|> then(& options[:consistency_level] && [{"consistency_level", options[:consistency_level]}| &1] || &1)
|> then(& options[:tenant] && [{"tenant", options[:tenant]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
class = Noizu.Weaviate.Class.Protocol.class(object, options)
id = Noizu.Weaviate.Class.Protocol.id(object, options)
url = api_base() <> "v1/objects/#{class}/#{id}/references/#{reference}#{query_params && "?" <> query_params || ""}"
api_call(:post, url, %{beacon: beacon}, :json, options)
end
def update(object, reference, beacons, options \\ nil) do
query_params =
[]
|> then(& options[:consistency_level] && [{"consistency_level", options[:consistency_level]}| &1] || &1)
|> then(& options[:tenant] && [{"tenant", options[:tenant]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
class = Noizu.Weaviate.Class.Protocol.class(object, options)
id = Noizu.Weaviate.Class.Protocol.id(object, options)
url = api_base() <> "v1/objects/#{class}/#{id}/references/#{reference}#{query_params && "?" <> query_params || ""}"
api_call(:put, url, beacons, :json, options)
end
def delete(object, reference, beacon, options \\ nil) do
query_params =
[]
|> then(& options[:consistency_level] && [{"consistency_level", options[:consistency_level]}| &1] || &1)
|> then(& options[:tenant] && [{"tenant", options[:tenant]}| &1] || &1)
|> Enum.map(fn {k,v} -> "#{k}=#{v}" end)
|> Enum.join("&")
class = Noizu.Weaviate.Class.Protocol.class(object, options)
id = Noizu.Weaviate.Class.Protocol.id(object, options)
url = api_base() <> "v1/objects/#{class}/#{id}/references/#{reference}#{query_params && "?" <> query_params || ""}"
api_call(:delete, url, %{beacon: beacon}, :json, options)
end
end
end