1
0
Fork 0

added export feature for documents and for query results

This commit is contained in:
Heiko Kernbach 2014-08-22 16:54:53 +02:00
parent 1ad3f36d90
commit 1218d3b35b
8 changed files with 121 additions and 3 deletions

View File

@ -391,6 +391,23 @@ controller.get("/query/download/:user", function(req, res) {
}).summary("Download all user queries")
.notes("This function downloads all user queries from the given user");
/** Download a query result
*
* Download and export all queries from the given username.
*
*/
controller.get("/query/result/download/:query", function(req, res) {
var query = req.params("query");
var result = db._query(query).toArray();
res.set("Content-Type", "application/json");
res.set("Content-Disposition", "attachment; filename=results.json");
res.json(result);
}).summary("Download the result of a query")
.notes("This function downloads the result of a user query.");
// -----------------------------------------------------------------------------
// --SECTION-- END-OF-FILE
// -----------------------------------------------------------------------------

View File

@ -8,6 +8,10 @@
filters: [],
MAX_SORT: 12000,
lastQuery: {},
sortAttribute: "_key",
url: '/_api/documents',
@ -157,7 +161,7 @@
query = "FOR x in @@collection";
query += this.setFiltersForQuery(bindVars);
// Sort result, only useful for a small number of docs
if (this.getTotal() < 12000) {
if (this.getTotal() < this.MAX_SORT) {
if (this.getSort() === '_key') {
query += " SORT TO_NUMBER(x." + this.getSort() + ") == 0 ? x."
+ this.getSort() + " : TO_NUMBER(x." + this.getSort() + ")";
@ -210,6 +214,7 @@
});
});
}
self.lastQuery = queryObj;
callback();
window.progressView.hide();
},
@ -224,6 +229,30 @@
this.reset();
},
buildDownloadDocumentQuery: function() {
var self = this, query, queryObj, bindVars;
bindVars = {
"@collection": this.collectionID
};
query = "FOR x in " + this.collectionID;
query += this.setFiltersForQuery(bindVars);
// Sort result, only useful for a small number of docs
if (this.getTotal() < this.MAX_SORT) {
query += " SORT x." + this.getSort();
}
query += " RETURN x";
queryObj = {
query: query,
bindVars: bindVars
};
return query;
},
updloadDocuments : function (file) {
var result;
$.ajax({

View File

@ -25,6 +25,11 @@
<span class="icon_arangodb_import" title="Upload documents from JSON file"></span>
</a>
</li>
<li class="enabled">
<a id="exportCollection" class="headerButton">
<span class="icon_arangodb_export" title="Download documents as JSON file"></span>
</a>
</li>
<li class="enabled">
<a id="indexCollection" class="headerButton">
<span class="icon_arangodb_checklist" title="Index collection"></span>
@ -68,6 +73,13 @@
</div>
</div>
<div id="exportHeader" class="headerDropdown">
<div class="queryline">
<div style="float:left; margin-top:7px"><i class="fa fa-exclamation-circle"></i>Please be careful. If no filter is set, the whole collection will be downloaded.</div>
<button id="exportDocuments" class="button-success btn-old-padding" style="float:right">Download JSON</button>
</div>
</div>
<div id="editHeader" class="dropdownImport">
<div class="queryline">
<div style="float:left; margin-top:5px"><div style="float:left" class="selectedCount">0</div> . Documents selected</div>

View File

@ -84,7 +84,7 @@
</div>
<div id="queryOutput" class="contentDiv query-output">
</div>
<button id="downloadQueryResult" class="button-success query-button">Download</button>
</div>
</div>

View File

@ -63,6 +63,7 @@
"click #markDocuments" : "editDocuments",
"click #indexCollection" : "indexCollection",
"click #importCollection" : "importCollection",
"click #exportCollection" : "exportCollection",
"click #filterSend" : "sendFilter",
"click #addFilterItem" : "addFilterItem",
"click .removeFilterItem" : "removeFilterItem",
@ -83,6 +84,7 @@
"click #importModal" : "showImportModal",
"click #resetView" : "resetView",
"click #confirmDocImport" : "startUpload",
"click #exportDocuments" : "startDownload",
"change #newIndexType" : "selectIndexType",
"click #createIndex" : "createIndex",
"click .deleteIndex" : "prepDeleteIndex",
@ -166,6 +168,17 @@
this.collection.getDocuments(this.getDocsCallback.bind(this));
},
startDownload: function() {
var query = this.collection.buildDownloadDocumentQuery();
if (query !== '' || query !== undefined || query !== null) {
window.open(encodeURI("query/result/download/" + query));
}
else {
arangoHelper.arangoError("Document error", "could not download documents");
}
},
startUpload: function () {
var result;
if (this.allowUpload === true) {
@ -244,27 +257,33 @@
}
},
//need to make following functions automatically!
editDocuments: function () {
$('#indexCollection').removeClass('activated');
$('#importCollection').removeClass('activated');
$('#exportCollection').removeClass('activated');
this.markFilterToggle();
$('#markDocuments').toggleClass('activated'); this.changeEditMode();
$('#filterHeader').hide();
$('#importHeader').hide();
$('#indexHeader').hide();
$('#editHeader').slideToggle(200);
$('#exportHeader').hide();
},
filterCollection : function () {
$('#indexCollection').removeClass('activated');
$('#importCollection').removeClass('activated');
$('#exportCollection').removeClass('activated');
$('#markDocuments').removeClass('activated'); this.changeEditMode(false);
this.markFilterToggle();
this.activeFilter = true;
$('#filterHeader').slideToggle(200);
$('#importHeader').hide();
$('#indexHeader').hide();
$('#editHeader').hide();
$('#exportHeader').hide();
$('#filterHeader').slideToggle(200);
var i;
for (i in this.filters) {
@ -275,20 +294,37 @@
}
},
exportCollection: function () {
$('#indexCollection').removeClass('activated');
$('#importCollection').removeClass('activated');
$('#filterHeader').removeClass('activated');
$('#markDocuments').removeClass('activated'); this.changeEditMode(false);
$('#exportCollection').addClass('activated');
this.markFilterToggle();
$('#exportHeader').slideToggle(200);
$('#importHeader').hide();
$('#indexHeader').hide();
$('#filterHeader').hide();
$('#editHeader').hide();
},
importCollection: function () {
this.markFilterToggle();
$('#indexCollection').removeClass('activated');
$('#markDocuments').removeClass('activated'); this.changeEditMode(false);
$('#importCollection').toggleClass('activated');
$('#exportCollection').removeClass('activated');
$('#importHeader').slideToggle(200);
$('#filterHeader').hide();
$('#indexHeader').hide();
$('#editHeader').hide();
$('#exportHeader').hide();
},
indexCollection: function () {
this.markFilterToggle();
$('#importCollection').removeClass('activated');
$('#exportCollection').removeClass('activated');
$('#markDocuments').removeClass('activated'); this.changeEditMode(false);
$('#indexCollection').toggleClass('activated');
$('#newIndexView').hide();
@ -297,6 +333,7 @@
$('#importHeader').hide();
$('#editHeader').hide();
$('#filterHeader').hide();
$('#exportHeader').hide();
},
changeEditMode: function (enable) {

View File

@ -38,6 +38,7 @@
'click #arangoQueryTable .table-cell2 a': 'deleteAQL',
'click #confirmQueryImport': 'importCustomQueries',
'click #confirmQueryExport': 'exportCustomQueries',
'click #downloadQueryResult': 'downloadQueryResult',
'click #importQueriesToggle': 'showImportMenu'
},
@ -295,6 +296,17 @@
}
},
downloadQueryResult: function() {
var inputEditor = ace.edit("aqlEditor");
var query = inputEditor.getValue();
if (query !== '' || query !== undefined || query !== null) {
window.open(encodeURI("query/result/download/" + query));
}
else {
arangoHelper.arangoError("Query error", "could not query result.");
}
},
exportCustomQueries: function () {
var name, toExport = {}, exportArray = [];
_.each(this.customQueries, function(value, key) {

View File

@ -125,3 +125,9 @@
.ace_error {
background: none !important;
}
#exportHeader .fa-exclamation-circle {
color: $c-nav-bg;
font-size: 13pt;
margin-right: 10px;
}

View File

@ -6116,3 +6116,8 @@ table .sorting {
.ace_error {
background: none !important; }
#exportHeader .fa-exclamation-circle {
color: #333232;
font-size: 13pt;
margin-right: 10px; }