aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--web/lib/api/v4/search.rb41
-rw-r--r--web/views/search.erb6
-rw-r--r--web/viewsjs/search.js.erb35
3 files changed, 78 insertions, 4 deletions
diff --git a/web/lib/api/v4/search.rb b/web/lib/api/v4/search.rb
index cf8d5e1..edc2710 100644
--- a/web/lib/api/v4/search.rb
+++ b/web/lib/api/v4/search.rb
@@ -84,6 +84,47 @@ class Taginfo < Sinatra::Base
}.to_json
end
+ api(4, 'search/by_role', {
+ :description => 'Search for relation roles.',
+ :parameters => { :query => 'Role to search for (substring search, required).' },
+ :sort => %w( count_all rtype role ),
+ :paging => :optional,
+ :result => paging_results([
+ [:rtype, :STRING, 'Relation type.'],
+ [:role, :STRING, 'Role'],
+ [:count_all, :INT, 'Number of objects in the database with this role.']
+ ]),
+ :example => { :query => 'foo', :page => 1, :rp => 10 },
+ :ui => '/search?q=foo#roles'
+ }) do
+ query = params[:query]
+
+ total = @db.count('db.relation_roles').
+ condition_if("role LIKE '%' || ? || '%'", query).
+ get_first_value().to_i
+
+ res = @db.select('SELECT * FROM db.relation_roles').
+ condition_if("role LIKE '%' || ? || '%'", query).
+ order_by(@ap.sortname, @ap.sortorder) { |o|
+ o.count_all
+ o.rtype
+ o.role
+ }.
+ paging(@ap).
+ execute()
+
+ return {
+ :page => @ap.page,
+ :rp => @ap.results_per_page,
+ :total => total,
+ :data => res.map{ |row| {
+ :rtype => row['rtype'],
+ :role => row['role'],
+ :count_all => row['count_all'].to_i,
+ }}
+ }.to_json
+ end
+
api(4, 'search/by_value', {
:description => 'Search for tags by value.',
:parameters => { :query => 'Value to search for (substring search, required).' },
diff --git a/web/views/search.erb b/web/views/search.erb
index 30212f7..8b0af63 100644
--- a/web/views/search.erb
+++ b/web/views/search.erb
@@ -6,6 +6,7 @@
<ul>
<li><a href="#keys"><%= t.osm.keys %></a></li>
<li><a href="#values"><%= t.osm.values %></a></li>
+ <li><a href="#roles"><%= t.osm.relation_member_roles %></a></li>
<li><a href="#fulltext"><%= t.pages.search.fulltext %></a></li>
</ul>
<div id="keys">
@@ -18,6 +19,11 @@
<table id="grid-values">
</table>
</div>
+ <div id="roles">
+ <h2><%= t.osm.relation_member_roles %></h2>
+ <table id="grid-roles">
+ </table>
+ </div>
<div id="fulltext">
<h2><%= t.pages.search.fulltext %></h2>
<p class="boxpre" style="color: #f00000;">This search is experimental. It shows keys and tags that might be related to the word you searched for. This doesn't work if there are several words.</p>
diff --git a/web/viewsjs/search.js.erb b/web/viewsjs/search.js.erb
index 5ce7e72..9dcafa2 100644
--- a/web/viewsjs/search.js.erb
+++ b/web/viewsjs/search.js.erb
@@ -3,17 +3,22 @@
misc = @trans.t.misc
search = @trans.t.pages.search
%>
-function link_to_key_with_highlight(key, highlight) {
+
+function highlight(str, query) {
+ return str.replace(new RegExp('(' + query + ')', 'gi'), "<b>$1</b>")
+}
+
+function link_to_key_with_highlight(key, query) {
return link(
url_for_key(key),
- key.replace(new RegExp('(' + highlight + ')', 'gi'), "<b>$1</b>")
+ highlight(key, query)
);
}
-function link_to_value_with_highlight(key, value, highlight) {
+function link_to_value_with_highlight(key, value, query) {
return link(
url_for_tag(key, value),
- value.replace(new RegExp('(' + highlight + ')', 'gi'), "<b>$1</b>")
+ highlight(value, query)
);
}
@@ -60,6 +65,28 @@ var create_flexigrid_for = {
}
});
},
+ roles: function(query) {
+ create_flexigrid('grid-roles', {
+ url: '/api/4/search/by_role?query=' + encodeURIComponent(query),
+ colModel: [
+ { display: '<%= misc.count %>', name: 'count_all', width: 80, sortable: true, align: 'right' },
+ { display: '<%= osm.relation_types %>', name: 'rtype', width: 250, sortable: true },
+ { display: '<%= osm.relation_member_roles %>', name: 'role', width: 500, sortable: true }
+ ],
+ sortname: 'count_all',
+ sortorder: 'desc',
+ preProcess: function(data) {
+ data.rows = jQuery.map(data.data, function(row, i) {
+ return { 'cell': [
+ fmt_with_ts(row.count_all),
+ link_to_rtype(row.rtype),
+ highlight(html_escape(row.role), query)
+ ] };
+ });
+ return data;
+ }
+ });
+ },
tags: function(query) {
var q = query.split('=', 2);
create_flexigrid('grid-tags', {