From f443aa538653efbc9043db9bcb87acd3cec7bae8 Mon Sep 17 00:00:00 2001 From: "byte[]" Date: Thu, 26 Dec 2019 17:43:32 -0500 Subject: [PATCH] fix a bunch of navigation weirdness --- lib/philomena/elasticsearch.ex | 1 + lib/philomena/image_navigator.ex | 21 +++++++-------- lib/philomena/image_sorter.ex | 27 +++++++++++-------- .../controllers/search_controller.ex | 2 +- lib/philomena_web/image_loader.ex | 13 ++++++--- .../templates/gallery/show.html.slime | 4 ++- .../templates/image/_random_button.html.slime | 3 +++ .../templates/image/index.html.slime | 1 + lib/philomena_web/views/image_view.ex | 4 +++ 9 files changed, 48 insertions(+), 28 deletions(-) create mode 100644 lib/philomena_web/templates/image/_random_button.html.slime diff --git a/lib/philomena/elasticsearch.ex b/lib/philomena/elasticsearch.ex index b3d9e823..b9684788 100644 --- a/lib/philomena/elasticsearch.ex +++ b/lib/philomena/elasticsearch.ex @@ -117,6 +117,7 @@ defmodule Philomena.Elasticsearch do entries = Enum.map(results["hits"]["hits"], &String.to_integer(&1["_id"])) Logger.debug("[Elasticsearch] Query took #{time}ms") + Logger.debug("[Elasticsearch] #{Jason.encode!(elastic_query)}") %Scrivener.Page{ entries: entries, diff --git a/lib/philomena/image_navigator.ex b/lib/philomena/image_navigator.ex index e40488db..650c35b7 100644 --- a/lib/philomena/image_navigator.ex +++ b/lib/philomena/image_navigator.ex @@ -8,15 +8,15 @@ defmodule Philomena.ImageNavigator do # We get consecutive images by finding all images greater than or less than # the current image, and grabbing the FIRST one @range_comparison_for_order %{ - asc: :gt, - desc: :lt + "asc" => :gt, + "desc" => :lt } # If we didn't reverse for prev, it would be the LAST image, which would # make Elasticsearch choke on deep pagination @order_for_dir %{ - next: %{"asc" => :asc, "desc" => :desc}, - prev: %{"asc" => :desc, "desc" => :asc} + next: %{"asc" => "asc", "desc" => "desc"}, + prev: %{"asc" => "desc", "desc" => "asc"} } @range_map %{ @@ -28,7 +28,7 @@ defmodule Philomena.ImageNavigator do image_index = Image |> where(id: ^image.id) - |> preload(:gallery_interactions) + |> preload([:gallery_interactions, tags: :aliases]) |> Repo.one() |> Map.merge(empty_fields()) |> ElasticsearchIndex.as_json() @@ -69,13 +69,13 @@ defmodule Philomena.ImageNavigator do defp extract_filters(%{"galleries.position" => term} = sort, image, rel) do # Extract gallery ID and current position - gid = term["nested_filter"]["term"]["galleries.id"] + gid = term.nested_filter.term."galleries.id" pos = Enum.find(image[:galleries], & &1.id == gid).position # Sort in the other direction if we are going backwards - sd = term["order"] - order = @order_for_dir[rel][sd] - term = %{term | "order" => order} + sd = term.order + order = @order_for_dir[rel][to_string(sd)] + term = %{term | order: order} sort = %{sort | "galleries.position" => term} filter = gallery_range_filter(@range_comparison_for_order[order], pos) @@ -164,8 +164,7 @@ defmodule Philomena.ImageNavigator do upvoters: [], downvoters: [], favers: [], - hiders: [], - tags: [] + hiders: [] } end diff --git a/lib/philomena/image_sorter.ex b/lib/philomena/image_sorter.ex index 2951611e..0ff932e8 100644 --- a/lib/philomena/image_sorter.ex +++ b/lib/philomena/image_sorter.ex @@ -14,7 +14,6 @@ defmodule Philomena.ImageSorter do comment_count tag_count wilson_score - _score ) def parse_sort(params) do @@ -27,7 +26,11 @@ defmodule Philomena.ImageSorter do defp parse_sd(_params), do: "desc" defp parse_sf(%{"sf" => sf}, sd) when sf in @allowed_fields do - %{queries: [], sorts: [%{sf => sd}]} + %{queries: [], sorts: [%{sf => sd}], constant_score: true} + end + + defp parse_sf(%{"sf" => "_score"}, sd) do + %{queries: [], sorts: [%{"_score" => sd}], constant_score: false} end defp parse_sf(%{"sf" => "random"}, sd) do @@ -52,23 +55,24 @@ defmodule Philomena.ImageSorter do sorts: [%{ "galleries.position" => %{ order: sd, - nested_path: :galleries, - nested_filter: %{ - term: %{ - "galleries.id": gallery + nested: %{ + path: :galleries, + filter: %{ + term: %{"galleries.id" => gallery} } } } - }] + }], + constant_score: true } _ -> - %{queries: [%{match_none: %{}}], sorts: []} + %{queries: [%{match_none: %{}}], sorts: [], constant_score: true} end end defp parse_sf(_params, sd) do - %{queries: [], sorts: [%{"created_at" => sd}]} + %{queries: [], sorts: [%{"created_at" => sd}], constant_score: true} end defp random_query(seed, sd) do @@ -76,11 +80,12 @@ defmodule Philomena.ImageSorter do queries: [%{ function_score: %{ query: %{match_all: %{}}, - random_score: %{seed: seed}, + random_score: %{seed: seed, field: :id}, boost_mode: :replace } }], - sorts: [%{"_score" => sd}] + sorts: [%{"_score" => sd}], + constant_score: true } end end diff --git a/lib/philomena_web/controllers/search_controller.ex b/lib/philomena_web/controllers/search_controller.ex index ad5f1078..fce32212 100644 --- a/lib/philomena_web/controllers/search_controller.ex +++ b/lib/philomena_web/controllers/search_controller.ex @@ -9,7 +9,7 @@ defmodule PhilomenaWeb.SearchController do user = conn.assigns.current_user sort = ImageSorter.parse_sort(params) - case ImageLoader.search_string(conn, params["q"], sorts: sort.sorts, queries: sort.queries) do + case ImageLoader.search_string(conn, params["q"], sorts: sort.sorts, queries: sort.queries, constant_score: sort.constant_score) do {:ok, {images, tags}} -> interactions = Interactions.user_interactions(images, user) diff --git a/lib/philomena_web/image_loader.ex b/lib/philomena_web/image_loader.ex index f977f95f..db0c4669 100644 --- a/lib/philomena_web/image_loader.ex +++ b/lib/philomena_web/image_loader.ex @@ -18,14 +18,16 @@ defmodule PhilomenaWeb.ImageLoader do end def query(conn, body, options \\ []) do - sort_queries = Keyword.get(options, :queries, []) - sort_sorts = Keyword.get(options, :sorts, [%{created_at: :desc}]) - pagination = Keyword.get(options, :pagination, conn.assigns.image_pagination) - queryable = Keyword.get(options, :queryable, Image |> preload(:tags)) + sort_queries = Keyword.get(options, :queries, []) + sort_sorts = Keyword.get(options, :sorts, [%{created_at: :desc}]) + pagination = Keyword.get(options, :pagination, conn.assigns.image_pagination) + queryable = Keyword.get(options, :queryable, Image |> preload(:tags)) + constant_score = Keyword.get(options, :constant_score, true) user = conn.assigns.current_user filter = conn.assigns.compiled_filter filters = create_filters(conn, user, filter) + body = maybe_constant_score(body, constant_score) records = Elasticsearch.search_records( @@ -93,6 +95,9 @@ defmodule PhilomenaWeb.ImageLoader do defp maybe_custom_hide(filters, _user, _param), do: filters + defp maybe_constant_score(body, false), do: body + defp maybe_constant_score(body, _), do: %{bool: %{filter: body}} + # TODO: the search parser should try to optimize queries defp search_tag_name(%{term: %{"namespaced_tags.name" => tag_name}}), do: [tag_name] defp search_tag_name(_other_query), do: [] diff --git a/lib/philomena_web/templates/gallery/show.html.slime b/lib/philomena_web/templates/gallery/show.html.slime index a5825df5..4a1fb91d 100644 --- a/lib/philomena_web/templates/gallery/show.html.slime +++ b/lib/philomena_web/templates/gallery/show.html.slime @@ -8,7 +8,7 @@ elixir: #sortable .block#imagelist-container section.block__header.flex - h1.block__header__title.hide-mobile + span.block__header__title.hide-mobile ' Viewing gallery strong> = @gallery.title @@ -16,6 +16,8 @@ elixir: = pagination .flex__right + = render PhilomenaWeb.ImageView, "_random_button.html", conn: @conn, params: scope + a href=Routes.gallery_report_path(@conn, :new, @gallery) i.fa.fa-exclamation-triangle> span.hide-mobile Report diff --git a/lib/philomena_web/templates/image/_random_button.html.slime b/lib/philomena_web/templates/image/_random_button.html.slime new file mode 100644 index 00000000..d383a3e3 --- /dev/null +++ b/lib/philomena_web/templates/image/_random_button.html.slime @@ -0,0 +1,3 @@ +a href=Routes.image_random_path(@conn, :index, @params) title="Random Image" + i.fa.fa-random> + span.hide-mobile.hide-limited-desktop Random Image diff --git a/lib/philomena_web/templates/image/index.html.slime b/lib/philomena_web/templates/image/index.html.slime index ce034256..a463089a 100644 --- a/lib/philomena_web/templates/image/index.html.slime +++ b/lib/philomena_web/templates/image/index.html.slime @@ -16,6 +16,7 @@ elixir: = pagination .flex__right + = random_button @conn, params = hidden_toggle @conn, route, params = deleted_toggle @conn, route, params = quick_tag @conn diff --git a/lib/philomena_web/views/image_view.ex b/lib/philomena_web/views/image_view.ex index 0992ada5..ae44602c 100644 --- a/lib/philomena_web/views/image_view.ex +++ b/lib/philomena_web/views/image_view.ex @@ -178,6 +178,10 @@ defmodule PhilomenaWeb.ImageView do def hides_images?(conn), do: can?(conn, :hide, %Philomena.Images.Image{}) + def random_button(conn, params) do + render PhilomenaWeb.ImageView, "_random_button.html", conn: conn, params: params + end + def hidden_toggle(%{assigns: %{current_user: nil}}, _route, _params), do: nil def hidden_toggle(conn, route, params) do render PhilomenaWeb.ImageView, "_hidden_toggle.html", route: route, params: params, conn: conn