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") }).summary("Download all user queries")
.notes("This function downloads all user queries from the given user"); .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 // --SECTION-- END-OF-FILE
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

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

View File

@ -25,6 +25,11 @@
<span class="icon_arangodb_import" title="Upload documents from JSON file"></span> <span class="icon_arangodb_import" title="Upload documents from JSON file"></span>
</a> </a>
</li> </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"> <li class="enabled">
<a id="indexCollection" class="headerButton"> <a id="indexCollection" class="headerButton">
<span class="icon_arangodb_checklist" title="Index collection"></span> <span class="icon_arangodb_checklist" title="Index collection"></span>
@ -68,6 +73,13 @@
</div> </div>
</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 id="editHeader" class="dropdownImport">
<div class="queryline"> <div class="queryline">
<div style="float:left; margin-top:5px"><div style="float:left" class="selectedCount">0</div> . Documents selected</div> <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>
<div id="queryOutput" class="contentDiv query-output"> <div id="queryOutput" class="contentDiv query-output">
</div> </div>
<button id="downloadQueryResult" class="button-success query-button">Download</button>
</div> </div>
</div> </div>

View File

@ -63,6 +63,7 @@
"click #markDocuments" : "editDocuments", "click #markDocuments" : "editDocuments",
"click #indexCollection" : "indexCollection", "click #indexCollection" : "indexCollection",
"click #importCollection" : "importCollection", "click #importCollection" : "importCollection",
"click #exportCollection" : "exportCollection",
"click #filterSend" : "sendFilter", "click #filterSend" : "sendFilter",
"click #addFilterItem" : "addFilterItem", "click #addFilterItem" : "addFilterItem",
"click .removeFilterItem" : "removeFilterItem", "click .removeFilterItem" : "removeFilterItem",
@ -83,6 +84,7 @@
"click #importModal" : "showImportModal", "click #importModal" : "showImportModal",
"click #resetView" : "resetView", "click #resetView" : "resetView",
"click #confirmDocImport" : "startUpload", "click #confirmDocImport" : "startUpload",
"click #exportDocuments" : "startDownload",
"change #newIndexType" : "selectIndexType", "change #newIndexType" : "selectIndexType",
"click #createIndex" : "createIndex", "click #createIndex" : "createIndex",
"click .deleteIndex" : "prepDeleteIndex", "click .deleteIndex" : "prepDeleteIndex",
@ -166,6 +168,17 @@
this.collection.getDocuments(this.getDocsCallback.bind(this)); 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 () { startUpload: function () {
var result; var result;
if (this.allowUpload === true) { if (this.allowUpload === true) {
@ -244,27 +257,33 @@
} }
}, },
//need to make following functions automatically!
editDocuments: function () { editDocuments: function () {
$('#indexCollection').removeClass('activated'); $('#indexCollection').removeClass('activated');
$('#importCollection').removeClass('activated'); $('#importCollection').removeClass('activated');
$('#exportCollection').removeClass('activated');
this.markFilterToggle(); this.markFilterToggle();
$('#markDocuments').toggleClass('activated'); this.changeEditMode(); $('#markDocuments').toggleClass('activated'); this.changeEditMode();
$('#filterHeader').hide(); $('#filterHeader').hide();
$('#importHeader').hide(); $('#importHeader').hide();
$('#indexHeader').hide(); $('#indexHeader').hide();
$('#editHeader').slideToggle(200); $('#editHeader').slideToggle(200);
$('#exportHeader').hide();
}, },
filterCollection : function () { filterCollection : function () {
$('#indexCollection').removeClass('activated'); $('#indexCollection').removeClass('activated');
$('#importCollection').removeClass('activated'); $('#importCollection').removeClass('activated');
$('#exportCollection').removeClass('activated');
$('#markDocuments').removeClass('activated'); this.changeEditMode(false); $('#markDocuments').removeClass('activated'); this.changeEditMode(false);
this.markFilterToggle(); this.markFilterToggle();
this.activeFilter = true; this.activeFilter = true;
$('#filterHeader').slideToggle(200);
$('#importHeader').hide(); $('#importHeader').hide();
$('#indexHeader').hide(); $('#indexHeader').hide();
$('#editHeader').hide(); $('#editHeader').hide();
$('#exportHeader').hide();
$('#filterHeader').slideToggle(200);
var i; var i;
for (i in this.filters) { 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 () { importCollection: function () {
this.markFilterToggle(); this.markFilterToggle();
$('#indexCollection').removeClass('activated'); $('#indexCollection').removeClass('activated');
$('#markDocuments').removeClass('activated'); this.changeEditMode(false); $('#markDocuments').removeClass('activated'); this.changeEditMode(false);
$('#importCollection').toggleClass('activated'); $('#importCollection').toggleClass('activated');
$('#exportCollection').removeClass('activated');
$('#importHeader').slideToggle(200); $('#importHeader').slideToggle(200);
$('#filterHeader').hide(); $('#filterHeader').hide();
$('#indexHeader').hide(); $('#indexHeader').hide();
$('#editHeader').hide(); $('#editHeader').hide();
$('#exportHeader').hide();
}, },
indexCollection: function () { indexCollection: function () {
this.markFilterToggle(); this.markFilterToggle();
$('#importCollection').removeClass('activated'); $('#importCollection').removeClass('activated');
$('#exportCollection').removeClass('activated');
$('#markDocuments').removeClass('activated'); this.changeEditMode(false); $('#markDocuments').removeClass('activated'); this.changeEditMode(false);
$('#indexCollection').toggleClass('activated'); $('#indexCollection').toggleClass('activated');
$('#newIndexView').hide(); $('#newIndexView').hide();
@ -297,6 +333,7 @@
$('#importHeader').hide(); $('#importHeader').hide();
$('#editHeader').hide(); $('#editHeader').hide();
$('#filterHeader').hide(); $('#filterHeader').hide();
$('#exportHeader').hide();
}, },
changeEditMode: function (enable) { changeEditMode: function (enable) {

View File

@ -38,6 +38,7 @@
'click #arangoQueryTable .table-cell2 a': 'deleteAQL', 'click #arangoQueryTable .table-cell2 a': 'deleteAQL',
'click #confirmQueryImport': 'importCustomQueries', 'click #confirmQueryImport': 'importCustomQueries',
'click #confirmQueryExport': 'exportCustomQueries', 'click #confirmQueryExport': 'exportCustomQueries',
'click #downloadQueryResult': 'downloadQueryResult',
'click #importQueriesToggle': 'showImportMenu' '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 () { exportCustomQueries: function () {
var name, toExport = {}, exportArray = []; var name, toExport = {}, exportArray = [];
_.each(this.customQueries, function(value, key) { _.each(this.customQueries, function(value, key) {

View File

@ -125,3 +125,9 @@
.ace_error { .ace_error {
background: none !important; 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 { .ace_error {
background: none !important; } background: none !important; }
#exportHeader .fa-exclamation-circle {
color: #333232;
font-size: 13pt;
margin-right: 10px; }