lib/n_plus_1_detector.ex

defmodule EctoSparkles.NPlus1Detector do
  @moduledoc """
  Checks a query against the previous one and increments counter of collisions or swaps previous query with the last one.
  """

  # Increase counter or swaps query
  def check("SELECT" <> _rest = query) do
    do_check(query, get(query))
  end

  def check(_query) do
    nil
  end

  defp get(query) do
    Process.get("one_plus_n_detector: #{query}")
  end

  defp put(query, counter) do
    Process.put("one_plus_n_detector: #{query}", counter)
  end

  def do_check(query, nil) do
    put(query, 1)
    :first
  end

  def do_check(query, counter) do
    counter = counter + 1
    put(query, counter)
    {:match, counter}
  end

end