diff --git a/api.go b/api.go index 9f2a51c..7a0ae61 100644 --- a/api.go +++ b/api.go @@ -131,6 +131,33 @@ func (this *VultureBackend) wrapDocumentWithMetadata(doc interface{}, query *mgo return ret, nil } +func (this *VultureBackend) GetStat(key string) (interface{}, error) { + s := NewStatAggregator() + query := bson.M{key: bson.M{"$exists": true}} + iter := this.Collection.Find(query).Select(bson.M{key: 1}).Iter() + result := make(map[string]interface{}) + + in := make(chan float64) + out := make(chan *Stats) + go s.AddStats(in, out) + + for iter.Next(&result) { + + if val, ok := result[key]; ok { + if fval, isFloat := val.(float64); isFloat { + in <- fval + } else if ival, isInt := val.(int); isInt { + in <- float64(ival) + } + } + } + close(in) + if err := iter.Close(); err != nil { + return nil, err + } + return <-out, nil +} + func (this *VultureBackend) GetAllDocuments(query interface{}) (interface{}, error) { var result []map[string]interface{} @@ -241,3 +268,17 @@ func getDocumentByQueryAndIndex(w http.ResponseWriter, request *http.Request) (i } return vb.GetDocumentByIndex(index, query) } + +func getStats(w http.ResponseWriter, request *http.Request) (interface{}, error) { + vb, err := GetVultureBackend(request) + if err != nil { + return nil, err + } + + vars := mux.Vars(request) + key, ok := vars["key"] + if !ok { + return nil, errors.New("key field not specified") + } + return vb.GetStat(key) +} diff --git a/client/coffee/controllers/keyStatCtrl.coffee b/client/coffee/controllers/keyStatCtrl.coffee new file mode 100644 index 0000000..f455c7b --- /dev/null +++ b/client/coffee/controllers/keyStatCtrl.coffee @@ -0,0 +1,22 @@ +root = this; + +humanValueOfStatisticalAbreviation = + mean: "mean" + std: "standard deviation" + var: "variance" + + +root.controllers.controller('keyStatCtrl', ['$scope', '$routeParams', '$http', ($scope, $routeParams, $http) -> + $scope.name = "didier!" + $scope.stats = [] + + url = "/api/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }" + url = "#{ url }/stats/#{$routeParams.key}" + + $http.get(url).then((res) -> + for key, val of res.data + $scope.stats.push({name: humanValueOfStatisticalAbreviation[key], value: val }) + ) + +]) + diff --git a/client/coffee/directives/key.coffee b/client/coffee/directives/key.coffee index 7d55c84..827f426 100644 --- a/client/coffee/directives/key.coffee +++ b/client/coffee/directives/key.coffee @@ -15,6 +15,10 @@ hasIndexDesc = (keyName, indexes) -> has2dIndex = (keyName, indexes) -> hasIndex("$2dsphere:#{keyName}", indexes) +getStatsUrl = (keyName, routeParams)-> + r = routeParams + "#/#{r.server}/#{r.database}/#{r.collection}/stats/#{ keyName }" + directive = () -> directive = templateUrl: "/partials/directives/key.html" @@ -27,6 +31,7 @@ directive = () -> indexes: "=" controller:["$scope", "$routeParams", ($scope, $routeParams) -> $scope.canMakeHistogram = _.isNumber($scope.value) + $scope.statsUrl = getStatsUrl($scope.keyName, $routeParams) $scope.hasIndexDesc = hasIndexDesc($scope.keyName, $scope.indexes) $scope.hasIndexAsc = hasIndexAsc($scope.keyName, $scope.indexes) $scope.has2DIndex = has2dIndex($scope.keyName, $scope.indexes) diff --git a/client/coffee/vultureApp.coffee b/client/coffee/vultureApp.coffee index feb39c6..e8542f0 100644 --- a/client/coffee/vultureApp.coffee +++ b/client/coffee/vultureApp.coffee @@ -18,6 +18,7 @@ config(['$routeProvider', ($routeProvider) -> $routeProvider.when('/:server/:database/:collection/_id/:id', {templateUrl: 'partials/document.html', controller: 'documentCtrl'}) $routeProvider.when('/:server/:database/:collection/_id/:id/field/:field', {templateUrl: 'partials/field.html', controller: 'fieldCtrl'}) $routeProvider.when('/:server/:database/:collection/idx/:idx', {templateUrl: 'partials/document.html', controller: 'documentCtrl'}) + $routeProvider.when('/:server/:database/:collection/stats/:key', {templateUrl: 'partials/keyStat.html', controller: 'keyStatCtrl'}) $routeProvider.when('/:server/:database/:collection/idx/:idx/query/:query', {templateUrl: 'partials/document.html', controller: 'documentCtrl'}) $routeProvider.when('/:server/:database/:collection/idx/all/geojson/:key', {templateUrl: 'partials/geojsonmap.html', controller: 'geojsonmapCtrl'}) $routeProvider.when('/:server/:database/:collection/idx/:idx/geojson/:key', {templateUrl: 'partials/geojsonmap.html', controller: 'geojsonmapCtrl'}) diff --git a/client/index.html b/client/index.html index c0f86b2..6ca2e58 100644 --- a/client/index.html +++ b/client/index.html @@ -31,7 +31,7 @@
{{stat.name}} : {{stat.value | number | replaceAllCommasBySpaces }}
+