summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJochen Topf <jochen@topf.org>2013-01-06 20:32:23 +0100
committerJochen Topf <jochen@topf.org>2013-01-06 20:33:02 +0100
commitc47f73c31d29ad862fa1bd4b08e14d750ab8f93e (patch)
tree5fc32a9593534b09e0c8ed4f7c6e3622af4b0dfc
parent67102b2716b448371229b62b3a6f04d6209979ef (diff)
downloadtaginfo-c47f73c31d29ad862fa1bd4b08e14d750ab8f93e.tar
taginfo-c47f73c31d29ad862fa1bd4b08e14d750ab8f93e.tar.gz
Updated search API to v4
-rw-r--r--web/lib/api/search.rb1
-rw-r--r--web/lib/api/v4/search.rb129
-rwxr-xr-xweb/taginfo.rb1
-rw-r--r--web/viewsjs/search.js.erb9
4 files changed, 135 insertions, 5 deletions
diff --git a/web/lib/api/search.rb b/web/lib/api/search.rb
index f1c390f..037a55c 100644
--- a/web/lib/api/search.rb
+++ b/web/lib/api/search.rb
@@ -2,6 +2,7 @@
class Taginfo < Sinatra::Base
api(2, 'search/values', {
+ :superseded_by => '4/search/by_value',
:description => 'Search all tag values for string.',
:parameters => { :q => 'Value to search for (substring search, required).' },
:sort => %w( count_all key value ),
diff --git a/web/lib/api/v4/search.rb b/web/lib/api/v4/search.rb
new file mode 100644
index 0000000..a8ca2c0
--- /dev/null
+++ b/web/lib/api/v4/search.rb
@@ -0,0 +1,129 @@
+# web/lib/api/v4/search.rb
+class Taginfo < Sinatra::Base
+
+ api(4, 'search/by_value', {
+ :description => 'Search for tags by value.',
+ :parameters => { :query => 'Value to search for (substring search, required).' },
+ :sort => %w( count_all key value ),
+ :paging => :optional,
+ :result => {
+ :key => :STRING,
+ :value => :STRING,
+ :count_all => :INT
+ },
+ :example => { :query => 'foo', :page => 1, :rp => 10 },
+ :ui => '/search?q=foo#values'
+ }) do
+ query = params[:query]
+
+ total = @db.count('search.ftsearch').
+ condition_if("value MATCH ?", query).
+ get_first_value().to_i
+
+ res = @db.select('SELECT * FROM search.ftsearch').
+ condition_if("value MATCH ?", query).
+ order_by(@ap.sortname, @ap.sortorder) { |o|
+ o.count_all
+ o.key
+ o.value
+ }.
+ paging(@ap).
+ execute()
+
+ return {
+ :page => @ap.page,
+ :rp => @ap.results_per_page,
+ :total => total,
+ :data => res.map{ |row| {
+ :key => row['key'],
+ :value => row['value'],
+ :count_all => row['count_all'].to_i,
+ }}
+ }.to_json
+ end
+
+ api(4, 'search/by_key_and_value', {
+ :description => 'Search for tags by key and/or value.',
+ :parameters => { :query => 'Value to search for (substring search, required).' },
+ :sort => %w( count_all key value ),
+ :paging => :optional,
+ :result => {
+ :key => :STRING,
+ :value => :STRING,
+ :count_all => :INT
+ },
+ :example => { :query => 'highway%3Dresidential', :page => 1, :rp => 10 },
+ :ui => '/search?q=highway%3Dresidential'
+ }) do
+ query = params[:query]
+ (query_key, query_value) = query.split('=', 2)
+
+ if query_key == ''
+ total = @db.execute('SELECT count(*) FROM search.ftsearch WHERE value MATCH ?', query_value)[0][0].to_i
+ sel = @db.select('SELECT * FROM search.ftsearch WHERE value MATCH ?', query_value)
+ elsif query_value == ''
+ total = @db.execute('SELECT count(*) FROM search.ftsearch WHERE key MATCH ?', query_key)[0][0].to_i
+ sel = @db.select('SELECT * FROM search.ftsearch WHERE key MATCH ?', query_key)
+ else
+ total = @db.execute('SELECT count(*) FROM (SELECT * FROM search.ftsearch WHERE key MATCH ? INTERSECT SELECT * FROM search.ftsearch WHERE value MATCH ?)', query_key, query_value)[0][0].to_i
+ sel = @db.select('SELECT * FROM search.ftsearch WHERE key MATCH ? INTERSECT SELECT * FROM search.ftsearch WHERE value MATCH ?', query_key, query_value)
+ end
+
+ res = sel.
+ order_by(@ap.sortname, @ap.sortorder) { |o|
+ o.count_all
+ o.key
+ o.value
+ }.
+ paging(@ap).
+ execute()
+
+ return {
+ :page => @ap.page,
+ :rp => @ap.results_per_page,
+ :total => total,
+ :data => res.map{ |row| {
+ :key => row['key'],
+ :value => row['value'],
+ :count_all => row['count_all'].to_i,
+ }}
+ }.to_json
+ end
+
+ api(4, 'search/by_keyword', {
+ :description => 'Search for keys and tags by keyword in wiki pages.',
+ :parameters => { :query => 'Value to search for (substring search, required).' },
+ :sort => %w( count_all key value ),
+ :paging => :optional,
+ :result => {
+ :key => :STRING,
+ :value => :STRING
+ },
+ :example => { :query => 'fire', :page => 1, :rp => 10 },
+ :ui => '/search?q=fire#fulltext'
+ }) do
+ query = params[:query].downcase
+
+ total = @db.count('wiki.words').condition("words LIKE ('%' || ? || '%')", query).get_first_value().to_i
+ sel = @db.select("SELECT key, value FROM wiki.words WHERE words LIKE ('%' || ? || '%')", query)
+
+ res = sel.
+ order_by(@ap.sortname, @ap.sortorder) { |o|
+ o.key
+ o.value
+ }.
+ paging(@ap).
+ execute()
+
+ return {
+ :page => @ap.page,
+ :rp => @ap.results_per_page,
+ :total => total,
+ :data => res.map{ |row| {
+ :key => row['key'],
+ :value => row['value']
+ }}
+ }.to_json
+ end
+
+end
diff --git a/web/taginfo.rb b/web/taginfo.rb
index f224f50..386bc51 100755
--- a/web/taginfo.rb
+++ b/web/taginfo.rb
@@ -198,6 +198,7 @@ class Taginfo < Sinatra::Base
load 'lib/api/v4/key.rb'
load 'lib/api/v4/keys.rb'
# load 'lib/api/v4/langtag.rb'
+ load 'lib/api/v4/search.rb'
load 'lib/api/v4/site.rb'
load 'lib/api/v4/tag.rb'
load 'lib/api/v4/tags.rb'
diff --git a/web/viewsjs/search.js.erb b/web/viewsjs/search.js.erb
index be909c5..22f0a92 100644
--- a/web/viewsjs/search.js.erb
+++ b/web/viewsjs/search.js.erb
@@ -6,7 +6,7 @@
var create_flexigrid_for = {
keys: function(query) {
create_flexigrid('grid-keys', {
- url: '/api/2/db/keys?query=' + encodeURIComponent(query),
+ url: '/api/4/keys/all?query=' + encodeURIComponent(query),
colModel: [
{ display: '<%= misc.count %>', name: 'count_all', width: 80, sortable: true, align: 'right' },
{ display: '<%= osm.key %>', name: 'key', width: 500, sortable: true }
@@ -27,7 +27,7 @@ var create_flexigrid_for = {
},
values: function(query) {
create_flexigrid('grid-values', {
- url: '/api/2/search/values?q=' + encodeURIComponent(query),
+ url: '/api/4/search/by_value?query=' + encodeURIComponent(query),
colModel: [
{ display: '<%= misc.count %>', name: 'count_all', width: 80, sortable: true, align: 'right' },
{ display: '<%= osm.key %>', name: 'key', width: 250, sortable: true },
@@ -51,7 +51,7 @@ var create_flexigrid_for = {
tags: function(query) {
var q = query.split('=', 2);
create_flexigrid('grid-tags', {
- url: '/api/2/search/tags?q=' + encodeURIComponent(query),
+ url: '/api/4/search/by_key_and_value?query=' + encodeURIComponent(query),
colModel: [
{ display: '<%= misc.count %>', name: 'count_all', width: 80, sortable: true, align: 'right' },
{ display: '<%= osm.key %>', name: 'key', width: 300, sortable: true },
@@ -73,9 +73,8 @@ var create_flexigrid_for = {
});
},
fulltext: function(query) {
- var q = query.split('=', 2);
create_flexigrid('grid-fulltext', {
- url: '/api/2/search/wikipages?q=' + encodeURIComponent(query),
+ url: '/api/4/search/by_keyword?query=' + encodeURIComponent(query),
colModel: [
{ display: '<%= osm.key %>', name: 'key', width: 300, sortable: true },
{ display: '<%= osm.value %>', name: 'value', width: 500, sortable: true }