GeoGenius.Store behaviour (geo_genius v0.2.0)

Copy Markdown View Source

The contract every catalog read goes through.

A store issues one call to a shipped SQL function per read and maps the rows. It adds no filtering, ordering, or limiting of its own: those belong to the SQL API, where they are already specified and tested.

Summary

Types

A coordinate or a radius in metres.

The plural reads' seeds: many area keys, or many code values.

Functions

The store this host configured, or the shipped default.

Resolves a backend name to its module.

Types

numeric()

@type numeric() :: number() | Decimal.t()

A coordinate or a radius in metres.

These bind as double precision, and a host holds one in whatever shape it read: a float, an integer for a whole-degree coordinate, or the %Decimal{} Ecto loads from a numeric column. All three are accepted.

seeds()

@type seeds() :: [String.t()]

The plural reads' seeds: many area keys, or many code values.

Each returned GeoGenius.SeededMatch carries the seed it came from, and a seed that matched nothing contributes no row.

Callbacks

ancestors_of(t, t, keyword)

@callback ancestors_of(GeoGenius.Context.t(), String.t(), keyword()) :: [
  GeoGenius.AreaMatch.t()
]

ancestors_of_many(t, seeds, keyword)

@callback ancestors_of_many(GeoGenius.Context.t(), seeds(), keyword()) :: [
  GeoGenius.SeededMatch.t()
]

areas_by_code(t, t, t, keyword)

@callback areas_by_code(GeoGenius.Context.t(), String.t(), String.t(), keyword()) :: [
  GeoGenius.AreaMatch.t()
]

areas_by_code_many(t, t, seeds, keyword)

@callback areas_by_code_many(GeoGenius.Context.t(), String.t(), seeds(), keyword()) :: [
  GeoGenius.SeededMatch.t()
]

areas_for_geometry(t, geometry, keyword)

@callback areas_for_geometry(GeoGenius.Context.t(), Geo.geometry(), keyword()) :: [
  GeoGenius.AreaMatch.t()
]

areas_for_point(t, numeric, numeric, keyword)

@callback areas_for_point(GeoGenius.Context.t(), numeric(), numeric(), keyword()) :: [
  GeoGenius.AreaMatch.t()
]

areas_near(t, numeric, numeric, numeric, keyword)

@callback areas_near(GeoGenius.Context.t(), numeric(), numeric(), numeric(), keyword()) ::
  [
    GeoGenius.AreaMatch.t()
  ]

children_of(t, t, keyword)

@callback children_of(GeoGenius.Context.t(), String.t(), keyword()) :: [
  GeoGenius.AreaMatch.t()
]

children_of_many(t, seeds, keyword)

@callback children_of_many(GeoGenius.Context.t(), seeds(), keyword()) :: [
  GeoGenius.SeededMatch.t()
]

related_areas(t, t, keyword)

@callback related_areas(GeoGenius.Context.t(), String.t(), keyword()) :: [
  GeoGenius.AreaMatch.t()
]

related_areas_many(t, seeds, keyword)

@callback related_areas_many(GeoGenius.Context.t(), seeds(), keyword()) :: [
  GeoGenius.SeededMatch.t()
]

release_at(t, t, keyword)

@callback release_at(GeoGenius.Context.t(), DateTime.t(), keyword()) ::
  Ecto.UUID.t() | nil

resolve(t, map, keyword)

@callback resolve(GeoGenius.Context.t(), map(), keyword()) :: [GeoGenius.AreaMatch.t()]

search_areas(t, t, keyword)

@callback search_areas(GeoGenius.Context.t(), String.t(), keyword()) :: [
  GeoGenius.AreaMatch.t()
]

Functions

configured(opts \\ [])

@spec configured(keyword()) :: module()

The store this host configured, or the shipped default.

module_for_backend(backend)

@spec module_for_backend(String.t()) :: {:ok, module()} | {:error, :unknown_backend}

Resolves a backend name to its module.