Commit e022e5b53138ede006657f293774c908d0442967

Authored by Benjamin Renard
1 parent ab7c3c63

Filter parameter columns of a catalog (#7048)

js/app/views/CatalogUI.js
@@ -12,8 +12,13 @@ Ext.define('amdaUI.CatalogUI', { @@ -12,8 +12,13 @@ Ext.define('amdaUI.CatalogUI', {
12 alias: 'widget.panelCatalog', 12 alias: 'widget.panelCatalog',
13 13
14 requires: [ 14 requires: [
  15 + 'Ext.ux.grid.menu.RangeMenu',
  16 + 'Ext.ux.grid.FiltersFeature',
  17 + 'Ext.ux.grid.filter.DateFilter',
  18 + 'Ext.ux.grid.filter.NumericFilter',
  19 + 'Ext.ux.grid.filter.StringFilter',
15 'Ext.grid.plugin.BufferedRenderer', 20 'Ext.grid.plugin.BufferedRenderer',
16 - 'amdaUI.StatisticalPlug' 21 + 'amdaUI.StatisticalPlug'
17 ], 22 ],
18 23
19 isCatalog : true, 24 isCatalog : true,
@@ -178,6 +183,13 @@ Ext.define('amdaUI.CatalogUI', { @@ -178,6 +183,13 @@ Ext.define('amdaUI.CatalogUI', {
178 183
179 if (me.toReconfigure) 184 if (me.toReconfigure)
180 { 185 {
  186 + // clear filters
  187 + if (me.TTGrid.filters) {
  188 + me.TTGrid.getStore().clearFilter(true);
  189 + me.TTGrid.filters.clearFilters();
  190 + me.TTGrid.filters.destroy();
  191 + }
  192 +
181 var fieldsConfig = [ 193 var fieldsConfig = [
182 { 194 {
183 name : 'start', 195 name : 'start',
@@ -277,7 +289,8 @@ Ext.define('amdaUI.CatalogUI', { @@ -277,7 +289,8 @@ Ext.define('amdaUI.CatalogUI', {
277 allowBlank:false, 289 allowBlank:false,
278 hideTrigger: true, 290 hideTrigger: true,
279 format : 'Y-m-d\\TH:i:s' 291 format : 'Y-m-d\\TH:i:s'
280 - } 292 + },
  293 + filter: { type: 'date', dateFormat: 'Y-m-d' }
281 }, 294 },
282 { 295 {
283 xtype: 'datecolumn', 296 xtype: 'datecolumn',
@@ -292,7 +305,8 @@ Ext.define('amdaUI.CatalogUI', { @@ -292,7 +305,8 @@ Ext.define('amdaUI.CatalogUI', {
292 allowBlank:false, 305 allowBlank:false,
293 hideTrigger: true, 306 hideTrigger: true,
294 format : 'Y-m-d\\TH:i:s' 307 format : 'Y-m-d\\TH:i:s'
295 - } 308 + },
  309 + filter: { type: 'date', dateFormat: 'Y-m-d' }
296 }, 310 },
297 { 311 {
298 xtype: 'gridcolumn', 312 xtype: 'gridcolumn',
@@ -310,7 +324,8 @@ Ext.define('amdaUI.CatalogUI', { @@ -310,7 +324,8 @@ Ext.define('amdaUI.CatalogUI', {
310 beforeshow : function(){ 324 beforeshow : function(){
311 updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'1'); 325 updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'1');
312 } 326 }
313 - } 327 + },
  328 + filter: { type: 'numeric'}
314 }, 329 },
315 { 330 {
316 xtype: 'gridcolumn', 331 xtype: 'gridcolumn',
@@ -328,7 +343,8 @@ Ext.define('amdaUI.CatalogUI', { @@ -328,7 +343,8 @@ Ext.define('amdaUI.CatalogUI', {
328 beforeshow : function(){ 343 beforeshow : function(){
329 updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'2'); 344 updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'2');
330 } 345 }
331 - } 346 + },
  347 + filter: { type: 'numeric'}
332 }, 348 },
333 { 349 {
334 xtype: 'gridcolumn', 350 xtype: 'gridcolumn',
@@ -346,11 +362,12 @@ Ext.define('amdaUI.CatalogUI', { @@ -346,11 +362,12 @@ Ext.define('amdaUI.CatalogUI', {
346 beforeshow : function(){ 362 beforeshow : function(){
347 updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'3'); 363 updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'3');
348 } 364 }
349 - } 365 + },
  366 + filter: { type: 'numeric'}
350 } 367 }
351 ]; 368 ];
352 369
353 - Ext.Array.each(result.parameters, function(obj, index) { 370 + Ext.Array.each(result.parameters, function(obj, index) {
354 var field = { 371 var field = {
355 name: obj.id 372 name: obj.id
356 }; 373 };
@@ -361,6 +378,17 @@ Ext.define('amdaUI.CatalogUI', { @@ -361,6 +378,17 @@ Ext.define('amdaUI.CatalogUI', {
361 menuDisabled: false 378 menuDisabled: false
362 }; 379 };
363 switch (obj.type) { 380 switch (obj.type) {
  381 + case 0: //double
  382 + field = Ext.apply({}, field, {
  383 + type: 'string'
  384 + });
  385 + column = Ext.apply({}, column, {
  386 + xtype: 'gridcolumn',
  387 + width : 50. * parseInt(obj.size),
  388 + editor: 'textfield',
  389 + filter: { type: 'numeric'}
  390 + });
  391 + break;
364 case 1: //dateTime 392 case 1: //dateTime
365 field = Ext.apply({}, field, { 393 field = Ext.apply({}, field, {
366 type : 'date', 394 type : 'date',
@@ -382,9 +410,32 @@ Ext.define('amdaUI.CatalogUI', { @@ -382,9 +410,32 @@ Ext.define('amdaUI.CatalogUI', {
382 allowBlank:false, 410 allowBlank:false,
383 hideTrigger: true, 411 hideTrigger: true,
384 format : 'Y-m-d\\TH:i:s' 412 format : 'Y-m-d\\TH:i:s'
385 - } 413 + },
  414 + filter: { type: 'date', dateFormat: 'Y-m-d' }
386 }); 415 });
387 break; 416 break;
  417 + case 2: //string
  418 + field = Ext.apply({}, field, {
  419 + type: 'string'
  420 + });
  421 + column = Ext.apply({}, column, {
  422 + xtype: 'gridcolumn',
  423 + width : 50. * parseInt(obj.size),
  424 + editor: 'textfield',
  425 + filter: { type: 'string'}
  426 + });
  427 + break;
  428 + case 3: //int
  429 + field = Ext.apply({}, field, {
  430 + type: 'string'
  431 + });
  432 + column = Ext.apply({}, column, {
  433 + xtype: 'gridcolumn',
  434 + width : 50. * parseInt(obj.size),
  435 + editor: 'textfield',
  436 + filter: { type: 'numeric'}
  437 + });
  438 + break;
388 default: 439 default:
389 field = Ext.apply({}, field, { 440 field = Ext.apply({}, field, {
390 type: 'string' 441 type: 'string'
@@ -392,7 +443,8 @@ Ext.define('amdaUI.CatalogUI', { @@ -392,7 +443,8 @@ Ext.define('amdaUI.CatalogUI', {
392 column = Ext.apply({}, column, { 443 column = Ext.apply({}, column, {
393 xtype: 'gridcolumn', 444 xtype: 'gridcolumn',
394 width : 50. * parseInt(obj.size), 445 width : 50. * parseInt(obj.size),
395 - editor: 'textfield' 446 + editor: 'textfield',
  447 + filter: { type: 'string'}
396 }); 448 });
397 } 449 }
398 fieldsConfig.push(field); 450 fieldsConfig.push(field);
@@ -432,6 +484,9 @@ Ext.define('amdaUI.CatalogUI', { @@ -432,6 +484,9 @@ Ext.define('amdaUI.CatalogUI', {
432 }); 484 });
433 485
434 me.TTGrid.reconfigure(store, columnsConfig); 486 me.TTGrid.reconfigure(store, columnsConfig);
  487 + if (me.TTGrid.filters) {
  488 + me.TTGrid.filters.bindStore(store);
  489 + }
435 } 490 }
436 me.TTGrid.getSelectionModel().deselectAll(); 491 me.TTGrid.getSelectionModel().deselectAll();
437 // 492 //
@@ -697,8 +752,18 @@ Ext.define('amdaUI.CatalogUI', { @@ -697,8 +752,18 @@ Ext.define('amdaUI.CatalogUI', {
697 } 752 }
698 }); 753 });
699 754
  755 + var filters = {
  756 + ftype: 'filters',
  757 + encode: true, // json encode the filter query
  758 + local: false,
  759 + filters: [
  760 +
  761 + ]
  762 + };
  763 +
700 this.TTGrid = Ext.create('Ext.grid.Panel', { 764 this.TTGrid = Ext.create('Ext.grid.Panel', {
701 height: 530, 765 height: 530,
  766 + features: [filters],
702 columns: [ ], 767 columns: [ ],
703 frame: true, 768 frame: true,
704 columnLines: true, 769 columnLines: true,
@@ -754,7 +819,15 @@ Ext.define('amdaUI.CatalogUI', { @@ -754,7 +819,15 @@ Ext.define('amdaUI.CatalogUI', {
754 }, this); 819 }, this);
755 } 820 }
756 } 821 }
757 - }] 822 + },'->',
  823 + {
  824 + text: 'Clear Filters',
  825 + scope: this,
  826 + handler: function () {
  827 + this.TTGrid.getStore().clearFilter(true);
  828 + this.TTGrid.filters.clearFilters();
  829 + }
  830 + }]
758 }] 831 }]
759 }); 832 });
760 833
php/classes/CatalogCacheFilterObject.php 0 โ†’ 100644
@@ -0,0 +1,285 @@ @@ -0,0 +1,285 @@
  1 +<?php
  2 +
  3 +class CatalogCacheFilterPartObject extends TimeTableCacheFilterPartObject
  4 +{
  5 + public static $TYPE_PARAMETER = 6;
  6 +
  7 + private $paramId = "";
  8 +
  9 + public function getParamId() {
  10 + return $this->paramId;
  11 + }
  12 +
  13 + public function isSame($part) {
  14 + $same = parent::isSame($part);
  15 + if ($this->type != self::$TYPE_PARAMETER) {
  16 + return $same;
  17 + }
  18 + return $same && ($this->paramId == $part->getParamId());
  19 + }
  20 +
  21 + public function toFiltered($interval) {
  22 + if ($this->type != self::$TYPE_PARAMETER) {
  23 + return parent::toFiltered($interval);
  24 + }
  25 +
  26 + $params = $interval->getParams();
  27 +
  28 + // Retrieve data type
  29 + $data_type = -1;
  30 + foreach ($this->cacheObject->getParametersInfo() as $parameter) {
  31 + if ($parameter['id'] == $this->paramId) {
  32 + $data_type = $parameter['type'];
  33 + break;
  34 + }
  35 + }
  36 +
  37 + if ($data_type < 0) {
  38 + return FALSE;
  39 + }
  40 + else if (!isset($params[$this->paramId])) {
  41 + return FALSE;
  42 + }
  43 +
  44 + switch ($parameter['type']) {
  45 + case 0: //double
  46 + {
  47 + $param_value = floatval($params[$this->paramId]);
  48 + switch ($this->op) {
  49 + case self::$OPERATION_LT :
  50 + return ($param_value < $this->value);
  51 + case self::$OPERATION_GT :
  52 + return ($param_value > $this->value);
  53 + case self::$OPERATION_EQ :
  54 + return ($param_value != $this->value);
  55 + default :
  56 + return FALSE;
  57 + }
  58 + break;
  59 + }
  60 + case 1: //date (timestamp)
  61 + {
  62 + $param_value = intval($params[$this->paramId]);
  63 + switch ($this->op) {
  64 + case self::$OPERATION_LT :
  65 + return ($param_value < $this->value);
  66 + case self::$OPERATION_GT :
  67 + return ($param_value > $this->value);
  68 + case self::$OPERATION_EQ :
  69 + return (!(($param_value >= $this->value) && ($param_value <= $this->value+86400)));
  70 + default :
  71 + return FALSE;
  72 + }
  73 + break;
  74 + }
  75 + case 2: //string
  76 + $param_value = $params[$this->paramId];
  77 + if (empty($this->value))
  78 + return FALSE;
  79 + if (empty($param_value))
  80 + return TRUE;
  81 + return (strpos(strtolower($param_value), strtolower($this->value)) === FALSE);
  82 + case 3: //int
  83 + {
  84 + $param_value = intval($params[$this->paramId]);
  85 + switch ($this->op) {
  86 + case self::$OPERATION_LT :
  87 + return ($param_value < $this->value);
  88 + case self::$OPERATION_GT :
  89 + return ($param_value > $this->value);
  90 + case self::$OPERATION_EQ :
  91 + return ($param_value != $this->value);
  92 + default :
  93 + return FALSE;
  94 + }
  95 + break;
  96 + }
  97 + default:
  98 + return FALSE;
  99 + }
  100 +
  101 + return FALSE;
  102 + }
  103 +
  104 + public function loadFromObject($part_obj) {
  105 + parent::loadFromObject($part_obj);
  106 + if ($this->type == self::$TYPE_UNKNOWN) {
  107 + //Check if it's a catalog parameter
  108 + foreach ($this->cacheObject->getParametersInfo() as $parameter) {
  109 + if ($parameter['id'] == $part_obj->field) {
  110 + $this->type = self::$TYPE_PARAMETER;
  111 + $this->paramId = $parameter['id'];
  112 +
  113 + switch ($parameter['type']) {
  114 + case 0: //double
  115 + $this->value = floatval($part_obj->value);
  116 + break;
  117 + case 1: //date (timestamp)
  118 + $this->value = TimeUtils::iso2stamp($part_obj->value);
  119 + break;
  120 + case 2: //string
  121 + $this->value = $part_obj->value;
  122 + break;
  123 + case 3: //int
  124 + $this->value = intval($part_obj->value);
  125 + break;
  126 + default:
  127 + $this->value = $part_obj->value;
  128 + }
  129 +
  130 + break;
  131 + }
  132 + }
  133 + }
  134 + }
  135 +
  136 + public function writeBin($handle) {
  137 + fwrite($handle,pack('L2',$this->type,$this->op));
  138 + if ($this->type == self::$TYPE_PARAMETER) {
  139 + //Param Id length
  140 + fwrite($handle,pack('L',strlen($this->paramId)));
  141 +
  142 + //Param Id
  143 + for ($i = 0; $i < strlen($this->paramId); ++$i)
  144 + fwrite($handle,pack('C',ord($this->paramId[$i])));
  145 +
  146 + // Retrieve data type
  147 + $data_type = -1;
  148 + foreach ($this->cacheObject->getParametersInfo() as $parameter) {
  149 + if ($parameter['id'] == $this->paramId) {
  150 + $data_type = $parameter['type'];
  151 + break;
  152 + }
  153 + }
  154 +
  155 + switch ($data_type) {
  156 + case 0: //double
  157 + fwrite($handle,pack('f',floatval($this->value)));
  158 + break;
  159 + case 1: //date (timestamp)
  160 + fwrite($handle,pack('L',intval($this->value)));
  161 + break;
  162 + case 2: //string
  163 + fwrite($handle,pack('L',strlen($this->value)));
  164 + for ($i = 0; $i < strlen($this->value); ++$i)
  165 + fwrite($handle,pack('C',ord($this->value[$i])));
  166 + break;
  167 + case 3: //int
  168 + fwrite($handle,pack('L',intval($this->value)));
  169 + break;
  170 + default:
  171 + fwrite($handle,pack('L',strlen($this->value)));
  172 + for ($i = 0; $i < strlen($this->value); ++$i)
  173 + fwrite($handle,pack('C',ord($this->value[$i])));
  174 + }
  175 + }
  176 + else {
  177 + fwrite($handle,pack('f',$this->value));
  178 + }
  179 + }
  180 +
  181 + public function loadBin($handle) {
  182 + $res = unpack('L2data',fread($handle,4*2));
  183 + $this->type = $res['data1'];
  184 + $this->op = $res['data2'];
  185 +
  186 + if ($this->type == self::$TYPE_PARAMETER) {
  187 + //Param Id length
  188 + if (!$res = unpack('Lidlength',fread($handle,4)))
  189 + return false;
  190 + $idlength = $res['idlength'];
  191 +
  192 + //Param Id
  193 + $this->paramId = "";
  194 + for ($j = 0; $j < $idlength; ++$j)
  195 + {
  196 + if (!$res = unpack('Cid',fread($handle,1)))
  197 + return false;
  198 + $this->paramId .= chr($res['id']);
  199 + }
  200 +
  201 + // Retrieve data type
  202 + $data_type = -1;
  203 + foreach ($this->cacheObject->getParametersInfo() as $parameter) {
  204 + if ($parameter['id'] == $this->paramId) {
  205 + $data_type = $parameter['type'];
  206 + break;
  207 + }
  208 + }
  209 +
  210 + switch ($data_type) {
  211 + case 0: //double
  212 + $res = unpack('fvalue',fread($handle,4));
  213 + $this->value = $res['value'];
  214 + break;
  215 + case 1: //date (timestamp)
  216 + $res = unpack('Lvalue',fread($handle,4));
  217 + $this->value = $res['value'];
  218 + break;
  219 + case 2: //string
  220 + $res = unpack('Llength',fread($handle,4));
  221 + $length = $res['length'];
  222 + $this->value = "";
  223 + for ($j = 0; $j < $length; ++$j)
  224 + {
  225 + if (!$res = unpack('Cvalue',fread($handle,1)))
  226 + return false;
  227 + $this->value .= chr($res['value']);
  228 + }
  229 + break;
  230 + case 3: //int
  231 + $res = unpack('Lvalue',fread($handle,4));
  232 + $this->value = $res['value'];
  233 + break;
  234 + default:
  235 + $res = unpack('Llength',fread($handle,4));
  236 + $length = $res['length'];
  237 + $this->value = "";
  238 + for ($j = 0; $j < $length; ++$j)
  239 + {
  240 + if (!$res = unpack('Cvalue',fread($handle,1)))
  241 + return false;
  242 + $this->value .= chr($res['value']);
  243 + }
  244 + break;
  245 + }
  246 + }
  247 + else {
  248 + $res = unpack('fvalue',fread($handle,4));
  249 + $this->value = $res['value'];
  250 + }
  251 + }
  252 +
  253 + public function dump() {
  254 + if ($this->type == self::$TYPE_PARAMETER) {
  255 + echo " => ".get_class($this)." : type = parameter, id = ".$this->paramId;
  256 + echo ", operation = ";
  257 + switch ($this->op)
  258 + {
  259 + case self::$OPERATION_LT :
  260 + echo "lt";
  261 + break;
  262 + case self::$OPERATION_GT :
  263 + echo "gt";
  264 + break;
  265 + case self::$OPERATION_EQ :
  266 + echo "eq";
  267 + break;
  268 + default:
  269 + echo "unknown";
  270 + }
  271 + echo ", value = ".$this->value.PHP_EOL;
  272 + return;
  273 + }
  274 + parent::dump();
  275 + }
  276 +}
  277 +
  278 +class CatalogCacheFilterObject extends TimeTableCacheFilterObject
  279 +{
  280 + protected function createNewPart() {
  281 + return new CatalogCacheFilterPartObject($this->cacheObject);
  282 + }
  283 +}
  284 +
  285 + ?>
php/classes/CatalogCacheIntervalObject.php
@@ -104,7 +104,7 @@ class CatalogCacheIntervalObject extends TimeTableCacheIntervalObject @@ -104,7 +104,7 @@ class CatalogCacheIntervalObject extends TimeTableCacheIntervalObject
104 if (!$res = unpack('Lval',fread($handle,4))) { 104 if (!$res = unpack('Lval',fread($handle,4))) {
105 break; 105 break;
106 } 106 }
107 - $val = $res['val']; 107 + $val = TimeUtils::stamp2iso($res['val']);
108 break; 108 break;
109 case 2: //string 109 case 2: //string
110 if (!$res = unpack('Llength',fread($handle,4))) { 110 if (!$res = unpack('Llength',fread($handle,4))) {
php/classes/CatalogCacheObject.php
@@ -7,9 +7,8 @@ class CatalogCacheObject extends TimeTableCacheObject @@ -7,9 +7,8 @@ class CatalogCacheObject extends TimeTableCacheObject
7 public function reset() { 7 public function reset() {
8 parent::reset(); 8 parent::reset();
9 $this->parameters = array(); 9 $this->parameters = array();
10 - //ToDo - Init sort and filters for Catalog  
11 - /*unset($this->filter);  
12 - $this->filter = new TimeTableCacheFilterObject();;*/ 10 + unset($this->filter);
  11 + $this->filter = new CatalogCacheFilterObject($this);
13 unset($this->sort); 12 unset($this->sort);
14 $this->sort = new CatalogCacheSortObject($this); 13 $this->sort = new CatalogCacheSortObject($this);
15 } 14 }
php/classes/TimeTableCacheFilterObject.php
@@ -14,14 +14,16 @@ class TimeTableCacheFilterPartObject @@ -14,14 +14,16 @@ class TimeTableCacheFilterPartObject
14 public static $OPERATION_GT = 2; 14 public static $OPERATION_GT = 2;
15 public static $OPERATION_EQ = 3; 15 public static $OPERATION_EQ = 3;
16 16
  17 + protected $cacheObject = NULL;
17 protected $type; 18 protected $type;
18 protected $op; 19 protected $op;
19 protected $value; 20 protected $value;
20 21
21 - function __construct() { 22 + function __construct($cacheObject) {
22 $this->type = self::$TYPE_UNKNOWN; 23 $this->type = self::$TYPE_UNKNOWN;
23 $this->op = self::$OPERATION_UNKNOWN; 24 $this->op = self::$OPERATION_UNKNOWN;
24 - $this->value = 0.; 25 + $this->value = 0;
  26 + $this->cacheObject = $cacheObject;
25 } 27 }
26 28
27 public function getType() { 29 public function getType() {
@@ -156,7 +158,7 @@ class TimeTableCacheFilterPartObject @@ -156,7 +158,7 @@ class TimeTableCacheFilterPartObject
156 } 158 }
157 159
158 public function dump() { 160 public function dump() {
159 - echo " => TimeTableCacheFilterPartObject : type = "; 161 + echo " => ".get_class($this)." : type = ";
160 switch ($this->type) 162 switch ($this->type)
161 { 163 {
162 case self::$TYPE_START : 164 case self::$TYPE_START :
@@ -198,10 +200,15 @@ class TimeTableCacheFilterPartObject @@ -198,10 +200,15 @@ class TimeTableCacheFilterPartObject
198 200
199 class TimeTableCacheFilterObject 201 class TimeTableCacheFilterObject
200 { 202 {
  203 + protected $cacheObject = NULL;
201 protected $parts = array(); 204 protected $parts = array();
202 205
203 - function __construct() { 206 + protected function createNewPart() {
  207 + return new TimeTableCacheFilterPartObject($this->cacheObject);
  208 + }
204 209
  210 + function __construct($cacheObject) {
  211 + $this->cacheObject = $cacheObject;
205 } 212 }
206 213
207 public function getParts() { 214 public function getParts() {
@@ -222,7 +229,7 @@ class TimeTableCacheFilterObject @@ -222,7 +229,7 @@ class TimeTableCacheFilterObject
222 229
223 foreach ($filter_obj as $filter_part) 230 foreach ($filter_obj as $filter_part)
224 { 231 {
225 - $part = new TimeTableCacheFilterPartObject(); 232 + $part = $this->createNewPart();
226 $part->loadFromObject($filter_part); 233 $part->loadFromObject($filter_part);
227 array_push($this->parts, $part); 234 array_push($this->parts, $part);
228 } 235 }
@@ -245,7 +252,8 @@ class TimeTableCacheFilterObject @@ -245,7 +252,8 @@ class TimeTableCacheFilterObject
245 } 252 }
246 253
247 public function isSameFromJSON($filter_json) { 254 public function isSameFromJSON($filter_json) {
248 - $filter = new TimeTableCacheFilterObject(); 255 + $this_class = get_class();
  256 + $filter = new $this_class($this->cacheObject);
249 $filter->loadFromJSON($filter_json); 257 $filter->loadFromJSON($filter_json);
250 return $this->isSame($filter); 258 return $this->isSame($filter);
251 } 259 }
@@ -270,14 +278,14 @@ class TimeTableCacheFilterObject @@ -270,14 +278,14 @@ class TimeTableCacheFilterObject
270 $res = unpack('Lcount',fread($handle,4)); 278 $res = unpack('Lcount',fread($handle,4));
271 for ($i = 0; $i < $res['count']; ++$i) 279 for ($i = 0; $i < $res['count']; ++$i)
272 { 280 {
273 - $part = new TimeTableCacheFilterPartObject(); 281 + $part = $this->createNewPart();
274 $part->loadBin($handle); 282 $part->loadBin($handle);
275 array_push($this->parts, $part); 283 array_push($this->parts, $part);
276 } 284 }
277 } 285 }
278 286
279 public function dump() { 287 public function dump() {
280 - echo " => TimeTableCacheFilterObject : number of parts = ".count($this->parts).PHP_EOL; 288 + echo " => ".get_class($this)." : number of parts = ".count($this->parts).PHP_EOL;
281 foreach ($this->parts as $part) 289 foreach ($this->parts as $part)
282 $part->dump(); 290 $part->dump();
283 } 291 }
php/classes/TimeTableCacheObject.php
@@ -29,7 +29,7 @@ class TimeTableCacheObject @@ -29,7 +29,7 @@ class TimeTableCacheObject
29 $this->intervals = array(); 29 $this->intervals = array();
30 $this->indexes = array(); 30 $this->indexes = array();
31 unset($this->filter); 31 unset($this->filter);
32 - $this->filter = new TimeTableCacheFilterObject();; 32 + $this->filter = new TimeTableCacheFilterObject($this);
33 unset($this->sort); 33 unset($this->sort);
34 $this->sort = new TimeTableCacheSortObject($this); 34 $this->sort = new TimeTableCacheSortObject($this);
35 } 35 }
@@ -401,15 +401,15 @@ class TimeTableCacheObject @@ -401,15 +401,15 @@ class TimeTableCacheObject
401 //Modified 401 //Modified
402 fwrite($handle,pack('L',$this->isModified)); 402 fwrite($handle,pack('L',$this->isModified));
403 403
  404 + //Additional info
  405 + $this->writeAdditionalHeaderBin($handle);
  406 +
404 //Filter 407 //Filter
405 $this->filter->writeBin($handle); 408 $this->filter->writeBin($handle);
406 409
407 //Sort 410 //Sort
408 $this->sort->writeBin($handle); 411 $this->sort->writeBin($handle);
409 412
410 - //Additional info  
411 - $this->writeAdditionalHeaderBin($handle);  
412 -  
413 //Intervals 413 //Intervals
414 fwrite($handle,pack('L2',count($this->intervals), $this->lastId)); 414 fwrite($handle,pack('L2',count($this->intervals), $this->lastId));
415 foreach($this->intervals as $interval) { 415 foreach($this->intervals as $interval) {
@@ -451,15 +451,15 @@ class TimeTableCacheObject @@ -451,15 +451,15 @@ class TimeTableCacheObject
451 return false; 451 return false;
452 $this->isModified = $res['modified']; 452 $this->isModified = $res['modified'];
453 453
  454 + //Additional info
  455 + $this->loadAdditionalHeaderBin($handle);
  456 +
454 //Filter 457 //Filter
455 $this->filter->loadBin($handle); 458 $this->filter->loadBin($handle);
456 459
457 //Sort 460 //Sort
458 $this->sort->loadBin($handle); 461 $this->sort->loadBin($handle);
459 462
460 - //Additional info  
461 - $this->loadAdditionalHeaderBin($handle);  
462 -  
463 //Intervals 463 //Intervals
464 $res = unpack('L2data',fread($handle,2*4)); 464 $res = unpack('L2data',fread($handle,2*4));
465 $nbIntervals = $res['data1']; 465 $nbIntervals = $res['data1'];