Can now use pipeline as query
This commit is contained in:
1 parent
41552040cc
commit
e305aa8f2a
16 files changed
+323
-123
No files matched your search
@@ -1,56 +1,105 @@
|
||||
root = this;
|
||||
|
||||
|
||||
root.controllers.controller('documentCtrl', ['$scope', '$routeParams', '$location', 'util', ($scope, $routeParams, $location, util) ->
|
||||
$scope.idx = $routeParams.idx
|
||||
$scope.doc = {}
|
||||
$scope.idx = Number($routeParams.idx) or 1
|
||||
$scope.meta = {}
|
||||
$scope.query = $routeParams.query or ""
|
||||
$scope.notfound = false
|
||||
$scope.error = ""
|
||||
$scope.codeMirrorOptions =
|
||||
lineWrapping : true
|
||||
lineNumbers: true
|
||||
mode: 'text/typescript'
|
||||
|
||||
url = "/api/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }"
|
||||
if $routeParams.query
|
||||
url = "#{url}/query/#{$routeParams.query}"
|
||||
if $routeParams.idx
|
||||
url = "#{ url }/idx/#{$routeParams.idx - 1}"
|
||||
else if $routeParams.id
|
||||
url = "#{ url }/_id/#{$routeParams.id}"
|
||||
$scope.raw_url = url
|
||||
util.get(url).then((res) ->
|
||||
$scope.doc = res.data.document
|
||||
$scope.meta = res.data.meta
|
||||
$scope.enlapsed_time = res.data.enlapsed_time
|
||||
).catch( (res) ->
|
||||
if res.data.error == "not found"
|
||||
$scope.notfound = true
|
||||
root.controllers.controller('documentCtrl', ['$scope', '$routeParams', '$location', 'util', 'documentCtrlUtil', ($scope, $routeParams, $location, util, documentCtrlUtil) ->
|
||||
|
||||
$scope.initScopeVariables = ->
|
||||
$scope.idx = $routeParams.idx
|
||||
$scope.doc = {}
|
||||
$scope.idx = Number($routeParams.idx) or 1
|
||||
$scope.meta = {}
|
||||
$scope.query = $routeParams.query or $routeParams.pipeline or ""
|
||||
$scope.notfound = false
|
||||
$scope.error = ""
|
||||
$scope.codeMirrorOptions =
|
||||
lineWrapping : true
|
||||
lineNumbers: true
|
||||
mode: 'text/javascript'
|
||||
|
||||
$scope.init = ->
|
||||
$scope.initScopeVariables()
|
||||
url = documentCtrlUtil.getUrl($routeParams)
|
||||
$scope.raw_url = url
|
||||
|
||||
if $scope.isDocumentFromPipeline()
|
||||
promise = documentCtrlUtil.getPipeline(url, $scope.idx - 1)
|
||||
else
|
||||
promise = util.get(url)
|
||||
|
||||
promise.then((res) ->
|
||||
$scope.doc = res.data.document
|
||||
$scope.meta = res.data.meta
|
||||
$scope.total = res.data.meta.count + $scope.idx - 1
|
||||
$scope.enlapsed_time = res.data.enlapsed_time
|
||||
).catch((res) ->
|
||||
$scope.error = res.data.error
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
$scope.isDocumentFromPipeline = ->
|
||||
return $routeParams.pipeline
|
||||
|
||||
$scope.search = (query) ->
|
||||
if query == ""
|
||||
return ""
|
||||
$location.path "/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }/idx/1/query/#{query}"
|
||||
|
||||
|
||||
$scope.executePipeline = (pipeline) ->
|
||||
if pipeline == ""
|
||||
return
|
||||
$location.path "/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }/idx/1/pipeline/#{pipeline}"
|
||||
|
||||
$scope.previousDocumentUrl = () ->
|
||||
url = "#/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }/idx/#{$scope.idx - 1}"
|
||||
if $routeParams.query
|
||||
url = "#{url}/query/#{$routeParams.query}"
|
||||
return url
|
||||
return '#' + $location.path().replace(/\/idx\/\d+/, "/idx/#{$scope.idx - 1}")
|
||||
|
||||
$scope.nextDocumentUrl = () ->
|
||||
url = "#/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }/idx/#{$scope.idx + 1}"
|
||||
if $routeParams.query
|
||||
url = "#{url}/query/#{$routeParams.query}"
|
||||
return url
|
||||
return '#' + $location.path().replace(/\/idx\/\d+/, "/idx/#{$scope.idx + 1}")
|
||||
|
||||
$scope.hasPreviousDocument = () ->
|
||||
$scope.idx > 1
|
||||
|
||||
$scope.hasNextDocument = ->
|
||||
$scope.total > 0 and $scope.idx < $scope.total
|
||||
|
||||
$scope.init()
|
||||
])
|
||||
|
||||
|
||||
root = this
|
||||
|
||||
root.services.factory('documentCtrlUtil', ['util', (util)->
|
||||
service =
|
||||
_cache: {}
|
||||
|
||||
getUrl: ($routeParams) ->
|
||||
url = "/api/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }"
|
||||
if $routeParams.query
|
||||
url = "#{url}/query/#{$routeParams.query}"
|
||||
else if $routeParams.pipeline
|
||||
return "#{url}/pipeline/#{$routeParams.pipeline}"
|
||||
|
||||
if $routeParams.idx
|
||||
url = "#{ url }/idx/#{$routeParams.idx - 1}"
|
||||
else if $routeParams.id
|
||||
url = "#{ url }/_id/#{$routeParams.id}"
|
||||
return url
|
||||
|
||||
wrapPipelinePromise: (promise, idx) ->
|
||||
return promise.then (res) ->
|
||||
ret =
|
||||
data:
|
||||
document: res.data.document[idx]
|
||||
meta:
|
||||
count: res.data.document.length - idx
|
||||
enlapsed_time: res.data.enlapsed_time
|
||||
|
||||
return promise
|
||||
|
||||
getPipeline: (url, idx) ->
|
||||
if url in _.keys(service._cache)
|
||||
return service.wrapPipelinePromise(service._cache[url], idx)
|
||||
service._cache[url] = util.get(url)
|
||||
return service.getPipeline(url, idx)
|
||||
|
||||
return service
|
||||
|
||||
]);
|
||||
@@ -22,13 +22,16 @@ getAxisLabel = (min, stepSize, numberOfBins) ->
|
||||
root.controllers.controller('keyStatCtrl', ['$scope', '$routeParams', '$location', 'util', ($scope, $routeParams, $location, util) ->
|
||||
$scope.name = $routeParams.key
|
||||
$scope.stats = []
|
||||
$scope.queryObject = $routeParams.query or '{}'
|
||||
$scope.queryObject = $routeParams.query or $routeParams.pipeline or '{}'
|
||||
|
||||
base_url = "/api/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }/query/#{$scope.queryObject}"
|
||||
base_url = "/api/#{ $routeParams.server }/#{ $routeParams.database }/#{ $routeParams.collection }"
|
||||
if $routeParams.pipeline
|
||||
base_url = "#{base_url}/pipeline/#{$routeParams.pipeline}"
|
||||
else
|
||||
base_url = "#{base_url}/query/#{$scope.queryObject}"
|
||||
stat_url = "#{ base_url }/stats/#{$routeParams.key}"
|
||||
|
||||
$scope.alert=alert
|
||||
|
||||
|
||||
$scope.chartConfig =
|
||||
options:
|
||||
chart:
|
||||
@@ -54,8 +57,8 @@ root.controllers.controller('keyStatCtrl', ['$scope', '$routeParams', '$location
|
||||
return ""
|
||||
r = $routeParams
|
||||
$location.path "/#{ r.server }/#{ r.database }/#{ r.collection }/stats/#{ r.key }/query/#{query}"
|
||||
|
||||
|
||||
|
||||
|
||||
util.get(stat_url).then((res) ->
|
||||
for key, val of res.data
|
||||
$scope.stats.push({name: humanValueOfStatisticalAbreviation[key], value: val })
|
||||
@@ -68,6 +71,5 @@ root.controllers.controller('keyStatCtrl', ['$scope', '$routeParams', '$location
|
||||
$scope.chartConfig.series[0].data = res.data.values
|
||||
$scope.chartConfig.xAxis.categories = getAxisLabel(res.data.min, res.data.step_size, res.data.values.length)
|
||||
)
|
||||
|
||||
])
|
||||
|
||||
])
|
||||
@@ -5,16 +5,16 @@ joinArray = (a, b)->
|
||||
return a
|
||||
|
||||
root.controllers.controller('topBarCtrl', ['$scope', '$location', ($scope, $location) ->
|
||||
|
||||
|
||||
$scope.loading = false
|
||||
|
||||
|
||||
$scope.$on('$routeChangeSuccess', (next, current) ->
|
||||
$scope.path = _.filter($location.path().split("/"), (s) -> s)
|
||||
if $scope.path[5] == "query"
|
||||
if $scope.path[5] in ["query", "pipeline"]
|
||||
$scope.path = joinArray($scope.path[0...6], $scope.path[7...-1])
|
||||
$scope.getHistoryUrl = (idx) ->
|
||||
ret = "#/" + ($scope.path[i] for i in [0...idx]).join("/")
|
||||
if _.indexOf(["idx", "geojson", "query", "_id", "field", "all", "stats"], $scope.path[idx]) != -1
|
||||
if _.indexOf(["idx", "geojson", "query", "_id", "field", "all", "stats", "pipeline"], $scope.path[idx]) != -1
|
||||
return ""
|
||||
if idx == 0
|
||||
ret += "servers"
|
||||
@@ -28,7 +28,7 @@ root.controllers.controller('topBarCtrl', ['$scope', '$location', ($scope, $loca
|
||||
)
|
||||
$scope.$on "loading", ()->
|
||||
$scope.loading = true
|
||||
|
||||
|
||||
$scope.$on "loadingFinished", ()->
|
||||
$scope.loading = false
|
||||
])
|
||||
])
|
||||
@@ -26,10 +26,12 @@ getStatsUrl = (keyName, routeParams)->
|
||||
ret = "#/#{r.server}/#{r.database}/#{r.collection}/stats/#{ keyName }"
|
||||
if r.query
|
||||
ret = "#{ ret }/query/#{ r.query }"
|
||||
else if r.pipeline
|
||||
ret = "#{ret}/pipeline/#{r.pipeline}"
|
||||
return ret
|
||||
|
||||
directive = () ->
|
||||
directive =
|
||||
directive =
|
||||
templateUrl: "/partials/directives/key.html"
|
||||
replace: true,
|
||||
transclude: false,
|
||||
@@ -39,6 +41,7 @@ directive = () ->
|
||||
value: "="
|
||||
indexes: "="
|
||||
controller:["$scope", "$routeParams", ($scope, $routeParams) ->
|
||||
$scope.indexes = $scope.indexes or []
|
||||
$scope.canMakeHistogram = _.isNumber($scope.value)
|
||||
$scope.statsUrl = getStatsUrl($scope.keyName, $routeParams)
|
||||
$scope.hasIndexDesc = hasIndexDesc($scope.keyName, $scope.indexes)
|
||||
@@ -56,5 +59,5 @@ directive = () ->
|
||||
return "#{url}/geojson/#{$scope.keyName}"
|
||||
]
|
||||
return directive
|
||||
|
||||
|
||||
directives.directive( "vulKey", [directive])
|
||||
@@ -2,17 +2,17 @@
|
||||
mongoJsToMongoJSON = (queryString) ->
|
||||
ObjectId = (id) ->
|
||||
return {"$oid": id}
|
||||
|
||||
|
||||
DBRef = (name, id) ->
|
||||
return {"$ref": name, "$id": id}
|
||||
|
||||
|
||||
Timestamp = (t, i) ->
|
||||
return {"t": t, "i": i}
|
||||
NumberLong = (number) ->
|
||||
return { "$numberLong": String(number)}
|
||||
MaxKey = { "$maxKey": 1 }
|
||||
MinKey = { "$minKey": 1 }
|
||||
|
||||
|
||||
query = ""
|
||||
eval("query = " + queryString)
|
||||
fixQuery = (query) ->
|
||||
@@ -35,7 +35,7 @@ mongoJsToMongoJSON = (queryString) ->
|
||||
query[k] = fixQuery(v)
|
||||
return query
|
||||
return query
|
||||
|
||||
|
||||
return fixQuery(query)
|
||||
|
||||
testmongoJsToMongoJSON = () ->
|
||||
@@ -57,27 +57,29 @@ testmongoJsToMongoJSON = () ->
|
||||
]
|
||||
}"""
|
||||
assertEqual(mongoJsToMongoJSON(s), {a: [1,3, {reg: [{ "$regex":"allo", "$options": "mgi" }, {"$date": 1399585944320}]}]})
|
||||
|
||||
|
||||
|
||||
testmongoJsToMongoJSON()
|
||||
|
||||
directive = () ->
|
||||
directive =
|
||||
directive =
|
||||
templateUrl: "/partials/directives/searchBar.html"
|
||||
replace: true,
|
||||
transclude: false,
|
||||
restrict: 'E',
|
||||
scope:
|
||||
query: "@"
|
||||
callback: "="
|
||||
querycallback: "="
|
||||
pipelinecallback: "="
|
||||
controller:["$scope", "$routeParams", ($scope, $routeParams) ->
|
||||
$scope.bigInput = false
|
||||
$scope.newQuery = $scope.query or ""
|
||||
$scope.codeMirrorOptions =
|
||||
lineWrapping : true
|
||||
lineNumbers: true
|
||||
indentUnit: 4
|
||||
mode: 'text/typescript'
|
||||
|
||||
|
||||
$scope.parseQueryToJSON = (query) ->
|
||||
try
|
||||
query = mongoJsToMongoJSON(query)
|
||||
@@ -87,18 +89,29 @@ directive = () ->
|
||||
catch error
|
||||
$scope.error
|
||||
return ""
|
||||
|
||||
$scope.isValidEntry = ()->
|
||||
|
||||
$scope.isValidQueryEntry = ()->
|
||||
query = $scope.parseQueryToJSON($scope.newQuery)
|
||||
return query != ""
|
||||
|
||||
$scope.callCallback = () ->
|
||||
return query != "" and not _.isArray(JSON.parse(query))
|
||||
|
||||
$scope.isValidPipelineEntry = ()->
|
||||
query = $scope.parseQueryToJSON($scope.newQuery)
|
||||
if query != ""
|
||||
query != "" and _.isArray(JSON.parse(query))
|
||||
|
||||
$scope.queryCallback = () ->
|
||||
if $scope.isValidQueryEntry()
|
||||
query = $scope.parseQueryToJSON($scope.newQuery)
|
||||
f = () ->
|
||||
$scope.callback(query)
|
||||
$scope.querycallback(query)
|
||||
$scope.$eval(f)
|
||||
|
||||
$scope.pipelineCallback = () ->
|
||||
if $scope.isValidPipelineEntry()
|
||||
query = $scope.parseQueryToJSON($scope.newQuery)
|
||||
f = () ->
|
||||
$scope.pipelinecallback(query)
|
||||
$scope.$eval(f)
|
||||
]
|
||||
return directive
|
||||
|
||||
directives.directive( "vulSearchBar", [directive])
|
||||
|
||||
directives.directive( "vulSearchBar", [directive])
|
||||
@@ -30,7 +30,7 @@ directive = () ->
|
||||
return "#/#{rp.server}/#{rp.database}/#{rp.collection}/_id/#{s.docId}/field/#{s.key}"
|
||||
$scope.isObjectId = (val) ->
|
||||
objectIdRegexp = /^[01234567890abcdef]{24}$/
|
||||
return _.isString(val) and objectIdRegexp.test(val)
|
||||
_.isString(val) and objectIdRegexp.test(val)
|
||||
|
||||
$scope.getDateFromObjectId = (objectId) ->
|
||||
util.parseObjectId(objectId).date.toISOString()
|
||||
|
||||
@@ -6,7 +6,9 @@ root.filters.filter 'escape', () ->
|
||||
|
||||
root.filters.filter 'replaceAllCommasBySpaces', () ->
|
||||
return (text) ->
|
||||
return text.replace(new RegExp(",","g"), " ")
|
||||
if _.isString(text)
|
||||
return text.replace(new RegExp(",","g"), " ")
|
||||
return text
|
||||
|
||||
root.filters.filter 'niceJSON', () ->
|
||||
return (obj) ->
|
||||
@@ -21,4 +23,4 @@ root.filters.filter 'onlyNthLines', () ->
|
||||
if not _.isString(text)
|
||||
return ""
|
||||
s = text.split("\n")
|
||||
return s[0...n].join("\n")
|
||||
return s[0...n].join("\n")
|
||||
@@ -16,15 +16,17 @@ config(['$routeProvider', ($routeProvider) ->
|
||||
$routeProvider.when('/servers', {templateUrl: 'partials/servers.html', controller: 'serversCtrl'})
|
||||
$routeProvider.when('/about', {templateUrl: 'partials/about.html', controller: 'aboutCtrl'})
|
||||
$routeProvider.when('/:server/databases', {templateUrl: 'partials/databases.html', controller: 'databasesCtrl'})
|
||||
|
||||
|
||||
$routeProvider.when('/:server/:database/collections', {templateUrl: 'partials/collections.html', controller: 'collectionsCtrl'})
|
||||
$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/stats/:key/query/:query', {templateUrl: 'partials/keyStat.html', controller: 'keyStatCtrl'})
|
||||
$routeProvider.when('/:server/:database/:collection/stats/:key/pipeline/:pipeline', {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/:idx/pipeline/:pipeline', {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/all/geojson/:key/location/:loc', {templateUrl: 'partials/geojsonmap.html', controller: 'geojsonmapCtrl'})
|
||||
$routeProvider.when('/:server/:database/:collection/idx/:idx/geojson/:key', {templateUrl: 'partials/geojsonmap.html', controller: 'geojsonmapCtrl'})
|
||||
@@ -33,7 +35,7 @@ config(['$routeProvider', ($routeProvider) ->
|
||||
$routeProvider.when('/:server/:database/:collection/idx/all/query/:query/geojson/:key/location/:loc', {templateUrl: 'partials/geojsonmap.html', controller: 'geojsonmapCtrl'})
|
||||
$routeProvider.when('/:server/:database/:collection/idx/:idx/query/:query/geojson/:key', {templateUrl: 'partials/geojsonmap.html', controller: 'geojsonmapCtrl'})
|
||||
$routeProvider.when('/:server/:database/:collection/idx/:idx/query/:query/geojson/:key/location/:loc', {templateUrl: 'partials/geojsonmap.html', controller: 'geojsonmapCtrl'})
|
||||
|
||||
|
||||
$routeProvider.otherwise({redirectTo: '/servers'})
|
||||
])
|
||||
|
||||
@@ -41,4 +43,3 @@ root.filters = angular.module('vulture.filters', [])
|
||||
root.services = angular.module('vulture.services', [])
|
||||
root.directives = angular.module('vulture.directives', [])
|
||||
root.controllers = angular.module('vulture.controllers', [])
|
||||
|
||||
Reference in new issue
Block a user