1
0
mirror of https://github.com/DataTables/DataTables.git synced 2024-12-01 13:24:10 +01:00
DataTables/examples/server_side/pipeline.html
Allan Jardine 4e5cad9640 Size: The default formatNumber method has been reduced in size.
- Exactly the same functionality, but now uses a regex to perform the
  same operation
2013-09-23 11:44:58 +01:00

286 lines
12 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico">
<title>DataTables example - Pipelining data to reduce Ajax calls for paging</title>
<link rel="stylesheet" type="text/css" href="../../media/css/jquery.dataTables.css">
<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
<script type="text/javascript" language="javascript">
// Pipelining function for DataTables. To be used to the `ajax` option of DataTables
$.fn.dataTable.pipeline = function ( data, drawCallback, settings ) {
var conf = $.fn.dataTable.pipeline.conf;
var ajax = false;
var requestStart = data.iDisplayStart;
var requestLength = data.iDisplayLength;
var requestEnd = requestStart + requestLength;
conf.displayStart = requestStart;
if ( conf.lower < 0 || requestStart < conf.lower || requestEnd > conf.upper ) {
// outside pipeline
ajax = true;
}
else {
// have any of the properties changed (sorting etc)
$.each( data, function ( key, val ) {
if ( key !== 'iDisplayStart' && key !== 'iDisplayLength' && key !== 'sEcho' ) {
if ( val !== conf.lastRequest[ key ] ) {
ajax = true;
}
}
} );
}
// Store the request for checking next time around
conf.lastRequest = $.extend( true, {}, data );
if ( ajax ) {
// Need data from the server
if ( requestStart < conf.lower ) {
requestStart = requestStart - (requestLength*(conf.pages-1));
if ( requestStart < 0 ) {
requestStart = 0;
}
}
conf.lower = requestStart;
conf.upper = requestStart + (requestLength * conf.pages);
data.iDisplayStart = requestStart;
data.iDisplayLength = requestLength*conf.pages;
settings.jqXHR = $.ajax( {
"url": conf.url,
"data": data,
"dataType": "json",
"cache": false,
"success": function ( json ) {
conf.lastJson = $.extend(true, {}, json);
if ( conf.lower != requestStart ) {
json.aaData.splice( 0, requestStart-conf.lower );
}
json.aaData.splice( requestLength, json.aaData.length );
drawCallback( json );
}
} );
}
else {
json = $.extend( true, {}, conf.lastJson );
json.sEcho = data.sEcho; // Update the echo for each response
json.aaData.splice( 0, requestStart-conf.lower );
json.aaData.splice( requestLength, json.aaData.length );
drawCallback(json);
}
};
$.fn.dataTable.pipeline.conf = {
//
// Configuration options:
//
// Number of pages to cache in the pipeline
pages: 5,
// Source URL for the script
url: 'scripts/server_processing.php',
//
// Internal state variables
//
lower: -1,
upper: null,
lastRequest: null,
lastJson: null
};
// Helper function for should you ever want to flush the cache
$.fn.dataTable.pipeline.clear = function () {
$.fn.dataTable.pipeline.conf.lower = -1;
}
// DataTables initialisation
$(document).ready(function() {
$('#example').dataTable( {
"processing": true,
"serverSide": true,
"ajax": $.fn.dataTable.pipeline
} );
} );
</script>
</head>
<body class="dt-example">
<div class="container">
<h1>DataTables example - Pipelining data to reduce Ajax calls for paging</h1>
<p>Sever-side processing can be quite hard on your server, since it makes an Ajax call to the server for every
draw request that is made. On heavy load sides, you could potentially end up DDoSing your own server with your
own applications!</p>
<p>This example shows one technique to reduce the number of Ajax calls that are made to the server by caching
more data than is needed for each draw. This is done by intercepting the Ajax call and routing it through a
data cache, using the data from the cache is available, and making the Ajax request if not. This intercept of
the Ajax request is performed by giving the <a href="//datatables.net/init/ajax"><code>ajax</code></a> option
as a function. This function then performs the logic of deciding if another Ajax call is needed, or if data
from the cache can be used.</p>
<p>Keep in mind that this caching is for paging only; the pipeline must be cleared for other interactions such
as sorting and filtering since the full data set, when using server-side processing, is only available at the
server.</p>
<section>
<table id="example" class="display" width="100%">
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th>Position</th>
<th>Office</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Name</th>
<th>Age</th>
<th>Position</th>
<th>Office</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</tfoot>
</table>
</section>
<section>
<h3><a href="../basic_init/index.html">Basic Init</a></h3>
<ul class="toc">
<li><a href="../basic_init/complex_header.html">Complex headers (rowspan and colspan)</a></li>
<li><a href="../basic_init/dom.html">DOM positioning</a></li>
<li><a href="../basic_init/flexible_width.html">Flexible table width</a></li>
<li><a href="../basic_init/filter_only.html">Feature enable / disable</a></li>
<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
<li><a href="../basic_init/alt_pagination.html">Alternative pagination</a></li>
<li><a href="../basic_init/language.html">Language options</a></li>
<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
<li><a href="../basic_init/scroll_y_theme.html">Scroll - vertical with jQuery UI ThemeRoller</a></li>
<li><a href="../basic_init/scroll_x.html">Scroll - horizontal</a></li>
<li><a href="../basic_init/scroll_xy.html">Scroll - horizontal and vertical</a></li>
<li><a href="../basic_init/state_save.html">State saving</a></li>
<li><a href="../basic_init/zero_configuration.html">Zero configuration</a></li>
<li><a href="../basic_init/table_sorting.html">Default sorting</a></li>
<li><a href="../basic_init/themes.html">jQuery UI themes</a></li>
<li><a href="../basic_init/scroll_y.html">Scroll - vertical</a></li>
</ul>
<h3><a href="../advanced_init/index.html">Advanced Init</a></h3>
<ul class="toc">
<li><a href="../advanced_init/complex_header.html">Complex headers (rowspan / colspan)</a></li>
<li><a href="../advanced_init/defaults.html">Defaults</a></li>
<li><a href="../advanced_init/dom_multiple_elements.html">Multiple table control elements</a></li>
<li><a href="../advanced_init/dom_toolbar.html">Custom toolbar elements</a></li>
<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
<li><a href="../advanced_init/dt_events.html">DataTables events</a></li>
<li><a href="../advanced_init/events_live.html">Events</a></li>
<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
<li><a href="../advanced_init/length_menu.html">Page length options</a></li>
<li><a href="../advanced_init/row_callback.html">Row created callback</a></li>
<li><a href="../advanced_init/sort_direction_control.html">Row grouping</a></li>
<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
<li><a href="../advanced_init/language_file.html">Language file</a></li>
</ul>
<h3><a href="../styling/index.html">Styling</a></h3>
<ul class="toc">
<li><a href="../styling/display.html">Base style</a></li>
<li><a href="../styling/no-classes.html">Base style - no styling classes</a></li>
<li><a href="../styling/row-border.html">Base style - row borders</a></li>
<li><a href="../styling/cell-border.html">Base style - cell borders</a></li>
<li><a href="../styling/hover.html">Base style - hover</a></li>
<li><a href="../styling/sort-column.html">Base style - sort-column</a></li>
<li><a href="../styling/stripe.html">Base style - stripe</a></li>
<li><a href="../styling/jqueryUI.html">jQuery UI ThemeRoller</a></li>
<li><a href="../styling/bootstrap.html">Bootstrap</a></li>
<li><a href="../styling/foundation.html">Foundation</a></li>
</ul>
<h3><a href="../data_sources/index.html">Data Sources</a></h3>
<ul class="toc">
<li><a href="../data_sources/dom.html">DOM sourced data</a></li>
<li><a href="../data_sources/ajax.html">Ajax sourced data</a></li>
<li><a href="../data_sources/js_array.html">Javascript sourced data</a></li>
<li><a href="../data_sources/server_side.html">Server-side processing</a></li>
</ul>
<h3><a href="../ajax/index.html">Ajax</a></h3>
<ul class="toc">
<li><a href="../ajax/simple.html">Ajax data source (arrays)</a></li>
<li><a href="../ajax/objects.html">Ajax data source (objects)</a></li>
<li><a href="../ajax/deep.html">Nested object data (objects)</a></li>
<li><a href="../ajax/objects_subarrays.html">Nested object data (arrays)</a></li>
<li><a href="../ajax/null_data_source.html">Generated content for a column</a></li>
<li><a href="../ajax/custom_data_property.html">AJAX custom data source example</a></li>
<li><a href="../ajax/defer_render.html">AJAX deferred rendering example</a></li>
</ul>
<h3><a href="./index.html">Server Side</a></h3>
<ul class="toc active">
<li><a href="./simple.html">Server-side processing</a></li>
<li><a href="./custom_vars.html">Custom HTTP variables</a></li>
<li><a href="./post.html">POST data</a></li>
<li><a href="./ids.html">Automatic addition of row ID attributes</a></li>
<li><a href="./object_data.html">Object data source</a></li>
<li><a href="./row_details.html">POST data</a></li>
<li><a href="./select_rows.html">Row selection</a></li>
<li><a href="./jsonp.html">JSONP data source for remote domains</a></li>
<li><a href="./defer_loading.html">Deferred loading of data</a></li>
<li class="active"><a href="./pipeline.html">Pipelining data to reduce Ajax calls for paging</a></li>
</ul>
<h3><a href="../api/index.html">Api</a></h3>
<ul class="toc">
<li><a href="../api/api_in_init.html">Using API in callbacks</a></li>
<li><a href="../api/counter_columns.html">Index column</a></li>
<li><a href="../api/form.html">Form inputs</a></li>
<li><a href="../api/highlight.html">Highlighting rows and columns</a></li>
<li><a href="../api/add_row.html">Add rows</a></li>
<li><a href="../api/multi_filter.html">Individual column filtering (text inputs)</a></li>
<li><a href="../api/multi_filter_select.html">Individual column filtering (select inputs)</a></li>
<li><a href="../api/select_row.html">Row selection (multiple rows)</a></li>
<li><a href="../api/regex.html">Filtering API (regular expressions)</a></li>
<li><a href="../api/select_single_row.html">Row selection and deletion (single row)</a></li>
<li><a href="../api/tabs_and_scrolling.html">Scrolling and jQuery UI tabs</a></li>
<li><a href="../api/show_hide.html">Show / hide columns dynamically</a></li>
<li><a href="../api/row_details.html">Child rows (show extra / detailed information)</a></li>
</ul>
<h3><a href="../plug-ins/index.html">Plug-ins</a></h3>
<ul class="toc">
<li><a href="../plug-ins/api.html">API plug-in methods</a></li>
<li><a href="../plug-ins/sorting_auto.html">Sorting plug-ins (with type detection)</a></li>
<li><a href="../plug-ins/sorting_manual.html">Sorting plug-ins (no type detection)</a></li>
<li><a href="../plug-ins/range_filtering.html">Sorting plug-ins (with type detection)</a></li>
<li><a href="../plug-ins/dom_sort.html">Live DOM sorting</a></li>
</ul>
</section>
</div>
</body>
</html>