ansr 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. checksums.yaml +15 -0
  2. data/README.md +35 -0
  3. data/ansr.gemspec +2 -1
  4. data/ansr_blacklight/Gemfile +3 -0
  5. data/ansr_blacklight/README.md +37 -0
  6. data/ansr_blacklight/ansr_blacklight.gemspec +28 -0
  7. data/ansr_blacklight/lib/ansr_blacklight.rb +57 -0
  8. data/ansr_blacklight/lib/ansr_blacklight/arel.rb +6 -0
  9. data/ansr_blacklight/lib/ansr_blacklight/arel/big_table.rb +57 -0
  10. data/ansr_blacklight/lib/ansr_blacklight/arel/visitors.rb +6 -0
  11. data/ansr_blacklight/lib/ansr_blacklight/arel/visitors/query_builder.rb +217 -0
  12. data/ansr_blacklight/lib/ansr_blacklight/arel/visitors/to_no_sql.rb +14 -0
  13. data/ansr_blacklight/lib/ansr_blacklight/base.rb +21 -0
  14. data/ansr_blacklight/lib/ansr_blacklight/connection_adapters/no_sql_adapter.rb +38 -0
  15. data/ansr_blacklight/lib/ansr_blacklight/model/querying.rb +29 -0
  16. data/ansr_blacklight/lib/ansr_blacklight/relation.rb +50 -0
  17. data/ansr_blacklight/lib/ansr_blacklight/relation/solr_projection_methods.rb +55 -0
  18. data/ansr_blacklight/lib/ansr_blacklight/request_builders.rb +141 -0
  19. data/ansr_blacklight/lib/ansr_blacklight/solr.rb +4 -0
  20. data/ansr_blacklight/lib/ansr_blacklight/solr/request.rb +46 -0
  21. data/ansr_blacklight/lib/ansr_blacklight/solr/response.rb +94 -0
  22. data/ansr_blacklight/lib/ansr_blacklight/solr/response/group.rb +32 -0
  23. data/ansr_blacklight/lib/ansr_blacklight/solr/response/group_response.rb +50 -0
  24. data/ansr_blacklight/lib/ansr_blacklight/solr/response/more_like_this.rb +14 -0
  25. data/ansr_blacklight/lib/ansr_blacklight/solr/response/pagination_methods.rb +35 -0
  26. data/ansr_blacklight/lib/ansr_blacklight/solr/response/spelling.rb +92 -0
  27. data/ansr_blacklight/spec/fixtures/config.yml +0 -0
  28. data/ansr_blacklight/spec/lib/loaded_relation_spec.rb +223 -0
  29. data/ansr_blacklight/spec/lib/queryable_relation_spec.rb +133 -0
  30. data/ansr_blacklight/spec/lib/relation/faceting_spec.rb +475 -0
  31. data/ansr_blacklight/spec/lib/relation/grouping_spec.rb +159 -0
  32. data/ansr_blacklight/spec/spec_helper.rb +72 -0
  33. data/ansr_dpla/Gemfile +3 -0
  34. data/ansr_dpla/Gemfile.lock +138 -0
  35. data/ansr_dpla/README.md +2 -2
  36. data/ansr_dpla/ansr_dpla.gemspec +2 -2
  37. data/ansr_dpla/lib/ansr_dpla.rb +3 -0
  38. data/ansr_dpla/lib/ansr_dpla/api.rb +3 -3
  39. data/ansr_dpla/lib/ansr_dpla/arel.rb +1 -2
  40. data/ansr_dpla/lib/ansr_dpla/arel/big_table.rb +4 -0
  41. data/ansr_dpla/lib/ansr_dpla/arel/visitors.rb +6 -0
  42. data/ansr_dpla/lib/ansr_dpla/arel/visitors/query_builder.rb +188 -0
  43. data/ansr_dpla/lib/ansr_dpla/arel/visitors/to_no_sql.rb +9 -0
  44. data/ansr_dpla/lib/ansr_dpla/connection_adapters/no_sql_adapter.rb +58 -0
  45. data/ansr_dpla/lib/ansr_dpla/model/base.rb +7 -0
  46. data/ansr_dpla/lib/ansr_dpla/model/querying.rb +6 -10
  47. data/ansr_dpla/lib/ansr_dpla/relation.rb +61 -0
  48. data/ansr_dpla/lib/ansr_dpla/request.rb +5 -0
  49. data/ansr_dpla/spec/lib/api_spec.rb +8 -5
  50. data/ansr_dpla/spec/lib/item_spec.rb +2 -2
  51. data/ansr_dpla/spec/lib/relation/facet_spec.rb +27 -19
  52. data/ansr_dpla/spec/lib/relation/select_spec.rb +10 -8
  53. data/ansr_dpla/spec/lib/relation/where_spec.rb +1 -1
  54. data/ansr_dpla/spec/lib/relation_spec.rb +31 -29
  55. data/ansr_dpla/test/system.rb +4 -2
  56. data/lib/ansr.rb +7 -0
  57. data/lib/ansr/arel.rb +3 -0
  58. data/lib/ansr/arel/big_table.rb +43 -3
  59. data/lib/ansr/arel/configured_field.rb +19 -0
  60. data/lib/ansr/arel/nodes.rb +41 -0
  61. data/lib/ansr/arel/visitors.rb +7 -0
  62. data/lib/ansr/arel/visitors/context.rb +13 -0
  63. data/lib/ansr/arel/visitors/query_builder.rb +47 -0
  64. data/lib/ansr/arel/visitors/to_no_sql.rb +41 -0
  65. data/lib/ansr/base.rb +29 -1
  66. data/lib/ansr/configurable.rb +6 -12
  67. data/lib/ansr/connection_adapters.rb +5 -0
  68. data/lib/ansr/connection_adapters/no_sql_adapter.rb +80 -0
  69. data/lib/ansr/dummy_associations.rb +105 -0
  70. data/lib/ansr/facets.rb +103 -0
  71. data/lib/ansr/model.rb +17 -107
  72. data/lib/ansr/model/connection_handler.rb +6 -0
  73. data/lib/ansr/relation.rb +40 -23
  74. data/lib/ansr/relation/group.rb +31 -0
  75. data/lib/ansr/relation/predicate_builder.rb +106 -0
  76. data/lib/ansr/relation/query_methods.rb +192 -45
  77. data/lib/ansr/sanitization.rb +5 -18
  78. data/lib/ansr/utils.rb +89 -0
  79. data/lib/ansr/version.rb +1 -1
  80. metadata +73 -25
  81. data/ansr_dpla/lib/ansr_dpla/arel/connection.rb +0 -81
  82. data/ansr_dpla/lib/ansr_dpla/arel/query_builder.rb +0 -131
  83. data/lib/ansr/model/connection.rb +0 -103
