From 0a2bbbdbc24d3501547d11085e47d80d1eaf79e5 Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Tue, 24 Mar 2015 12:45:18 +0900 Subject: [PATCH] Work in progress --- server.go | 5 ++--- static/scripts/search.js | 12 +++++------ util.go | 46 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 util.go diff --git a/server.go b/server.go index 395a35e..59c2e16 100644 --- a/server.go +++ b/server.go @@ -24,14 +24,13 @@ package main import ( "database/sql" - "os" - "strings" - // "encoding/json" "encoding/json" _ "github.com/go-sql-driver/mysql" "log" "net/http" + "os" "path/filepath" + "strings" ) var db *sql.DB diff --git a/static/scripts/search.js b/static/scripts/search.js index 0155d61..92aa26a 100644 --- a/static/scripts/search.js +++ b/static/scripts/search.js @@ -28,10 +28,10 @@ function onAdjust(name, value) { _ctx.query.features[name] = value; - $.getJSON('/query', _ctx.query, function(results) { + $.post('/query', JSON.stringify(_ctx.query), function(results) { saveSnapshot(results); outputSnapshot(results, true); - }); + }, 'json'); } function onReady(geo) { @@ -50,11 +50,11 @@ }); window.accessReview = function(id) { - $.getJSON('/access', {id: id, profile: getProfile()}, function(results) { + $.post('/access', JSON.stringify({id: id, profile: getProfile()}), function(results) { if (results.success) { location.replace(results.url); } - }); + }, 'json'); }; onSearch(); @@ -78,7 +78,7 @@ }; } - $.getJSON('/query', _ctx.query, function(results) { + $.post('/query', JSON.stringify(_ctx.query), function(results) { if (!_.has(_ctx, 'grapher')) { _ctx.grapher = new grapher.Grapher({ canvas: new Snap('#svg'), @@ -116,7 +116,7 @@ saveSnapshot(results); outputSnapshot(results, false); - }); + }, 'json'); } function saveSnapshot(results) { diff --git a/util.go b/util.go new file mode 100644 index 0000000..2fe2a36 --- /dev/null +++ b/util.go @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2015 Alex Yatskov + * Author: Alex Yatskov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package main + +type Features map[string]float32 +type Record struct { + features Features +} + +func innerProduct(features1 Features, features2 Features) float32 { + var result float32 + for key, value1 := range features1 { + value2, _ := features2[key] + result += value1 * value2 + } + + return result +} + +func walkMatches(records []Record, features Features, minScore float32, callback func(Record, float32)) { + for _, record := range records { + if score := innerProduct(features, record.features); score >= minScore { + callback(record, score) + } + } +}