picky 1.1.5 → 1.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/picky/index_api.rb +86 -18
  2. metadata +2 -2
@@ -1,13 +1,22 @@
1
- # This class defines the indexing and index API that is exposed to the user.
1
+ # This class defines the indexing and index API that is exposed to the user
2
+ # as the #index method inside the Application class.
3
+ #
2
4
  # It provides a single front for both indexing and index options.
3
5
  #
4
6
  # Note: An Index holds both an *Indexed*::*Index* and an *Indexing*::*Type*.
5
7
  #
6
- class IndexAPI # :nodoc:all
8
+ class IndexAPI
7
9
 
8
10
  attr_reader :name, :indexing, :indexed
9
11
 
10
- # TODO Doc.
12
+ # Create a new index with a given source.
13
+ #
14
+ # Parameters:
15
+ # * name: A name that will be used for the index directory and in the Picky front end.
16
+ # * source: Where the data comes from, e.g. Sources::CSV.new(...)
17
+ #
18
+ # Options:
19
+ # * after_indexing: Currently only used in the db source. Executes the given after_indexing as SQL after the indexing process.
11
20
  #
12
21
  def initialize name, source, options = {}
13
22
  @name = name
@@ -19,7 +28,18 @@ class IndexAPI # :nodoc:all
19
28
  Indexes.register self
20
29
  end
21
30
 
22
- # TODO Doc.
31
+ # Defines a searchable category on the index.
32
+ #
33
+ # Parameters:
34
+ # category_name: This identifier is used in the front end, but also to categorize query text. For example, “title:hobbit” will narrow the hobbit query on categories with the identifier :title.
35
+ #
36
+ # Options:
37
+ # * partial: Partial::None.new or Partial::Substring.new(from: starting_char, to: ending_char). Default is Partial::Substring.new(from: -3, to: -1).
38
+ # * similarity: Similarity::None.new or Similarity::Phonetic.new(similar_words_searched). Default is Similarity::None.new.
39
+ # * qualifiers: An array of qualifiers with which you can define which category you’d like to search, for example “title:hobbit” will search for hobbit in just title categories. Example: qualifiers: [:t, :titre, :title] (use it for example with multiple languages). Default is the name of the category.
40
+ # * qualifier: Convenience options if you just need a single qualifier, see above. Example: qualifiers => :title. Default is the name of the category.
41
+ # * source: Use a different source than the index uses. If you think you need that, there might be a better solution to your problem. Please post to the mailing list first with your application.rb :)
42
+ # * from: Take the data from the data category with this name. Example: You have a source Sources::CSV.new(:title, file:'some_file.csv') but you want the category to be called differently. The you use from: define_category(:similar_title, :from => :title).
23
43
  #
24
44
  def define_category category_name, options = {}
25
45
  category_name = category_name.to_sym
@@ -33,33 +53,82 @@ class IndexAPI # :nodoc:all
33
53
  end
34
54
  alias category define_category
35
55
 
36
- #
56
+ # HIGHLY EXPERIMENTAL
37
57
  #
38
- def define_location name, options = {}
39
- # TODO Make mandatory.
40
- #
41
- grid = options[:radius] || raise("Option :radius needs to be set on define_location, it defines the search radius.")
58
+ # Make this category range searchable.
59
+ #
60
+ # Example:
61
+ # You have data values inside 1..100, and you want to have Picky return
62
+ # not only the results for 47 if you search for 47, but also results for
63
+ # 45, 46, or 47.2, 48.9, in a range of 2 around 47, so (45..49).
64
+ #
65
+ # Then you use:
66
+ # my_index.define_location :values_inside_1_100, 2
67
+ #
68
+ # Optionally, you give it a precision value to reduce the error margin
69
+ # around 47 (Picky is a bit liberal).
70
+ # my_index.define_location :values_inside_1_100, 2, precision: 5
71
+ #
72
+ # This will force Picky to maximally be wrong 5% of the given range value
73
+ # (5% of 2 = 0.1).
74
+ #
75
+ # We suggest not to use more than 5 as a higher precision is more performance intensive.
76
+ #
77
+ # Parameters:
78
+ # * name: The name as used in #define_category.
79
+ # * radius: The range (in km) around the query point which we search for results.
80
+ #
81
+ # -----|<- range ->*------------|-----
82
+ #
83
+ # Options
84
+ # * precision # Default 1 (20% error margin, very fast), up to 5 (5% error margin, slower) makes sense.
85
+ # * from: # The data category to take the data for this category from.
86
+ #
87
+ def define_location name, range, options = {}
42
88
  precision = options[:precision]
43
89
 
44
90
  options = { partial: Partial::None.new }.merge options
45
91
 
46
92
  define_category name, options do |indexing, indexed|
47
- indexing.source = Sources::Wrappers::Location.new indexing, grid: grid, precision: precision
93
+ indexing.source = Sources::Wrappers::Location.new indexing, grid: range, precision: precision
48
94
  indexing.tokenizer = Tokenizers::Index.new
49
95
 
50
- exact_bundle = Indexed::Wrappers::Bundle::Location.new indexed.exact, grid: grid, precision: precision
96
+ exact_bundle = Indexed::Wrappers::Bundle::Location.new indexed.exact, grid: range, precision: precision
51
97
  indexed.exact = exact_bundle
52
98
  indexed.partial = exact_bundle # A partial token also uses the exact index.
53
99
  end
54
100
  end
55
101
  alias location define_location
56
102
 
103
+ # HIGHLY EXPERIMENTAL Not correctly working yet. Try it if you feel "beta".
104
+ #
105
+ # Also a range search see #define_location, but on the earth's surface.
106
+ #
107
+ # Parameters:
108
+ # * name: The name as used in #define_category.
109
+ # * radius: The distance (in km) around the query point which we search for results.
110
+ #
111
+ # Note: Picky uses a square, not a circle. We hope that's ok for most usages.
112
+ #
113
+ # -----------------------------
114
+ # | |
115
+ # | |
116
+ # | |
117
+ # | |
118
+ # | |
119
+ # | *<- radius ->|
120
+ # | |
121
+ # | |
122
+ # | |
123
+ # | |
124
+ # | |
125
+ # -----------------------------
126
+ #
57
127
  # Options
58
- # * radius (in km).
128
+ # * precision: Default 1 (20% error margin, very fast), up to 5 (5% error margin, slower) makes sense.
129
+ # * from: The data category to take the data for this category from.
59
130
  #
60
- def define_map_location name, options = {}
61
- radius = options[:radius] || raise("Option :radius needs to be set on define_map_location, it defines the search radius.")
62
-
131
+ def define_map_location name, radius, options = {}
63
132
  # The radius is given as if all the locations were on the equator.
64
133
  #
65
134
  # TODO Need to recalculate since not many locations are on the equator ;) This is just a prototype.
@@ -69,8 +138,7 @@ class IndexAPI # :nodoc:all
69
138
  # A degree on the equator is equal to ~111,319.9 meters.
70
139
  # So a km on the equator is equal to 0.00898312 degrees.
71
140
  #
72
- options[:radius] = radius * 0.00898312
73
-
74
- define_location name, options
141
+ define_location name, radius * 0.00898312, options
75
142
  end
143
+ alias map_location define_map_location
76
144
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 1
8
- - 5
9
- version: 1.1.5
8
+ - 6
9
+ version: 1.1.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - Florian Hanke