@@ -1,131 +0,0 @@
1
- module Ansr::Dpla
2
- module Arel
3
- class QueryBuilder
4
- attr_reader :query_opts, :aliases, :table
5
- def initialize(big_table)
6
- @query_opts = {}
7
- @aliases = {}
8
- @table = big_table
9
- end
10
- def fields=(value)
11
- @query_opts[:fields] = value
12
- end
13
- def select(arel_nodes=nil)
14
- arel_nodes = [arel_nodes].compact unless arel_nodes.respond_to? :each
15
- arel_nodes.each.select {|an| ::Arel::SqlLiteral === an}.each do |n|
16
- select_val = n.to_s.split(" AS ")
17
- add_field(select_val[0])
18
- aliases[select_val[0]] = select_val[1] if select_val[1]
19
- end
20
- end
21
-
22
- def field_key_from_node(node)
23
- table.model.field_name(node)
24
- end
25
-
26
- def add_field(field_name)
27
- return unless field_name
28
- query_opts[:fields] ||= ""
29
- query_opts[:fields] << ',' << field_name
30
- query_opts[:fields].sub!(/^,/,'')
31
- end
32
-
33
- def add_facet(field_name)
34
- return unless field_name
35
- field_name = Array(field_name).uniq
36
- if query_opts[:facets]
37
- query_opts[:facets] = (Array(query_opts[:facets]) + field_name).uniq
38
- else
39
- query_opts[:facets] = field_name[1] ? field_name : field_name[0]
40
- end
41
- end
42
-
43
- def where(arel_nodes)
44
- arel_nodes = (arel_nodes.respond_to? :each) ? arel_nodes : Array(arel_nodes)
45
- arel_nodes.each do |node|
46
- case node
47
- when ::Arel::Nodes::Equality
48
- field_key = field_key_from_node(node.left)
49
- if @query_opts[field_key]
50
- @query_opts[field_key] = (Array(@query_opts[field_key]) << node.right)
51
- else
52
- @query_opts[field_key] = node.right
53
- end
54
- when ::Arel::Nodes::Grouping
55
- n = node.expr
56
- if ::Arel::Nodes::Binary === n
57
- prefix = nil
58
- prefix = "NOT" if (::Arel::Nodes::NotEqual === n)
59
- prefix = "OR" if (::Arel::Nodes::Or === n)
60
- if prefix
61
- val = "#{prefix} #{n.right}"
62
- else
63
- val = n.right
64
- end
65
- field_key = field_key_from_node(n)
66
- if @query_opts[field_key]
67
- @query_opts[field_key] = Array(@query_opts[field_key]) << val
68
- else
69
- @query_opts[field_key] = val
70
- end
71
- end
72
- when ::Arel::Attributes::Attribute # this is the field references
73
- end
74
- end
75
- end
76
-
77
- def order(*arel_nodes)
78
- direction = nil
79
- nodes = []
80
- arel_nodes.inject(nodes) do |c, n|
81
- if ::Arel::Nodes::Ordering === n
82
- c << n
83
- elsif n.is_a? String
84
- _ns = n.split(',')
85
- _ns.each do |_n|
86
- _p = _n.split(/\s+/)
87
- if (_p[1])
88
- _p[1] = _p[1].downcase.to_sym
89
- else
90
- _p[1] = :asc
91
- end
92
- c << table[_p[0].to_sym].send(_p[1])
93
- end
94
- end
95
- c
96
- end
97
- nodes.each do |node|
98
- if ::Arel::Nodes::Ordering === node
99
- if @query_opts[:sort_by]
100
- @query_opts[:sort_by] = Array[@query_opts[:sort_by]] << node.expr.name
101
- else
102
- @query_opts[:sort_by] = node.expr.name
103
- end
104
- direction = :asc if (::Arel::Nodes::Ascending === node and direction)
105
- direction = :desc if (::Arel::Nodes::Descending === node)
106
- end
107
- end
108
- @query_opts[:sort_order] = direction if direction
109
- end
110
-
111
- def take(value=nil)
112
- if value and (value = value.to_i)
113
- raise "Page size cannot be > 500 (#{value}" if value > 500
114
- @query_opts[:page_size] = value
115
- end
116
- end
117
-
118
- def skip(value=nil)
119
- if value
120
- @query_opts[:page] = (value.to_i / (@query_opts[:page_size] || Ansr::Relation::DEFAULT_PAGE_SIZE)) + 1
121
- end
122
- end
123
-
124
- def filters=(values)
125
- unless values.empty?
126
- @query_opts[:facets] = (values[1]) ? values : values[0]
127
- end
128
- end
129
- end
130
- end
131
- end
@@ -1,103 +0,0 @@
1
- module Ansr
2
- module Model
3
- class Connection
4
- def initialize(klass)
5
- @table = klass.table
6
- end
7
-
8
- def primary_key(table_name)
9
- 'id'
10
- end
11
-
12
- def limit(arel_node)
13
- case arel_node
14
- when ::Arel::SelectManager
15
- arel_node.limit
16
- when ::Arel::Nodes::SelectStatement
17
- arel_node.limit && arel_node.limit.expr
18
- else
19
- nil
20
- end
21
- end
22
-
23
- def offset(arel_node)
24
- case arel_node
25
- when ::Arel::SelectManager
26
- arel_node.offset
27
- when ::Arel::Nodes::SelectStatement
28
- arel_node.offset && arel_node.offset.expr
29
- else
30
- nil
31
- end
32
- end
33
-
34
- def constraints(arel_node)
35
- case arel_node
36
- when ::Arel::SelectManager
37
- arel_node.constraints
38
- when ::Arel::Nodes::SelectStatement
39
- arel_node.cores.last.wheres
40
- else
41
- nil
42
- end
43
- end
44
-
45
- def projections(arel_node)
46
- case arel_node
47
- when ::Arel::SelectManager
48
- arel_node.projections
49
- when ::Arel::Nodes::SelectStatement
50
- arel_node.cores.last.projections
51
- else
52
- nil
53
- end
54
- end
55
-
56
- def orders(arel_node)
57
- case arel_node
58
- when ::Arel::SelectManager
59
- arel_node.orders
60
- when ::Arel::Nodes::SelectStatement
61
- arel_node.orders
62
- else
63
- nil
64
- end
65
- end
66
-
67
- def schema_cache
68
- ActiveRecord::ConnectionAdapters::SchemaCache.new(self)
69
- end
70
-
71
- def table_exists?(table_name)
72
- true
73
- end
74
-
75
- # this is called by the BigTable impl
76
- def columns(table_name, *rest)
77
- @table.fields.map {|s| ::ActiveRecord::ConnectionAdapters::Column.new(s.to_s, nil, nil)}
78
- end
79
-
80
- def sanitize_limit(limit_value)
81
- if limit_value.to_s.to_i >= 0
82
- limit_value
83
- else
84
- Ansr::Relation::DEFAULT_PAGE_SIZE
85
- end
86
- end
87
-
88
- def sanitize_filter_name(filter_value)
89
- if filter_value.is_a? Array
90
- return filter_value.collect {|x| sanitize_filter_name(x)}.compact
91
- else
92
- if @table.facets.include? filter_value.to_sym
93
- return filter_value
94
- else
95
- raise "#{filter_value} is not a facetable field"
96
- #Rails.logger.warn "Ignoring #{filter_value} (not a filterable field)" if Rails.logger
97
- #return nil
98
- end
99
- end
100
- end
101
- end
102
- end
103
- end