Array.prototype.swap=function(a, b)
{
var tmp=this[a];
this[a]=this[b];
this[b]=tmp;
}
function partition(array, begin, end, pivot)
{
var piv=array[pivot];
array.swap(pivot, end-1);
var store=begin;
var ix;
for(ix=begin; ix<end-1; ++ix) {
if(array[ix]<=piv) {
array.swap(store, ix);
++store;
}
}
array.swap(end-1, store);
return store;
}
function qsort(array, begin, end)
{
if(end-1>begin) {
var pivot=begin+Math.floor(Math.random()*(end-begin));
pivot=partition(array, begin, end, pivot);
qsort(array, begin, pivot);
qsort(array, pivot+1, end);
}
}
function quick_sort(array) {
qsort(array, 0, array.length);
}
function shuffle(array) {
var len = array.length;
var i = len;
while (i--) {
var p = parseInt(Math.random() * len);
var t = array[i];
array[i] = array[p];
array[p] = t;
}
}
function Item(param1, param2, param3, value) {
this.param1 = param1;
this.param2 = param2;
this.param3 = param3;
this.value = value;
this.key = [param1, param2, param3].toString();
this.toString = function() {
return this.key;
}
}
function populateTestData() {
var res = [];
var guid = ['6aa20b7a-da8a-466d-8f0e-92e49ca62759', 'e2cd3214-1097-46fc-931c-03d5becc3318', 'a9d71320-aeed-445f-9741-bf61d45a565a'];
for (var p1 = 0; p1 < guid.length; p1++) {
for (var p2 = 0; p2 < 17; p2++) {
for (var p3 = 0; p3 < 9; p3++) {
var item = new Item(guid[p1], 'parameter' + p2, p3, [p1, p2, p3].toString());
res.push(item);
}
}
}
return res;
}
function listToMap(lst) {
var map = {};
for (var i = 0; i < lst.length; i++) {
var item = lst[i];
if (item.value != null) {
var key = [item.param1, item.param2, item.param3];
map[key] = item.value;
}
}
return map;
}
function arrayTranspose_(data) {
if (data.length == 0 || data[0].length == 0) {
return null;
}
var ret = [];
var retLen = data[0].length;
for (var i = 0; i < retLen; ++i) {
ret.push([]);
}
for (var i = 0; i < data.length; ++i) {
for (var j = 0; j < retLen; ++j) {
ret[j][i] = data[i][j];
}
}
return ret;
}
function adjustData_(inData) {
var colData = inData.slice();
// var tz = Session.getTimeZone();
for (var c = 0; c < colData.length; c++) {
var column = colData[c];
var colLen = column.length;
if (colLen > 0 && column[0].length > 0 && column[0][0] instanceof Date) {
for (var i = 0; i < colLen; i++) {
var value = column[i][0];
if (value instanceof Date) {
// column[i][0] = Utilities.formatDate(value, tz, 'yyyy-MM-dd HH:mm');
column[i][0] = value.getFullYear() + '-' + (value.getMonth() + 1) + '-' + value.getDate() + ' ' + value.getHours() + ':' + value.getMinutes();
}
}
}
}
var res = [];
var rowData = arrayTranspose_(colData);
for (var i = 0; i < rowData.length; i++) {
var row = rowData[i];
var rowCorrect = [];
for (var j = 0; j < row.length; j++) {
var rr = row[j];
var r = '';
if (rr != undefined) {
r = rr[0];
}
rowCorrect.push(r);
}
res.push(rowCorrect);
}
return res;
}
function populateTestData01() {
var count = 127;
var now = new Date().valueOf();
var lstDate = [];
var lstValue01 = [];
var lstValue02 = [];
for (var i = 0; i < count; i++) {
var dateValue = new Date(now + i * 60000);
lstDate.push([dateValue]);
lstValue01.push([Math.random()]);
lstValue02.push([Math.random()]);
}
return [lstDate, lstValue01, lstValue02];
}
function test() {
var count = 11;
var lstData = populateTestData();
shuffle(lstData);
var start = new Date();
var lstPreventOptimize = [];
for (var i = 0; i < count; i++) {
var mapData = listToMap(lstData);
lstPreventOptimize.push(mapData);
}
var timeLstToMap = new Date() - start;
var lstCopy00 = lstData.slice();
var start = new Date();
quick_sort(lstCopy00);
var timeQuickSort = new Date() - start;
var lstCopy01 = lstData.slice();
var start = new Date();
lstCopy01.sort();
var timeSort = new Date() - start;
var lstData01 = populateTestData01();
var start = new Date();
for (var i = 0; i < count; i++) {
var adjustedData = adjustData_(lstData01);
lstPreventOptimize.push(adjustedData);
}
var timeAdjust = new Date() - start;
return { timeLstToMap: timeLstToMap, timeQuickSort: timeQuickSort, timeSort : timeSort, timeAdjust: timeAdjust, dummy: lstPreventOptimize };
}
function runTest() {
var start = new Date();
var res = test();
var timeTotal = new Date() - start;
var resStr = 'Complete Time: ' + timeTotal + 'ms, List To Map Time: ' + res.timeLstToMap + 'ms, Adjust Time: ' + res.timeAdjust + 'ms, QuickSort Time: ' + res.timeQuickSort + 'ms, Sort Time: ' + res.timeSort + 'ms';
return resStr;
}
print(runTest());