mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-23 20:18:00 +01:00
some filter incorporation
This commit is contained in:
parent
5085d3c9d1
commit
047e02c9ba
6 changed files with 54 additions and 13 deletions
|
@ -170,4 +170,22 @@ defmodule Philomena.Images.Query do
|
|||
},
|
||||
default: "namespaced_tags.name"
|
||||
)
|
||||
|
||||
def compile(user, query_string, watch \\ false) do
|
||||
query_string = query_string || ""
|
||||
|
||||
case user do
|
||||
nil ->
|
||||
anonymous_parser(%{user: nil, watch: watch}, query_string)
|
||||
|
||||
%{role: role} when role in ~W(user assistant) ->
|
||||
user_parser(%{user: user, watch: watch}, query_string)
|
||||
|
||||
%{role: role} when role in ~W(moderator admin) ->
|
||||
moderator_parser(%{user: user, watch: watch}, query_string)
|
||||
|
||||
_ ->
|
||||
raise ArgumentError, "Unknown user role."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -459,7 +459,7 @@ defmodule Philomena.Search.Lexer do
|
|||
])
|
||||
|
||||
search =
|
||||
times(outer, min: 1)
|
||||
repeat(outer)
|
||||
|> eos()
|
||||
|
||||
defparsec(unquote(:"#{name}_lexer"), search)
|
||||
|
|
|
@ -35,6 +35,8 @@ defmodule Philomena.Search.Parser do
|
|||
# Predictive LL(k) parser for search grammar
|
||||
#
|
||||
|
||||
defp unquote(:"#{name}_top")(_ctx, []), do: {%{match_none: %{}}, []}
|
||||
|
||||
defp unquote(:"#{name}_top")(ctx, tokens), do: unquote(:"#{name}_or")(ctx, tokens)
|
||||
|
||||
#
|
||||
|
|
|
@ -24,6 +24,7 @@ defmodule PhilomenaWeb do
|
|||
import Plug.Conn
|
||||
import PhilomenaWeb.Gettext
|
||||
alias PhilomenaWeb.Router.Helpers, as: Routes
|
||||
alias PhilomenaWeb.Plugs.ImageFilter
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -4,22 +4,15 @@ defmodule PhilomenaWeb.ImageController do
|
|||
alias Philomena.{Images, Images.Image}
|
||||
import Ecto.Query
|
||||
|
||||
plug ImageFilter
|
||||
|
||||
def index(conn, _params) do
|
||||
query = conn.assigns[:compiled_filter]
|
||||
images =
|
||||
Image.search_records(
|
||||
%{
|
||||
query: %{
|
||||
bool: %{
|
||||
must_not: %{
|
||||
terms: %{
|
||||
tag_ids: conn.assigns[:current_filter].hidden_tag_ids
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
sort: %{
|
||||
created_at: :desc
|
||||
}
|
||||
query: %{bool: %{must_not: query}},
|
||||
sort: %{created_at: :desc}
|
||||
},
|
||||
Image |> preload(:tags)
|
||||
)
|
||||
|
|
27
lib/philomena_web/plugs/image_filter.ex
Normal file
27
lib/philomena_web/plugs/image_filter.ex
Normal file
|
@ -0,0 +1,27 @@
|
|||
defmodule PhilomenaWeb.Plugs.ImageFilter do
|
||||
import Plug.Conn
|
||||
|
||||
alias Philomena.Images.Query
|
||||
alias Pow.Plug
|
||||
|
||||
# No options
|
||||
def init([]), do: false
|
||||
|
||||
# Assign current filter
|
||||
def call(conn, _opts) do
|
||||
user = conn |> Plug.current_user()
|
||||
filter = conn.assigns[:current_filter]
|
||||
|
||||
tag_exclusion = %{terms: %{tag_ids: filter.hidden_tag_ids}}
|
||||
{:ok, query_exclusion} = Query.compile(user, filter.hidden_complex_str)
|
||||
|
||||
query = %{
|
||||
bool: %{
|
||||
should: [tag_exclusion, query_exclusion]
|
||||
}
|
||||
}
|
||||
|
||||
conn
|
||||
|> assign(:compiled_filter, query)
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue