@@ -9,6 +9,8 @@ defmodule LiveAdmin.Resource do
99 > to query it, __live_admin_config__/0.
1010 """
1111
12+ require Integer
13+
1214 import Ecto.Query
1315 import LiveAdmin
1416
@@ -22,11 +24,7 @@ defmodule LiveAdmin.Resource do
2224 """
2325 defmacro __using__ ( opts ) do
2426 opts_schema =
25- LiveAdmin . base_configs_schema ( ) ++
26- [
27- schema: [ type: :atom , default: __CALLER__ . module ] ,
28- preload: [ type: { :or , [ :keyword_list , nil ] } , default: nil ]
29- ]
27+ LiveAdmin . base_configs_schema ( ) ++ [ schema: [ type: :atom , default: __CALLER__ . module ] ]
3028
3129 quote bind_quoted: [ opts: opts , opts_schema: opts_schema ] do
3230 opts = NimbleOptions . validate! ( opts , opts_schema )
@@ -56,7 +54,6 @@ defmodule LiveAdmin.Resource do
5654 def find ( key , resource , prefix , repo ) do
5755 resource . __live_admin_config__ ( )
5856 |> Keyword . fetch! ( :schema )
59- |> preload ( ^ preloads ( resource ) )
6057 |> repo . get ( key , prefix: prefix )
6158 end
6259
@@ -75,34 +72,30 @@ defmodule LiveAdmin.Resource do
7572 end
7673 end
7774
78- def query ( resource , search , config ) do
79- resource . __live_admin_config__ ( )
80- |> Keyword . fetch! ( :schema )
81- |> then ( fn query ->
82- case search do
83- q when not is_nil ( q ) and byte_size ( q ) > 0 ->
84- apply_search ( query , q , fields ( resource , config ) )
85-
86- _ ->
87- query
88- end
89- end )
90- |> preload ( ^ preloads ( resource ) )
91- end
92-
9375 def list ( resource , opts , session , repo , config ) do
94- resource
95- |> LiveAdmin . fetch_config ( :list_with , config )
96- |> case do
97- nil ->
98- build_list ( resource , opts , session , repo , config )
76+ opts =
77+ opts
78+ |> Enum . into ( % { } )
79+ |> Map . put_new ( :page , 1 )
80+ |> Map . put_new ( :per , session . index_page_size )
81+ |> Map . put_new ( :sort_dir , :asc )
82+ |> Map . put_new ( :sort_attr , LiveAdmin . primary_key! ( resource ) )
9983
100- { mod , func_name } ->
101- apply ( mod , func_name , [ resource , opts , session ] )
84+ query =
85+ resource
86+ |> query ( opts [ :search ] , config )
87+ |> limit ( ^ opts [ :per ] )
88+ |> offset ( ^ ( ( opts [ :page ] - 1 ) * opts [ :per ] ) )
89+ |> order_by ( ^ [ { opts [ :sort_dir ] , opts [ :sort_attr ] } ] )
10290
103- name when is_atom ( name ) ->
104- apply ( resource , name , [ opts , session ] )
105- end
91+ {
92+ repo . all ( query , prefix: opts [ :prefix ] ) ,
93+ repo . aggregate (
94+ query |> exclude ( :limit ) |> exclude ( :offset ) ,
95+ :count ,
96+ prefix: opts [ :prefix ]
97+ )
98+ }
10699 end
107100
108101 def change ( resource , record \\ nil , params \\ % { } , config )
@@ -202,35 +195,19 @@ defmodule LiveAdmin.Resource do
202195 end
203196 end
204197
205- defp build_list ( resource , opts , session , repo , config ) do
206- opts =
207- opts
208- |> Enum . into ( % { } )
209- |> Map . put_new ( :page , 1 )
210- |> Map . put_new ( :per , session . index_page_size )
211- |> Map . put_new ( :sort_dir , :asc )
212- |> Map . put_new ( :sort_attr , LiveAdmin . primary_key! ( resource ) )
213-
214- query =
215- resource
216- |> query ( opts [ :search ] , config )
217- |> limit ( ^ opts [ :per ] )
218- |> offset ( ^ ( ( opts [ :page ] - 1 ) * opts [ :per ] ) )
219- |> order_by ( ^ [ { opts [ :sort_dir ] , opts [ :sort_attr ] } ] )
220-
221- {
222- repo . all ( query , prefix: opts [ :prefix ] ) ,
223- repo . aggregate (
224- query |> exclude ( :limit ) |> exclude ( :offset ) ,
225- :count ,
226- prefix: opts [ :prefix ]
227- )
228- }
229- end
230-
231198 defp apply_search ( query , q , fields ) do
232- q
233- |> LiveAdmin.View . parse_search ( )
199+ parts = String . split ( q , ~r{ ([^\s ]*:)} , include_captures: true , trim: true )
200+
201+ if parts |> Enum . count ( ) |> Integer . is_odd ( ) do
202+ [ { "*" , q } ]
203+ else
204+ parts
205+ |> Enum . map ( & String . trim / 1 )
206+ |> Enum . chunk_every ( 2 )
207+ |> Enum . map ( fn
208+ [ column , param ] -> { String . replace ( column , ":" , "" ) , param }
209+ end )
210+ end
234211 |> case do
235212 field_queries when is_list ( field_queries ) ->
236213 field_queries
@@ -312,21 +289,28 @@ defmodule LiveAdmin.Resource do
312289
313290 defp parse_map_param ( param ) , do: param
314291
315- defp preloads ( resource ) do
292+ def query ( resource , search , config ) do
316293 resource . __live_admin_config__ ( )
317- |> Keyword . fetch! ( :preload )
294+ |> Keyword . get ( :query_with )
318295 |> case do
319296 nil ->
320297 resource . __live_admin_config__ ( )
321298 |> Keyword . fetch! ( :schema )
322- |> parent_associations ( )
323- |> Enum . map ( & & 1 . field )
299+ |> then ( fn query ->
300+ case search do
301+ q when not is_nil ( q ) and byte_size ( q ) > 0 ->
302+ apply_search ( query , q , fields ( resource , config ) )
303+
304+ _ ->
305+ query
306+ end
307+ end )
324308
325- { m , f , [ ] } ->
326- apply ( m , f , [ resource ] )
309+ { m , f } ->
310+ apply ( m , f , [ resource , search ] ++ args )
327311
328- preloads when is_list ( preloads ) ->
329- preloads
312+ f when is_atom ( f ) ->
313+ apply ( resource , f , [ search ] )
330314 end
331315 end
332316
0 commit comments