blogit v1.0.1 Blogit.Logic.Search View Source
Contains a function for filtering and test-searching posts.
Lists of Post structures can be filtered by ‘author’, ‘category’, ‘tags’, ‘year’ and ‘month’.
The content and the title of lists of Blogit.Models.Posts can be searched using a query.
Link to this section Summary
Functions
Filters a list of Blogit.Models.Post structures using a map meta fields
to filter by and/or
search query to match to their contents and/or titles
Link to this section Types
Link to this section Functions
Link to this function
filter_by_params(posts, params)
View Source
filter_by_params(posts, %{optional(String.t) => search_value}) :: posts
Filters a list of Blogit.Models.Post structures using a map meta fields
to filter by and/or
search query to match to their contents and/or titles.
The map parameter supports zero or more of the following keys:
- “author” - Used to filter Posts by their
.meta.authorfield. - “category” - Used to filter Posts by their
.meta.categoryfield. - “tags” - Used to filter Posts by their
.meta.tagsfield. The value for this key should a string of comma separated tags. - “year” - Used to filter Posts by their
.meta.yearfield. - “month” - Used to filter Posts by their
.meta.monthfield. - “q” - A query to filter Posts by their content or title. Support text in double quotes in order to search for phrases.
If the map contains other keys, they’ll be ignored.
Examples
iex> alias Blogit.Models.Post.Meta
iex> posts = [
...> %Blogit.Models.Post{
...> name: "one", raw: "", html: "",
...> meta: %Meta{author: "meddle", category: "Primary"}
...> },
...> %Blogit.Models.Post{
...> name: "two", raw: "", html: "",
...> meta: %Meta{author: "valo", category: "Secondary"}
...> },
...> %Blogit.Models.Post{
...> name: "three", raw: "", html: "",
...> meta: %Meta{author: "Reductions", category: "Other"}
...> },
...> %Blogit.Models.Post{
...> name: "four", raw: "", html: "",
...> meta: %Meta{author: "meddle", category: "Other"}
...> }
...> ]
iex> filter = %{"author" => "meddle"}
iex> filtered = Blogit.Logic.Search.filter_by_params(posts, filter)
iex> filtered |> Enum.map(fn (post) -> post.name end)
["one", "four"]
iex> filter = %{"category" => "Other"}
iex> filtered = Blogit.Logic.Search.filter_by_params(posts, filter)
iex> filtered |> Enum.map(fn (post) -> post.name end)
["three", "four"]
iex> alias Blogit.Models.Post.Meta
iex> posts = [
...> %Blogit.Models.Post{
...> name: "one", raw: "", html: "",
...> meta: %Meta{tags: ["one", "едно", "super"]}
...> },
...> %Blogit.Models.Post{
...> name: "two", raw: "", html: "",
...> meta: %Meta{tags: ["two", "две", "super"]}
...> }
...> ]
iex> filter = %{"tags" => "super, one"}
iex> filtered = Blogit.Logic.Search.filter_by_params(posts, filter)
iex> filtered |> Enum.map(fn (post) -> post.name end)
["one"]
iex> alias Blogit.Models.Post.Meta
iex> posts = [
...> %Blogit.Models.Post{
...> name: "one", raw: "", html: "",
...> meta: %Meta{year: "2017", month: "4"}
...> },
...> %Blogit.Models.Post{
...> name: "two", raw: "", html: "",
...> meta: %Meta{year: "2016", month: "4"}
...> },
...> %Blogit.Models.Post{
...> name: "three", raw: "", html: "",
...> meta: %Meta{year: "2017", month: "3"}
...> }
...> ]
iex> filter = %{"year" => "2017"}
iex> filtered = Blogit.Logic.Search.filter_by_params(posts, filter)
iex> filtered |> Enum.map(fn (post) -> post.name end)
["one", "three"]
iex> filter = %{"month" => "4"}
iex> filtered = Blogit.Logic.Search.filter_by_params(posts, filter)
iex> filtered |> Enum.map(fn (post) -> post.name end)
["one", "two"]
iex> filter = %{"month" => "4", "year" => "2017"}
iex> filtered = Blogit.Logic.Search.filter_by_params(posts, filter)
iex> filtered |> Enum.map(fn (post) -> post.name end)
["one"]
iex> alias Blogit.Models.Post.Meta
iex> posts = [
...> %Blogit.Models.Post{
...> name: "one", raw: "Something about Processes - stuff", html: "",
...> meta: %Meta{author: "meddle", title: "Processes"}
...> },
...> %Blogit.Models.Post{
...> name: "two", raw: "Modules contain functions!", html: "",
...> meta: %Meta{author: "valo", title: "Modules And Functions"}
...> },
...> %Blogit.Models.Post{
...> name: "three", raw: "Mix is one of the coolest things", html: "",
...> meta: %Meta{author: "Reductions", title: "Mix And Tests"}
...> },
...> %Blogit.Models.Post{
...> name: "four", raw: "Linked things make difference", html: "",
...> meta: %Meta{author: "meddle", title: "Processes And Links"}
...> }
...> ]
iex> filter = %{"q" => "Process"}
iex> filtered = Blogit.Logic.Search.filter_by_params(posts, filter)
iex> filtered |> Enum.map(fn (post) -> post.name end)
["one", "four"]
iex> filter = %{"q" => "Tests"}
iex> filtered = Blogit.Logic.Search.filter_by_params(posts, filter)
iex> filtered |> Enum.map(fn (post) -> post.name end)
["three"]
iex> filter = %{"q" => ~s("coolest things")}
iex> filtered = Blogit.Logic.Search.filter_by_params(posts, filter)
iex> filtered |> Enum.map(fn (post) -> post.name end)
["three"]
iex> filter = %{"q" => ~s("coolest things"), "author" => "meddle"}
iex> filtered = Blogit.Logic.Search.filter_by_params(posts, filter)
iex> filtered |> Enum.map(fn (post) -> post.name end)
[]