lib/ex_aliyun_ots/metadata.ex

alias ExAliyunOts.TableStore.Condition

defmodule ExAliyunOts.RuntimeError do
  @moduledoc false
  defexception [:message, :error_code]

  def exception(value) do
    msg = "Error: #{inspect(value)}"
    %__MODULE__{message: msg}
  end
end

defmodule ExAliyunOts.Instance do
  @moduledoc "Describe Alibaba TableStore instance primary information."

  @type t :: %__MODULE__{}

  defstruct [
    :access_key_id,
    :access_key_secret,
    :name,
    :endpoint,
    :pool_size,
    :pool_count
  ]
end

defmodule ExAliyunOts.HTTPRequest do
  @moduledoc false
  defstruct instance: nil, uri: "", body: nil, method: "POST"
end

defmodule ExAliyunOts.Error do
  @moduledoc "Describe request error from server http response."

  @type t :: %__MODULE__{
          code: binary,
          message: binary,
          request_id: binary,
          http_status_code: binary,
          datetime: binary
        }
  defstruct code: nil, message: "", request_id: nil, http_status_code: nil, datetime: nil
end

defmodule ExAliyunOts.Var.TimeRange do
  @moduledoc false
  defstruct [:start_time, :end_time, :specific_time]
end

defmodule ExAliyunOts.Var.UpdateRow do
  @moduledoc false
  require ExAliyunOts.Const.ReturnType, as: ReturnType

  defstruct table_name: "",
            primary_keys: [],
            updates: %{},
            condition: %Condition{},
            return_type: ReturnType.none(),
            return_columns: [],
            transaction_id: nil
end

defmodule ExAliyunOts.Var.PutRow do
  @moduledoc false
  require ExAliyunOts.Const.ReturnType, as: ReturnType

  defstruct table_name: "",
            primary_keys: [],
            attribute_columns: [],
            condition: %Condition{},
            return_type: ReturnType.none(),
            transaction_id: nil
end

defmodule ExAliyunOts.Var.GetRow do
  @moduledoc false
  defstruct table_name: "",
            primary_keys: [],
            columns_to_get: [],
            max_versions: 1,
            time_range: nil,
            filter: nil,
            start_column: nil,
            end_column: nil,
            transaction_id: nil
end

defmodule ExAliyunOts.Var.DeleteRow do
  @moduledoc false
  require ExAliyunOts.Const.ReturnType, as: ReturnType

  defstruct table_name: "",
            primary_keys: [],
            condition: %Condition{},
            return_type: ReturnType.none(),
            transaction_id: nil
end

defmodule ExAliyunOts.Var.StreamSpec do
  @moduledoc false
  defstruct is_enabled: nil, expiration_time: nil
end

defmodule ExAliyunOts.Var.CreateTable do
  @moduledoc false
  defstruct table_name: "",
            primary_keys: [],
            defined_columns: [],
            reserved_throughput_write: 0,
            reserved_throughput_read: 0,
            time_to_live: -1,
            max_versions: 1,
            deviation_cell_version_in_sec: 86_400,
            stream_spec: %ExAliyunOts.Var.StreamSpec{},
            index_metas: []
end

defmodule ExAliyunOts.Var.UpdateTable do
  @moduledoc false
  defstruct table_name: "",
            reserved_throughput_write: nil,
            reserved_throughput_read: nil,
            time_to_live: -1,
            max_versions: 1,
            deviation_cell_version_in_sec: 86_400,
            stream_spec: %ExAliyunOts.Var.StreamSpec{}
end

defmodule ExAliyunOts.Var.GetRange do
  @moduledoc false
  require ExAliyunOts.Const.Direction, as: Direction

  defstruct table_name: "",
            direction: Direction.forward(),
            columns_to_get: [],
            time_range: nil,
            max_versions: 1,
            limit: nil,
            inclusive_start_primary_keys: nil,
            exclusive_end_primary_keys: nil,
            filter: nil,
            start_column: nil,
            end_column: nil,
            transaction_id: nil
end

