HTRACE-146. Search page: Remove client-side sorting and improve pagination
diff --git a/htrace-core/src/web/app/models/span.js b/htrace-core/src/web/app/models/span.js
index 06b6b3c..b8dc114 100644
--- a/htrace-core/src/web/app/models/span.js
+++ b/htrace-core/src/web/app/models/span.js
@@ -60,6 +60,7 @@
   state: {
     pageSize: 10,
     lastSpanId: null,
+    finished: false,
     predicates: []
   },
   queryParams: {
@@ -95,7 +96,7 @@
       }
 
       return JSON.stringify({
-        lim: this.state.pageSize,
+        lim: this.state.pageSize + 1,
         pred: predicates
       });
     }
@@ -111,17 +112,25 @@
   },
 
   parseLinks: function(resp, xhr) {
-    if (resp.length >= this.state.pageSize) {
-      this.state.lastSpanId = resp[resp.length - 1].s;
+    this.state.finished = resp.length <= this.state.pageSize;
 
-      return {
-        "next": "/query?query=" + this.queryParams.query.call(this)
-      };
-    } else {
+    if (this.state.finished) {
       this.state.lastSpanId = null;
+    } else {
+      this.state.lastSpanId = resp[this.state.pageSize - 1].s;
+    }
 
+    if (this.state.finished) {
       return {};
     }
+
+    return {
+      "next": "/query?query=" + this.queryParams.query.call(this)
+    };
+  },
+
+  parseRecords: function(resp) {
+    return resp.slice(0, 10);
   },
 
   setPredicates: function(predicates) {
diff --git a/htrace-core/src/web/app/setup.js b/htrace-core/src/web/app/setup.js
index 90915e3..3c32118 100644
--- a/htrace-core/src/web/app/setup.js
+++ b/htrace-core/src/web/app/setup.js
@@ -67,17 +67,20 @@
             }
           }
         }),
-        "editable": false
+        "editable": false,
+        "sortable": false
       }, {
         "name": "spanId",
         "label": "ID",
         "cell": "string",
-        "editable": false
+        "editable": false,
+        "sortable": false
       }, {
         "name": "processId",
         "label": "processId",
         "cell": "string",
-        "editable": false
+        "editable": false,
+        "sortable": false
       }, {
         "label": "Duration",
         "cell": Backgrid.Cell.extend({
@@ -91,12 +94,14 @@
             }
           }
         }),
-        "editable": false
+        "editable": false,
+        "sortable": false
       }, {
         "name": "description",
         "label": "Description",
         "cell": "string",
-        "editable": false
+        "editable": false,
+        "sortable": false
       }],
       "row": Backgrid.Row.extend({
         "events": {