mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-02-07 23:06:42 +01:00
fix a bunch of navigation weirdness
This commit is contained in:
parent
625ed5a594
commit
f443aa5386
9 changed files with 48 additions and 28 deletions
|
@ -117,6 +117,7 @@ defmodule Philomena.Elasticsearch do
|
||||||
entries = Enum.map(results["hits"]["hits"], &String.to_integer(&1["_id"]))
|
entries = Enum.map(results["hits"]["hits"], &String.to_integer(&1["_id"]))
|
||||||
|
|
||||||
Logger.debug("[Elasticsearch] Query took #{time}ms")
|
Logger.debug("[Elasticsearch] Query took #{time}ms")
|
||||||
|
Logger.debug("[Elasticsearch] #{Jason.encode!(elastic_query)}")
|
||||||
|
|
||||||
%Scrivener.Page{
|
%Scrivener.Page{
|
||||||
entries: entries,
|
entries: entries,
|
||||||
|
|
|
@ -8,15 +8,15 @@ defmodule Philomena.ImageNavigator do
|
||||||
# We get consecutive images by finding all images greater than or less than
|
# We get consecutive images by finding all images greater than or less than
|
||||||
# the current image, and grabbing the FIRST one
|
# the current image, and grabbing the FIRST one
|
||||||
@range_comparison_for_order %{
|
@range_comparison_for_order %{
|
||||||
asc: :gt,
|
"asc" => :gt,
|
||||||
desc: :lt
|
"desc" => :lt
|
||||||
}
|
}
|
||||||
|
|
||||||
# If we didn't reverse for prev, it would be the LAST image, which would
|
# If we didn't reverse for prev, it would be the LAST image, which would
|
||||||
# make Elasticsearch choke on deep pagination
|
# make Elasticsearch choke on deep pagination
|
||||||
@order_for_dir %{
|
@order_for_dir %{
|
||||||
next: %{"asc" => :asc, "desc" => :desc},
|
next: %{"asc" => "asc", "desc" => "desc"},
|
||||||
prev: %{"asc" => :desc, "desc" => :asc}
|
prev: %{"asc" => "desc", "desc" => "asc"}
|
||||||
}
|
}
|
||||||
|
|
||||||
@range_map %{
|
@range_map %{
|
||||||
|
@ -28,7 +28,7 @@ defmodule Philomena.ImageNavigator do
|
||||||
image_index =
|
image_index =
|
||||||
Image
|
Image
|
||||||
|> where(id: ^image.id)
|
|> where(id: ^image.id)
|
||||||
|> preload(:gallery_interactions)
|
|> preload([:gallery_interactions, tags: :aliases])
|
||||||
|> Repo.one()
|
|> Repo.one()
|
||||||
|> Map.merge(empty_fields())
|
|> Map.merge(empty_fields())
|
||||||
|> ElasticsearchIndex.as_json()
|
|> ElasticsearchIndex.as_json()
|
||||||
|
@ -69,13 +69,13 @@ defmodule Philomena.ImageNavigator do
|
||||||
|
|
||||||
defp extract_filters(%{"galleries.position" => term} = sort, image, rel) do
|
defp extract_filters(%{"galleries.position" => term} = sort, image, rel) do
|
||||||
# Extract gallery ID and current position
|
# 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
|
pos = Enum.find(image[:galleries], & &1.id == gid).position
|
||||||
|
|
||||||
# Sort in the other direction if we are going backwards
|
# Sort in the other direction if we are going backwards
|
||||||
sd = term["order"]
|
sd = term.order
|
||||||
order = @order_for_dir[rel][sd]
|
order = @order_for_dir[rel][to_string(sd)]
|
||||||
term = %{term | "order" => order}
|
term = %{term | order: order}
|
||||||
sort = %{sort | "galleries.position" => term}
|
sort = %{sort | "galleries.position" => term}
|
||||||
|
|
||||||
filter = gallery_range_filter(@range_comparison_for_order[order], pos)
|
filter = gallery_range_filter(@range_comparison_for_order[order], pos)
|
||||||
|
@ -164,8 +164,7 @@ defmodule Philomena.ImageNavigator do
|
||||||
upvoters: [],
|
upvoters: [],
|
||||||
downvoters: [],
|
downvoters: [],
|
||||||
favers: [],
|
favers: [],
|
||||||
hiders: [],
|
hiders: []
|
||||||
tags: []
|
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ defmodule Philomena.ImageSorter do
|
||||||
comment_count
|
comment_count
|
||||||
tag_count
|
tag_count
|
||||||
wilson_score
|
wilson_score
|
||||||
_score
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def parse_sort(params) do
|
def parse_sort(params) do
|
||||||
|
@ -27,7 +26,11 @@ defmodule Philomena.ImageSorter do
|
||||||
defp parse_sd(_params), do: "desc"
|
defp parse_sd(_params), do: "desc"
|
||||||
|
|
||||||
defp parse_sf(%{"sf" => sf}, sd) when sf in @allowed_fields do
|
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
|
end
|
||||||
|
|
||||||
defp parse_sf(%{"sf" => "random"}, sd) do
|
defp parse_sf(%{"sf" => "random"}, sd) do
|
||||||
|
@ -52,23 +55,24 @@ defmodule Philomena.ImageSorter do
|
||||||
sorts: [%{
|
sorts: [%{
|
||||||
"galleries.position" => %{
|
"galleries.position" => %{
|
||||||
order: sd,
|
order: sd,
|
||||||
nested_path: :galleries,
|
nested: %{
|
||||||
nested_filter: %{
|
path: :galleries,
|
||||||
term: %{
|
filter: %{
|
||||||
"galleries.id": gallery
|
term: %{"galleries.id" => gallery}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}]
|
}],
|
||||||
|
constant_score: true
|
||||||
}
|
}
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
%{queries: [%{match_none: %{}}], sorts: []}
|
%{queries: [%{match_none: %{}}], sorts: [], constant_score: true}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp parse_sf(_params, sd) do
|
defp parse_sf(_params, sd) do
|
||||||
%{queries: [], sorts: [%{"created_at" => sd}]}
|
%{queries: [], sorts: [%{"created_at" => sd}], constant_score: true}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp random_query(seed, sd) do
|
defp random_query(seed, sd) do
|
||||||
|
@ -76,11 +80,12 @@ defmodule Philomena.ImageSorter do
|
||||||
queries: [%{
|
queries: [%{
|
||||||
function_score: %{
|
function_score: %{
|
||||||
query: %{match_all: %{}},
|
query: %{match_all: %{}},
|
||||||
random_score: %{seed: seed},
|
random_score: %{seed: seed, field: :id},
|
||||||
boost_mode: :replace
|
boost_mode: :replace
|
||||||
}
|
}
|
||||||
}],
|
}],
|
||||||
sorts: [%{"_score" => sd}]
|
sorts: [%{"_score" => sd}],
|
||||||
|
constant_score: true
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,7 +9,7 @@ defmodule PhilomenaWeb.SearchController do
|
||||||
user = conn.assigns.current_user
|
user = conn.assigns.current_user
|
||||||
sort = ImageSorter.parse_sort(params)
|
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}} ->
|
{:ok, {images, tags}} ->
|
||||||
interactions =
|
interactions =
|
||||||
Interactions.user_interactions(images, user)
|
Interactions.user_interactions(images, user)
|
||||||
|
|
|
@ -18,14 +18,16 @@ defmodule PhilomenaWeb.ImageLoader do
|
||||||
end
|
end
|
||||||
|
|
||||||
def query(conn, body, options \\ []) do
|
def query(conn, body, options \\ []) do
|
||||||
sort_queries = Keyword.get(options, :queries, [])
|
sort_queries = Keyword.get(options, :queries, [])
|
||||||
sort_sorts = Keyword.get(options, :sorts, [%{created_at: :desc}])
|
sort_sorts = Keyword.get(options, :sorts, [%{created_at: :desc}])
|
||||||
pagination = Keyword.get(options, :pagination, conn.assigns.image_pagination)
|
pagination = Keyword.get(options, :pagination, conn.assigns.image_pagination)
|
||||||
queryable = Keyword.get(options, :queryable, Image |> preload(:tags))
|
queryable = Keyword.get(options, :queryable, Image |> preload(:tags))
|
||||||
|
constant_score = Keyword.get(options, :constant_score, true)
|
||||||
|
|
||||||
user = conn.assigns.current_user
|
user = conn.assigns.current_user
|
||||||
filter = conn.assigns.compiled_filter
|
filter = conn.assigns.compiled_filter
|
||||||
filters = create_filters(conn, user, filter)
|
filters = create_filters(conn, user, filter)
|
||||||
|
body = maybe_constant_score(body, constant_score)
|
||||||
|
|
||||||
records =
|
records =
|
||||||
Elasticsearch.search_records(
|
Elasticsearch.search_records(
|
||||||
|
@ -93,6 +95,9 @@ defmodule PhilomenaWeb.ImageLoader do
|
||||||
defp maybe_custom_hide(filters, _user, _param),
|
defp maybe_custom_hide(filters, _user, _param),
|
||||||
do: filters
|
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
|
# 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(%{term: %{"namespaced_tags.name" => tag_name}}), do: [tag_name]
|
||||||
defp search_tag_name(_other_query), do: []
|
defp search_tag_name(_other_query), do: []
|
||||||
|
|
|
@ -8,7 +8,7 @@ elixir:
|
||||||
#sortable
|
#sortable
|
||||||
.block#imagelist-container
|
.block#imagelist-container
|
||||||
section.block__header.flex
|
section.block__header.flex
|
||||||
h1.block__header__title.hide-mobile
|
span.block__header__title.hide-mobile
|
||||||
' Viewing gallery
|
' Viewing gallery
|
||||||
strong>
|
strong>
|
||||||
= @gallery.title
|
= @gallery.title
|
||||||
|
@ -16,6 +16,8 @@ elixir:
|
||||||
= pagination
|
= pagination
|
||||||
|
|
||||||
.flex__right
|
.flex__right
|
||||||
|
= render PhilomenaWeb.ImageView, "_random_button.html", conn: @conn, params: scope
|
||||||
|
|
||||||
a href=Routes.gallery_report_path(@conn, :new, @gallery)
|
a href=Routes.gallery_report_path(@conn, :new, @gallery)
|
||||||
i.fa.fa-exclamation-triangle>
|
i.fa.fa-exclamation-triangle>
|
||||||
span.hide-mobile Report
|
span.hide-mobile Report
|
||||||
|
|
|
@ -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
|
|
@ -16,6 +16,7 @@ elixir:
|
||||||
= pagination
|
= pagination
|
||||||
|
|
||||||
.flex__right
|
.flex__right
|
||||||
|
= random_button @conn, params
|
||||||
= hidden_toggle @conn, route, params
|
= hidden_toggle @conn, route, params
|
||||||
= deleted_toggle @conn, route, params
|
= deleted_toggle @conn, route, params
|
||||||
= quick_tag @conn
|
= quick_tag @conn
|
||||||
|
|
|
@ -178,6 +178,10 @@ defmodule PhilomenaWeb.ImageView do
|
||||||
|
|
||||||
def hides_images?(conn), do: can?(conn, :hide, %Philomena.Images.Image{})
|
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(%{assigns: %{current_user: nil}}, _route, _params), do: nil
|
||||||
def hidden_toggle(conn, route, params) do
|
def hidden_toggle(conn, route, params) do
|
||||||
render PhilomenaWeb.ImageView, "_hidden_toggle.html", route: route, params: params, conn: conn
|
render PhilomenaWeb.ImageView, "_hidden_toggle.html", route: route, params: params, conn: conn
|
||||||
|
|
Loading…
Reference in a new issue