defmodule ExAliyunOts.Var.RowInBatchWriteRequest do
  @moduledoc false
  require ExAliyunOts.Const.ReturnType, as: ReturnType

  defstruct type: nil,
            primary_keys: [],
            updates: nil,
            condition: %Condition{},
            return_type: ReturnType.none(),
            return_columns: []
end

defmodule ExAliyunOts.Var.BatchWriteRequest do
  @moduledoc false
  defstruct table_name: "", rows: []
end

defmodule ExAliyunOts.Var.NewSequence do
  @moduledoc false
  defstruct name: "",
            reserved_throughput_write: 0,
            reserved_throughput_read: 0,
            deviation_cell_version_in_sec: 86_400
end

defmodule ExAliyunOts.Var.GetSequenceNextValue do
  @moduledoc false
  defstruct name: "", event: "default", starter: 0, increment_offset: 1
end

# SearchIndex

defmodule ExAliyunOts.Var.Search do
  @moduledoc false

  defmodule IndexSetting do
    @moduledoc false
    defstruct number_of_shards: 1, routing_fields: [], routing_partition_size: nil
  end

  defmodule IndexSchema do
    @moduledoc false
    defstruct field_schemas: [], index_setting: %IndexSetting{}, index_sorts: []
  end

  defmodule CreateSearchIndexRequest do
    @moduledoc false
    defstruct table_name: "", index_name: "", index_schema: %IndexSchema{}
  end

  defmodule DeleteSearchIndexRequest do
    @moduledoc false
    defstruct table_name: "", index_name: ""
  end

  defmodule DescribeSearchIndexRequest do
    @moduledoc false
    defstruct table_name: "", index_name: ""
  end

  defmodule FieldSchema do
    @moduledoc false
    require ExAliyunOts.Const.Search.FieldType, as: FieldType

    defstruct field_name: "",
              field_type: FieldType.keyword(),
              index_options: nil,
              analyzer: nil,
              analyzer_parameter: nil,
              index: true,
              enable_sort_and_agg: true,
              store: true,
              field_schemas: [],
              is_array: nil
  end

  defmodule FieldSort do
    @moduledoc false
    require ExAliyunOts.Const.Search.SortOrder, as: SortOrder
    defstruct field_name: "", order: SortOrder.asc(), mode: nil, nested_filter: nil
  end

  defmodule GeoDistanceSort do
    @moduledoc false
    require ExAliyunOts.Const.Search.SortOrder, as: SortOrder
    require ExAliyunOts.Const.Search.GeoDistanceType, as: GeoDistanceType

    defstruct field_name: "",
              points: [],
              order: SortOrder.asc(),
              mode: nil,
              distance_type: GeoDistanceType.arc(),
              nested_filter: nil
  end

  defmodule NestedFilter do
    @moduledoc false
    defstruct path: nil, filter: nil
  end

  defmodule ScoreSort do
    @moduledoc false
    require ExAliyunOts.Const.Search.SortOrder, as: SortOrder
    defstruct order: SortOrder.asc()
  end

  defmodule PrimaryKeySort do
    @moduledoc false
    require ExAliyunOts.Const.Search.SortOrder, as: SortOrder
    defstruct order: SortOrder.asc()
  end

  defmodule ColumnsToGet do
    @moduledoc false
    require ExAliyunOts.Const.Search.ColumnReturnType, as: ColumnReturnType
    defstruct return_type: ColumnReturnType.all(), column_names: []
  end

  defmodule SearchQuery do
    @moduledoc false
    defstruct offset: 0,
              limit: nil,
              query: nil,
              collapse: nil,
              sort: nil,
              get_total_count: true,
              token: nil,
              aggs: nil,
              group_bys: nil
  end

  defmodule SearchRequest do
    @moduledoc false
    defstruct table_name: "",
              index_name: "",
              columns_to_get: %ColumnsToGet{},
              search_query: %SearchQuery{},
              routing_values: nil
  end

  defmodule ScanQuery do
    @moduledoc false
    defstruct limit: nil,
              query: nil,
              alive_time: 60,
              token: nil,
              current_parallel_id: nil,
              max_parallel: nil
  end

  defmodule ParallelScanRequest do
    @moduledoc false
    alias ExAliyunOts.Const.Search.ColumnReturnType
    require ColumnReturnType
    defstruct table_name: "",
              index_name: "",
              columns_to_get: %ColumnsToGet{
                return_type: ColumnReturnType.all_from_index()
              },
              session_id: "",
              scan_query: %ScanQuery{}
  end

  defmodule MatchQuery do
    @moduledoc false
    defstruct field_name: "", text: "", minimum_should_match: 1, operator: nil
  end

  defmodule MatchAllQuery do
    @moduledoc false
    defstruct []
  end

  defmodule MatchPhraseQuery do
    @moduledoc false
    defstruct field_name: "", text: ""
  end

  defmodule TermQuery do
    @moduledoc false
    defstruct field_name: "", term: nil
  end

  defmodule TermsQuery do
    @moduledoc false
    defstruct field_name: "", terms: []
  end

  defmodule PrefixQuery do
    @moduledoc false
    defstruct field_name: "", prefix: nil
  end

  defmodule RangeQuery do
    @moduledoc false
    defstruct field_name: "", from: nil, to: nil, include_lower: true, include_upper: true
  end

  defmodule WildcardQuery do
    @moduledoc false
    defstruct field_name: "", value: nil
  end

  defmodule BoolQuery do
    @moduledoc false
    defstruct must: [], must_not: [], filter: [], should: [], minimum_should_match: nil
  end

  defmodule NestedQuery do
    @moduledoc false
    require ExAliyunOts.Const.Search.ScoreMode, as: ScoreMode

    # `score_mode`:
    # 多值字段获取文档得分的模式,一个字段多个值的情况下,采用哪个值来进行排序
    # 例如:有一个小学生学生状态监测系统,其中存了小学生的身高,但是小学生身高一直在长,所以“身高”这个字段,采用了array的方式。然后我们查询的时候,想根据身高进行排序,就可以设置`score_mode`为`max`,这样就能得到最近的一次身高。
    defstruct path: "", query: nil, score_mode: ScoreMode.none()
  end

  defmodule GeoDistanceQuery do
    @moduledoc false
    defstruct field_name: "", center_point: nil, distance: nil
  end

  defmodule GeoBoundingBoxQuery do
    @moduledoc false
    defstruct field_name: "", top_left: nil, bottom_right: nil
  end

  defmodule GeoPolygonQuery do
    @moduledoc false
    defstruct field_name: "", points: []
  end

  defmodule ExistsQuery do
    @moduledoc false
    defstruct field_name: ""
  end

  defmodule Aggregation do
    @moduledoc false
    defstruct field_name: "", type: nil, name: nil, missing: nil
  end

  defmodule GroupByField do
    @moduledoc false
    defstruct name: nil, field_name: "", size: nil, sub_group_bys: nil, sub_aggs: nil, sort: nil
  end

  defmodule GroupByRange do
    @moduledoc false
    defstruct name: nil, field_name: "", sub_group_bys: nil, sub_aggs: nil, ranges: nil
  end

  defmodule GroupByFilter do
    @moduledoc false
    defstruct name: nil, filters: nil, sub_group_bys: nil, sub_aggs: nil
  end

  defmodule GroupByGeoDistance do
    @moduledoc false
    defstruct name: nil,
              field_name: "",
              lat: nil,
              lon: nil,
              sub_group_bys: nil,
              sub_aggs: nil,
              ranges: nil
  end

  defmodule GroupKeySort do
    @moduledoc false
    require ExAliyunOts.Const.Search.SortOrder, as: SortOrder
    defstruct order: SortOrder.asc()
  end

  defmodule RowCountSort do
    @moduledoc false
    require ExAliyunOts.Const.Search.SortOrder, as: SortOrder
    defstruct order: SortOrder.asc()
  end

  defmodule SubAggSort do
    @moduledoc false
    require ExAliyunOts.Const.Search.SortOrder, as: SortOrder
    defstruct order: SortOrder.desc(), sub_agg_name: nil
  end

end

# Transaction

defmodule ExAliyunOts.Var.Transaction do
  @moduledoc false

  defmodule StartLocalTransactionRequest do
    @moduledoc false
    defstruct table_name: "", partition_key: {}
  end
end