Work in progress
This commit is contained in:
parent
0ebd6300cd
commit
5b6e883e4c
@ -36,7 +36,7 @@ import (
|
|||||||
var db *sql.DB
|
var db *sql.DB
|
||||||
|
|
||||||
func executeQuery(rw http.ResponseWriter, req *http.Request) {
|
func executeQuery(rw http.ResponseWriter, req *http.Request) {
|
||||||
var request jsonRequest
|
var request jsonQueryRequest
|
||||||
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||||||
http.Error(rw, err.Error(), http.StatusInternalServerError)
|
http.Error(rw, err.Error(), http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
@ -49,6 +49,9 @@ func executeQuery(rw http.ResponseWriter, req *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
context := queryContext{geo, convertFeatures(request.Profile), request.WalkingDist}
|
context := queryContext{geo, convertFeatures(request.Profile), request.WalkingDist}
|
||||||
|
entries := getRecords(context)
|
||||||
|
|
||||||
|
foundEntries := findRecords(entries, featureMap(request.Features), request.MinScore)
|
||||||
|
|
||||||
// function runQuery(query, callback) {
|
// function runQuery(query, callback) {
|
||||||
// query.profile = fixupProfile(query.profile);
|
// query.profile = fixupProfile(query.profile);
|
||||||
|
36
types.go
36
types.go
@ -35,7 +35,7 @@ type jsonGeo struct {
|
|||||||
Valid bool `json:"valid"`
|
Valid bool `json:"valid"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type jsonRequest struct {
|
type jsonQueryRequest struct {
|
||||||
Features jsonFeatureMap `json:"features"`
|
Features jsonFeatureMap `json:"features"`
|
||||||
Geo *jsonGeo `json:"geo"`
|
Geo *jsonGeo `json:"geo"`
|
||||||
HintSteps int `json:"hintSteps"`
|
HintSteps int `json:"hintSteps"`
|
||||||
@ -46,6 +46,38 @@ type jsonRequest struct {
|
|||||||
WalkingDist float64 `json:"walkingDist"`
|
WalkingDist float64 `json:"walkingDist"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type jsonColumn struct {
|
||||||
|
Hints []jsonProjection `json:"hints"`
|
||||||
|
Steps int `json:"steps"`
|
||||||
|
Value float64 `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type jsonProjection struct {
|
||||||
|
Sample float64 `json:"sample"`
|
||||||
|
Stats jsonStats `json:"stats"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type jsonStats struct {
|
||||||
|
Compatibility float64 `json:"compatibility"`
|
||||||
|
Count int `json:"count"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type jsonRecord struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Score float64 `json:"score"`
|
||||||
|
DistanceToUser float64 `json:"distanceToUser"`
|
||||||
|
DistanceToStn float64 `json:"distanceToStn"`
|
||||||
|
ClosestStn string `json:"closestStn"`
|
||||||
|
AccessCount int `json:"accessCount"`
|
||||||
|
Id int `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type jsonQueryResponse struct {
|
||||||
|
Columns map[string]jsonColumn `json:"columns"`
|
||||||
|
Count int `json:"count"`
|
||||||
|
Items []jsonRecord `json:"items"`
|
||||||
|
}
|
||||||
|
|
||||||
type jsonCategory struct {
|
type jsonCategory struct {
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
Id int `json:"id"`
|
Id int `json:"id"`
|
||||||
@ -97,6 +129,7 @@ type geoContext struct {
|
|||||||
|
|
||||||
type record struct {
|
type record struct {
|
||||||
accessCount int
|
accessCount int
|
||||||
|
closestStn string
|
||||||
compatibility float64
|
compatibility float64
|
||||||
distanceToStn float64
|
distanceToStn float64
|
||||||
distanceToUser float64
|
distanceToUser float64
|
||||||
@ -105,6 +138,7 @@ type record struct {
|
|||||||
id int
|
id int
|
||||||
name string
|
name string
|
||||||
score float64
|
score float64
|
||||||
|
url string
|
||||||
}
|
}
|
||||||
|
|
||||||
type records []record
|
type records []record
|
||||||
|
39
util.go
39
util.go
@ -78,14 +78,15 @@ func stepRange(bounds queryBounds, steps int, callback func(float64)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func findRecords(entries records, features featureMap, minScore float64) {
|
func findRecords(entries records, features featureMap, minScore float64) records {
|
||||||
var foundRecords records
|
var foundEntries records
|
||||||
|
|
||||||
walkMatches(entries, features, minScore, func(record record, score float64) {
|
walkMatches(entries, features, minScore, func(record record, score float64) {
|
||||||
foundRecords = append(foundRecords, record)
|
foundEntries = append(foundEntries, record)
|
||||||
})
|
})
|
||||||
|
|
||||||
sort.Sort(foundRecords)
|
sort.Sort(foundEntries)
|
||||||
|
return foundEntries
|
||||||
}
|
}
|
||||||
|
|
||||||
func project(entries records, features featureMap, featureName string, minScore float64, bounds queryBounds, steps int) []queryProjection {
|
func project(entries records, features featureMap, featureName string, minScore float64, bounds queryBounds, steps int) []queryProjection {
|
||||||
@ -191,3 +192,33 @@ func computeRecordPopularity(entries records, context queryContext) {
|
|||||||
record.features["compatibility"] = compatibility
|
record.features["compatibility"] = compatibility
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getRecords(context queryContext) records {
|
||||||
|
rows, err := db.Query("SELECT name, url, delicious, accomodating, affordable, atmospheric, latitude, longitude, distanceToStn, closestStn, accessCount, id FROM reviews")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var entries []record
|
||||||
|
for rows.Next() {
|
||||||
|
var name, url, closestStn string
|
||||||
|
var delicious, accomodating, affordable, atmospheric, latitude, longitude, distanceToStn float64
|
||||||
|
var accessCount, id int
|
||||||
|
|
||||||
|
rows.Scan(&name, &url, &delicious, &accomodating, &affordable, &atmospheric, &latitude, &longitude, &distanceToStn, &closestStn, &accessCount, &id)
|
||||||
|
|
||||||
|
entry := record{name: name, url: url, distanceToStn: distanceToStn, closestStn: closestStn, accessCount: accessCount, id: id}
|
||||||
|
entry.features["delicious"] = delicious
|
||||||
|
entry.features["accomodating"] = accomodating
|
||||||
|
entry.features["affordable"] = affordable
|
||||||
|
entry.features["atmospheric"] = atmospheric
|
||||||
|
entry.geo = geoContext{latitude, longitude}
|
||||||
|
|
||||||
|
entries = append(entries, entry)
|
||||||
|
}
|
||||||
|
if err := rows.Err(); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return entries
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user