提交 bca0e660 编写于 作者: V Vlad Ilyushchenko

set grid size upfront

上级 66d883be
......@@ -139,6 +139,7 @@ public class QueryHandler implements ContextHandler {
ctx.skip = skip;
ctx.count = 0L;
ctx.stop = stop;
ctx.fetchAll = Chars.equalsNc("true", context.request.getUrlParam("count"));
ctx.info().$("Query: ").$(query).
$(", skip: ").$(skip).
......@@ -207,6 +208,10 @@ public class QueryHandler implements ContextHandler {
ctx.record = ctx.cursor.next();
ctx.count++;
if (ctx.fetchAll && ctx.count > ctx.stop) {
continue;
}
if (ctx.count > ctx.skip) {
break;
}
......@@ -391,7 +396,7 @@ public class QueryHandler implements ContextHandler {
if (ctx.count > -1) {
r.bookmark();
r.put(']');
r.put(',').putQuoted("more").put(':').put(ctx.count > ctx.stop);
r.put(',').putQuoted("count").put(':').put(ctx.count);
r.put('}');
ctx.count = -1;
r.sendChunk();
......@@ -418,6 +423,7 @@ public class QueryHandler implements ContextHandler {
private QueryState state = QueryState.PREFIX;
private int columnIndex;
private boolean noMeta = false;
private boolean fetchAll = false;
@Override
public void clear() {
......@@ -433,6 +439,7 @@ public class QueryHandler implements ContextHandler {
}
query = null;
state = QueryState.PREFIX;
fetchAll = false;
}
@Override
......
......@@ -29,4 +29,4 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--><!--suppress HtmlUnknownTag --><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>QuestDB - Console</title><link rel="apple-touch-icon" href="apple-touch-icon.png"><!-- Place favicon.ico in the root directory --><link rel="stylesheet" href="styles/qdb.css"><script type="text/javascript">history.pushState(null, null, 'index.html');
window.addEventListener('popstate', function () {
history.pushState(null, null, 'index.html');
});</script></head><body class="pace-done"><div id="wrapper"><nav class="navbar-default navbar-static-side" role="navigation"><div class="sidebar-collapse"><ul class="nav metismenu" id="side-menu"><li class="nav-header"><div class="dropdown profile-element"><a data-toggle="dropdown" class="dropdown-toggle" href="#"><span class="clear"><h3>QuestDB</h3></span></a></div><div class="logo-element">QDB</div></li><li><a id="sql-editor" href="#"><i class="fa fa-table"></i> <span class="nav-label">SQL Console</span></a></li><li><a id="file-upload" href="#"><i class="fa fa-upload"></i> <span class="nav-label">Data import</span></a></li><li><a href="#"><i class="fa fa-pie-chart"></i> <span class="nav-label">Analytics</span></a></li></ul></div></nav><div id="page-wrapper" class="gray-bg"><div class="row border-bottom"><nav class="navbar navbar-static-top" role="navigation" style="margin-bottom: 0"><div class="navbar-header"><a class="navbar-minimalize minimalize-styl-2 btn btn-primary" href="#"><i class="fa fa-bars"></i></a></div><ul class="nav navbar-top-links navbar-right"><li><span class="m-r-sm text-muted welcome-message">Welcome to QuestDB Console</span></li><li><a href="#"><i class="fa fa-sign-out"></i> Log out</a></li></ul></nav></div><div class="row wrapper border-bottom white-bg page-heading js-sql-panel"><div class="col-lg-10"><h3>SQL Console</h3></div></div><div class="wrapper wrapper-content js-sql-panel"><div class="row"><div class="col-lg-12"><div class="ibox"><div class="ibox-content"><div class="m-b-sm"><div class="btn-group pull-right"><button class="btn btn-white btn-sm"><i class="fa fa-arrow-left"></i></button></div><button class="btn btn-white btn-sm m-r-sm js-query-run"><i class="fa fa-play"></i>Run</button> <button class="btn btn-white btn-sm js-editor-copy"><i class="fa fa-copy"></i></button> <button class="btn btn-white btn-sm"><i class="fa fa-scissors"></i></button> <button class="btn btn-white btn-sm m-r-sm"><i class="fa fa-clipboard"></i></button> <button data-toggle="button" type="button" class="btn btn-white btn-sm js-editor-toggle-invisible"><i class="fa fa-paragraph"></i></button></div><div id="sqlEditor" class="editor border-rounded-top-half"></div><div class="query-progress-spinner js-query-spinner"></div><div class="query-message query-message-ok js-query-message-panel"><div class="col-lg-2 query-time"><i class="fa fa-clock-o"></i><div class="js-query-time">-</div></div><div class="col-lg-10 js-query-message-text"></div></div></div></div></div></div><div class="row"><div class="col-lg-12"><div class="ibox"><div class="ibox-content"><div id="grid"><div class="qg-header-row"></div><div class="qg-viewport"><div class="qg-canvas"></div></div></div></div></div></div></div></div><div class="row wrapper border-bottom white-bg page-heading js-import-panel"><div class="col-lg-10"><h3>Data import</h3></div></div><div class="wrapper wrapper-content js-import-panel"><div class="row"><div class="col-lg-12"><div class="ibox"><div class="ibox-content"><div id="dragTarget" class="drag-target drag-idle"><h2>Drag files here to import</h2></div><div class="m-b-sm"><button id="btnImportClearSelected" class="btn btn-white btn-sm" disabled="disabled"><i class="fa fa-remove"></i>Clear</button> <button id="btnRetry" class="btn btn-white btn-sm" title disabled="disabled"><i class="fa fa-upload"></i></button> <button id="btnImportCancel" class="btn btn-white btn-sm" title disabled="disabled"><i class="fa fa-stop"></i></button></div><div id="import-file-list"></div></div></div></div></div><div class="row" id="import-detail"><div class="col-lg-12"><div class="js-import-editor"><div class="ibox"><div class="ibox-content"><div class="row"><div class="col-lg-12"><div class="stats-switcher-viewport"><div class="stats-switcher"><div class="row vertical-align import-imported-table"><div class="col-xs-3"><i class="fa fa-table fa-2x"></i></div><div class="col-xs-9 text-right"><h3 class="font-bold js-import-tab-name">ABCD</h3></div></div><div class="import-stats"><div class="import-imported-stats pull-right"><i class="fa fa-thumbs-o-down"></i>&nbsp;<span class="js-rejected-row-count">1023003</span> rows</div><div class="import-imported-stats"><i class="fa fa-thumbs-o-up"></i>&nbsp;<span class="js-imported-row-count">15000000</span> rows</div></div></div></div></div><div class="row"><div class="col-lg-12"><div class="import-stats-chart"><div class="import-rejected pull-right"></div><div class="import-imported"></div></div></div></div><div class="row"><div class="col-lg-12"><div class="grid"><div class="ud-header-row"><div class="ud-header gh-1"><i class="fa fa-hashtag"></i></div><div class="ud-header gh-2">Column name</div><div class="ud-header gh-3">Type</div><div class="ud-header gh-4">Errors</div></div><div class="ud-canvas"></div></div></div></div></div></div></div></div><div class="panel panel-danger js-import-error"><div class="panel-heading">Import failed</div><div class="panel-body"><div class="col-sm-7 js-message">Server rejected file due to unsupported file format.</div><div class="col-sm-5 ud-btn-group js-import-error-btn-group"><form method="get"><label><input type="radio" name="importAction" value="append" class="js-btn-append"> Append</label><label><input type="radio" name="importAction" value="overwrite" class="js-btn-overwrite"> Overwrite</label><label><input type="radio" name="importAction" value="cancel" class="js-btn-cancel"> Cancel</label></form></div></div></div></div></div></div><div class="footer"><div><strong>Copyright</strong> Appsicle Ltd. &copy; 2014-2016</div></div></div></div><script src="scripts/qdb.js"></script></body></html>
\ No newline at end of file
});</script></head><body class="pace-done"><div id="wrapper"><nav class="navbar-default navbar-static-side" role="navigation"><div class="sidebar-collapse"><ul class="nav metismenu" id="side-menu"><li class="nav-header"><div class="dropdown profile-element"><a data-toggle="dropdown" class="dropdown-toggle" href="#"><span class="clear"><h3>QuestDB</h3></span></a></div><div class="logo-element">QDB</div></li><li><a id="sql-editor" href="#"><i class="fa fa-table"></i> <span class="nav-label">SQL Console</span></a></li><li><a id="file-upload" href="#"><i class="fa fa-upload"></i> <span class="nav-label">Data import</span></a></li><li><a href="#"><i class="fa fa-pie-chart"></i> <span class="nav-label">Analytics</span></a></li></ul></div></nav><div id="page-wrapper" class="gray-bg"><div class="row border-bottom"><nav class="navbar navbar-static-top" role="navigation" style="margin-bottom: 0"><div class="navbar-header"><a class="navbar-minimalize minimalize-styl-2 btn btn-primary" href="#"><i class="fa fa-bars"></i></a></div><ul class="nav navbar-top-links navbar-right"><li><span class="m-r-sm text-muted welcome-message">Welcome to QuestDB Console</span></li><li><a href="#"><i class="fa fa-sign-out"></i> Log out</a></li></ul></nav></div><div class="row wrapper border-bottom white-bg page-heading js-sql-panel"><div class="col-lg-10"><h3>SQL Console</h3></div></div><div class="wrapper wrapper-content js-sql-panel"><div class="row"><div class="col-lg-12"><div class="ibox"><div class="ibox-content"><div class="m-b-sm"><div class="btn-group pull-right"><button class="btn btn-white btn-sm"><i class="fa fa-arrow-left"></i></button></div><button class="btn btn-white btn-sm m-r-sm js-query-run"><i class="fa fa-play"></i>Run</button> <button class="btn btn-white btn-sm js-editor-copy"><i class="fa fa-copy"></i></button> <button class="btn btn-white btn-sm"><i class="fa fa-scissors"></i></button> <button class="btn btn-white btn-sm m-r-sm"><i class="fa fa-clipboard"></i></button> <button data-toggle="button" type="button" class="btn btn-white btn-sm js-editor-toggle-invisible"><i class="fa fa-paragraph"></i></button></div><!--<div id="debug"></div>--><div id="sqlEditor" class="editor border-rounded-top-half"></div><div class="query-progress-spinner js-query-spinner"></div><div class="query-message query-message-ok js-query-message-panel"><div class="col-lg-2 query-time"><i class="fa fa-clock-o"></i><div class="js-query-time">-</div></div><div class="col-lg-10 js-query-message-text"></div></div></div></div></div></div><div class="row"><div class="col-lg-12"><div class="ibox"><div class="ibox-content"><div id="grid"><div class="qg-header-row"></div><div class="qg-viewport"><div class="qg-canvas"></div></div></div></div></div></div></div></div><div class="row wrapper border-bottom white-bg page-heading js-import-panel"><div class="col-lg-10"><h3>Data import</h3></div></div><div class="wrapper wrapper-content js-import-panel"><div class="row"><div class="col-lg-12"><div class="ibox"><div class="ibox-content"><div id="dragTarget" class="drag-target drag-idle"><h2>Drag files here to import</h2></div><div class="m-b-sm"><button id="btnImportClearSelected" class="btn btn-white btn-sm" disabled="disabled"><i class="fa fa-remove"></i>Clear</button> <button id="btnRetry" class="btn btn-white btn-sm" title disabled="disabled"><i class="fa fa-upload"></i></button> <button id="btnImportCancel" class="btn btn-white btn-sm" title disabled="disabled"><i class="fa fa-stop"></i></button></div><div id="import-file-list"></div></div></div></div></div><div class="row" id="import-detail"><div class="col-lg-12"><div class="js-import-editor"><div class="ibox"><div class="ibox-content"><div class="row"><div class="col-lg-12"><div class="stats-switcher-viewport"><div class="stats-switcher"><div class="row vertical-align import-imported-table"><div class="col-xs-3"><i class="fa fa-table fa-2x"></i></div><div class="col-xs-9 text-right"><h3 class="font-bold js-import-tab-name">ABCD</h3></div></div><div class="import-stats"><div class="import-imported-stats pull-right"><i class="fa fa-thumbs-o-down"></i>&nbsp;<span class="js-rejected-row-count">1023003</span> rows</div><div class="import-imported-stats"><i class="fa fa-thumbs-o-up"></i>&nbsp;<span class="js-imported-row-count">15000000</span> rows</div></div></div></div></div><div class="row"><div class="col-lg-12"><div class="import-stats-chart"><div class="import-rejected pull-right"></div><div class="import-imported"></div></div></div></div><div class="row"><div class="col-lg-12"><div class="grid"><div class="ud-header-row"><div class="ud-header gh-1"><i class="fa fa-hashtag"></i></div><div class="ud-header gh-2">Column name</div><div class="ud-header gh-3">Type</div><div class="ud-header gh-4">Errors</div></div><div class="ud-canvas"></div></div></div></div></div></div></div></div><div class="panel panel-danger js-import-error"><div class="panel-heading">Import failed</div><div class="panel-body"><div class="col-sm-7 js-message">Server rejected file due to unsupported file format.</div><div class="col-sm-5 ud-btn-group js-import-error-btn-group"><form method="get"><label><input type="radio" name="importAction" value="append" class="js-btn-append"> Append</label><label><input type="radio" name="importAction" value="overwrite" class="js-btn-overwrite"> Overwrite</label><label><input type="radio" name="importAction" value="cancel" class="js-btn-cancel"> Cancel</label></form></div></div></div></div></div></div><div class="footer"><div><strong>Copyright</strong> Appsicle Ltd. &copy; 2014-2016</div></div></div></div><script src="scripts/qdb.js"></script></body></html>
\ No newline at end of file
因为 它太大了无法显示 source diff 。你可以改为 查看blob
......@@ -134,6 +134,7 @@
class="fa fa-paragraph"></i>
</button>
</div>
<!--<div id="debug"></div>-->
<div id="sqlEditor" class="editor border-rounded-top-half">
</div>
<div class="query-progress-spinner js-query-spinner"></div>
......
......@@ -63,8 +63,8 @@
var loPage;
var hiPage;
var query;
var moreExists = true;
var renderTimer;
var dbg;
// viewport height
var vp = defaults.viewportHeight;
......@@ -104,7 +104,7 @@
} else {
h = defaults.yMaxThreshold;
}
M = Math.ceil(yMax / h);
M = yMax / h;
canvas.css('height', h === 0 ? 1 : h);
}
......@@ -165,16 +165,11 @@
function loadOnePage(pageToLoad) {
purgeOutlierPages();
var append = (pageToLoad + 1) * pageSize > r;
var lo = pageToLoad * pageSize;
var hi = lo + pageSize;
$.get('/js', {query, limit: lo + ',' + hi, nm: true})
.done(function (response) {
data[pageToLoad] = response.result;
if (append && moreExists) {
addRows(response.result.length);
moreExists = response.more;
}
delayedRenderViewportNoCompute();
})
.fail(function () {
......@@ -186,7 +181,7 @@
purgeOutlierPages();
var lo = p1 * pageSize;
var hi = lo + pageSize * (p2 - p1 + 1);
$.get('/js', {query, limit: lo + ',' + hi, np: true})
$.get('/js', {query, limit: lo + ',' + hi, nm: true})
.done(function (response) {
var l = response.result.length;
data[p1] = response.result.splice(0, pageSize);
......@@ -396,7 +391,19 @@
stretched = 0;
data = [];
query = null;
moreExists = true;
}
function logDebug() {
if (dbg) {
dbg.empty();
dbg.append('y = ' + y + '<br>');
dbg.append('M = ' + M + '<br>');
dbg.append('o = ' + o + '<br>');
dbg.append('h = ' + h + '<br>');
dbg.append('vp = ' + vp + '<br>');
dbg.append('yMax = ' + yMax + '<br>');
dbg.append('top = ' + top + '<br>');
}
}
function viewportScroll(force) {
......@@ -405,18 +412,21 @@
var scrollTop = viewport.scrollTop;
if (scrollTop !== top || force) {
var oldY = y;
if (Math.abs(scrollTop - top) > vp) {
// near scroll
if (Math.abs(scrollTop - top) > 4 * vp) {
y = scrollTop === 0 ? 0 : Math.ceil((scrollTop + vp) * M - vp);
top = scrollTop;
o = y - top;
} else if (scrollTop >= h - vp) {
y = yMax - vp;
top = scrollTop;
o = y - top;
} else {
// jump
y += scrollTop - top;
top = scrollTop;
}
renderViewport(y - oldY);
}
logDebug();
}
function resize() {
......@@ -476,7 +486,7 @@
activeRowContainer = rows[activeRow & dcn];
activeRowContainer.className = 'qg-r qg-r-active';
activeCellOn();
var scrollTop = activeRow * rh;
var scrollTop = activeRow * rh - o;
if (scrollTop < viewport.scrollTop) {
viewport.scrollTop = Math.max(0, scrollTop);
}
......@@ -491,7 +501,7 @@
activeRowContainer = rows[activeRow & dcn];
activeRowContainer.className = 'qg-r qg-r-active';
activeCellOn();
var scrollTop = activeRow * rh - vp + rh;
var scrollTop = activeRow * rh - vp + rh - o;
if (scrollTop > viewport.scrollTop) {
viewport.scrollTop = scrollTop;
}
......@@ -588,15 +598,15 @@
query = m.r.query;
data.push(m.r.result);
columns = m.r.columns;
moreExists = m.r.more;
addColumns();
addRows(m.r.result.length);
addRows(m.r.count);
computeColumnWidths();
viewport.scrollTop = 0;
resize();
}
function bind() {
dbg = $('#debug');
header = div.find('.qg-header-row');
viewport = div.find('.qg-viewport')[0];
viewport.onscroll = viewportScroll;
......
......@@ -70,6 +70,7 @@
}
function handleServerResponse(r) {
console.log('count: ' + r.count);
$(document).trigger('query.ok',
{
r,
......@@ -98,6 +99,7 @@
btn.removeClass('js-query-run').addClass('js-query-cancel');
requestParams.query = qry.q;
requestParams.limit = '0,' + batchSize;
requestParams.count = true;
time = new Date().getTime();
hActiveRequest = $.get('/js', requestParams).done(handleServerResponse).fail(handleServerError);
}
......
......@@ -107,3 +107,11 @@
padding: 2px 1px;
border: 2px solid #8d95a5;
}
#debug {
float: right;
width: 300px;
height: 300px;
background: white;
border: 1px solid red;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册