Commit 536056b120dafc45b8a5aca487ea59d587a94df3

Authored by Furkan
1 parent 33d022a8

Working, but optimisation to do

js/app/views/CatalogUI.js
... ... @@ -1040,7 +1040,9 @@ Ext.define('amdaUI.CatalogUI', {
1040 1040 checkOperationValidity: function(firstColumn, secondColumn, operation)
1041 1041 {
1042 1042 var me = this;
1043   - var isValid = false;
  1043 + var isValid = false;
  1044 + var newType = 0;
  1045 + var newSize = null;
1044 1046 Ext.each(me.columnsStore.data.items, function(fcolumn){
1045 1047 if(fcolumn.data.columnId == firstColumn){
1046 1048 Ext.each(me.columnsStore.data.items, function(scolumn){
... ... @@ -1049,20 +1051,38 @@ Ext.define('amdaUI.CatalogUI', {
1049 1051 case 'minus':
1050 1052 if(fcolumn.data.size == scolumn.data.size){
1051 1053 isValid = true;
  1054 + newSize = fcolumn.data.size;
1052 1055 }
1053 1056 break;
1054 1057 case 'plus':
1055 1058 if(fcolumn.data.size == scolumn.data.size){
1056 1059 isValid = true;
  1060 + newSize = fcolumn.data.size;
1057 1061 }
1058 1062 break;
1059 1063 case 'multiplication':
1060   - isValid = true;
  1064 + if(fcolumn.data.size == scolumn.data.size){
  1065 + isValid = true;
  1066 + newSize = fcolumn.data.size;
  1067 + }
  1068 + else if (fcolumn.data.size ==1 && scolumn.data.size > 1){
  1069 + isValid = true;
  1070 + newSize = scolumn.data.size;
  1071 + }
  1072 + else if (fcolumn.data.size > 1 && scolumn.data.size == 1){
  1073 + isValid = true;
  1074 + newSize = fcolumn.data.size;
  1075 + }
1061 1076 break;
1062 1077 case 'division':
1063   - if (fcolumn.data.size == scolumn.data.size ||
1064   - (fcolumn.data.size != 1 && scolumn.data.size == 1)){
  1078 + if (fcolumn.data.size == scolumn.data.size)
  1079 + {
  1080 + isValid = true;
  1081 + newSize = fcolumn.data.size;
  1082 + }
  1083 + else if (fcolumn.data.size != 1 && scolumn.data.size == 1){
1065 1084 isValid = true;
  1085 + newSize = fcolumn.data.size;
1066 1086 }
1067 1087 break;
1068 1088 default:
... ... @@ -1072,7 +1092,27 @@ Ext.define('amdaUI.CatalogUI', {
1072 1092 });
1073 1093 }
1074 1094 });
1075   - return isValid;
  1095 + return {isValid, newType, newSize};
  1096 + },
  1097 +
  1098 + getNewColumnInfo: function(firstColumn, secondColumn, operation, newColumn,newType, newSize){
  1099 + var me =this;
  1100 + var newColumnPrefix='added_param_id_';
  1101 + var nbAddedColumn= 0;
  1102 + Ext.each(me.columnsStore.data.items, function(column){
  1103 + if(column.data.columnId.substr(0, 15) == newColumnPrefix){
  1104 + nbAddedColumn++;
  1105 + }
  1106 + });
  1107 +
  1108 + return {
  1109 + 'id': newColumnPrefix +nbAddedColumn,
  1110 + 'name': newColumn,
  1111 + 'type': newType,
  1112 + 'size': newSize,
  1113 + 'description':"operation "+firstColumn+" "+operation+" "+secondColumn
  1114 + };
  1115 +
1076 1116 },
1077 1117  
1078 1118 getAllColumnsStore: function()
... ... @@ -1188,14 +1228,38 @@ Ext.define('amdaUI.CatalogUI', {
1188 1228 var secondColumn = this.up('form').getForm().findField('secondColumn').getValue();
1189 1229 var operation = this.up('form').getForm().findField('operationColumn').getValue();
1190 1230 var newColumn = this.up('form').getForm().findField('newColumn').getValue();
  1231 +
  1232 + resultCheck = me.checkOperationValidity(firstColumn, secondColumn, operation);
1191 1233  
1192 1234 //We check if it's possible
1193   - if(me.checkOperationValidity(firstColumn, secondColumn, operation)){
1194   - console.log("YEEEAAAAHHHH");
  1235 + if(resultCheck.isValid){
  1236 + var newColumnInfo = me.getNewColumnInfo(firstColumn, secondColumn, operation, newColumn,resultCheck.newType, resultCheck.newSize);
  1237 + AmdaAction.calculateAddColumn(firstColumn,secondColumn,operation,newColumnInfo, function(result,e){
  1238 +
  1239 + if(result){
  1240 + me.toReconfigure = true;
  1241 + me.onAfterInit(result);
  1242 + window.close();
  1243 + }
  1244 + else{
  1245 + if (result.message)
  1246 + myDesktopApp.errorMsg(result.message);
  1247 + else
  1248 + myDesktopApp.errorMsg('Unknown error during the creation of the column');
  1249 + Ext.defer(function () {
  1250 + Ext.Msg.toFront()
  1251 + }, 10);
  1252 + }
  1253 +
  1254 + });
1195 1255 }
1196 1256 else
1197 1257 {
1198   - console.log(" NOAAAAAAH");
  1258 + // error to show, operation not possible.
  1259 + myDesktopApp.errorMsg("Can't realize the operation.");
  1260 + Ext.defer(function () {
  1261 + Ext.Msg.toFront()
  1262 + }, 10);
1199 1263  
1200 1264 }
1201 1265  
... ...
php/classes/AmdaAction.php
... ... @@ -822,6 +822,151 @@ class AmdaAction
822 822 }
823 823 return array('success' => true ,"result" => $columnNames);
824 824 }
  825 +
  826 + function stringToVector($str) {
  827 + // Remove parentheses and split the string by commas
  828 + $str = trim($str, '()');
  829 + return array_map('floatval', explode(',', $str)); // Use floatval for conversion
  830 + }
  831 +
  832 + function vectorToString($vector) {
  833 + // Convert each element to a string and join them with commas
  834 + $str = implode(',', array_map('strval', $vector));
  835 + // Wrap the result in parentheses
  836 + return $str;
  837 + }
  838 +
  839 + public function calculateAddColumn($firstColumnId, $secondColumnId, $operation, $newColumnObj){
  840 + $cacheMgr = new CatalogCacheMgr(); // Initiating the cache
  841 + $intervals = $cacheMgr->getIntervals(NULL, NULL, NULL, NULL); // Getting all the values
  842 + if(empty($intervals))
  843 + return array('success' => false , 'message'=>'Error : No interval to compute on.');
  844 +
  845 + // Creation of the new column
  846 + $resultAdd = $cacheMgr->addColumn($newColumnObj->id,$newColumnObj->name, $newColumnObj->type, $newColumnObj->size,$newColumnObj->description,"");
  847 +
  848 + if(!$resultAdd['success'])
  849 + return array('success' => false , 'message'=>'Error : Cannot add new column.');
  850 +
  851 + // Computing columns
  852 + $newColumnValues = array();
  853 +
  854 + switch ($operation) {
  855 + case 'plus':
  856 + foreach($intervals['intervals'] as $interval){
  857 + if ($newColumnObj->size == 1)
  858 + $newColumnValues[$interval['cacheId']] = $interval[$firstColumnId] + $interval[$secondColumnId];
  859 + else if ($newColumnObj->size > 1){
  860 + $fColumnVectorValues = $this->stringToVector($interval[$firstColumnId]);
  861 + $sColumnVectorValues = $this->stringToVector($interval[$secondColumnId]);
  862 + if (count($fColumnVectorValues) !== count($sColumnVectorValues))
  863 + return array('success' => false, 'message' => "Addition not possible");
  864 +
  865 + $result = [];
  866 + for ($i = 0; $i < count($fColumnVectorValues); $i++)
  867 + $result[] = $fColumnVectorValues[$i] + $sColumnVectorValues[$i];
  868 + $newColumnValues[$interval['cacheId']] = $result;
  869 + }
  870 + }
  871 + break;
  872 + case 'minus':
  873 + foreach($intervals['intervals'] as $interval){
  874 + if ($newColumnObj->size == 1)
  875 + $newColumnValues[$interval['cacheId']] = $interval[$firstColumnId] - $interval[$secondColumnId];
  876 + else if ($newColumnObj->size > 1){
  877 + $fColumnVectorValues = $this->stringToVector($interval[$firstColumnId]);
  878 + $sColumnVectorValues = $this->stringToVector($interval[$secondColumnId]);
  879 + if (count($fColumnVectorValues) !== count($sColumnVectorValues))
  880 + return array('success' => false, 'message' => "Vectors must be of the same length.");
  881 +
  882 + $result = [];
  883 + for ($i = 0; $i < count($fColumnVectorValues); $i++)
  884 + $result[] = $fColumnVectorValues[$i] - $sColumnVectorValues[$i];
  885 + $newColumnValues[$interval['cacheId']] = $result;
  886 + }
  887 + else{
  888 + return array('success' => false, 'message' => "Substraction not possible");
  889 + }
  890 + }
  891 + break;
  892 + case 'multiplication':
  893 + foreach($intervals['intervals'] as $interval){
  894 + if ($newColumnObj->size == 1)
  895 + $newColumnValues[$interval['cacheId']] = $interval[$firstColumnId] * $interval[$secondColumnId];
  896 + else{
  897 + $fColumnVectorValues = $this->stringToVector($interval[$firstColumnId]);
  898 + $sColumnVectorValues = $this->stringToVector($interval[$secondColumnId]);
  899 + if (count($fColumnVectorValues) == count($sColumnVectorValues)) {
  900 + $result = [];
  901 + for ($i = 0; $i < count($fColumnVectorValues); $i++)
  902 + $result[] = $fColumnVectorValues[$i] * $sColumnVectorValues[$i];
  903 + $newColumnValues[$interval['cacheId']] = $result;
  904 + }
  905 + else if(count($fColumnVectorValues) == 1){
  906 + $result = [];
  907 + for ($i = 0; $i < count($sColumnVectorValues); $i++)
  908 + $result[] = $fColumnVectorValues[0] * $sColumnVectorValues[$i];
  909 + $newColumnValues[$interval['cacheId']] = $result;
  910 + }
  911 + else if(count($sColumnVectorValues) == 1){
  912 + $result = [];
  913 + for ($i = 0; $i < count($fColumnVectorValues); $i++)
  914 + $result[] = $sColumnVectorValues[0] * $fColumnVectorValues[$i];
  915 + $newColumnValues[$interval['cacheId']] = $result;
  916 + }
  917 + else{
  918 + return array('success' => false, 'message' => "Multiplication not possible");
  919 + }
  920 + }
  921 + }
  922 + break;
  923 + case 'division':
  924 + foreach($intervals['intervals'] as $interval){
  925 + if ($newColumnObj->size == 1){
  926 + $newColumnValues[$interval['cacheId']] =($interval[$secondColumnId] == 0) ? NAN : $interval[$firstColumnId] / $interval[$secondColumnId];
  927 + }
  928 + else{
  929 + $fColumnVectorValues = $this->stringToVector($interval[$firstColumnId]);
  930 + $sColumnVectorValues = $this->stringToVector($interval[$secondColumnId]);
  931 + error_log(print_r($interval[$firstColumnId], true));
  932 + error_log(print_r($interval[$secondColumnId], true));
  933 + if (count($fColumnVectorValues) == count($sColumnVectorValues)) {
  934 + $result = [];
  935 + for ($i = 0; $i < count($fColumnVectorValues); $i++)
  936 + $result[] = ($sColumnVectorValues[$i] == 0) ? NAN :$fColumnVectorValues[$i] / $sColumnVectorValues[$i];
  937 + $newColumnValues[$interval['cacheId']] = $result;
  938 + }
  939 + else if(count($sColumnVectorValues) == 1){
  940 + $result = [];
  941 + for ($i = 0; $i < count($fColumnVectorValues); $i++)
  942 + $result[] = ($sColumnVectorValues[0] == 0) ? NAN : $fColumnVectorValues[$i] / $sColumnVectorValues[0];
  943 + $newColumnValues[$interval['cacheId']] = $result;
  944 + }
  945 + else{
  946 + return array('success' => false, 'message' => "Division not possible");
  947 + }
  948 + }
  949 + }
  950 + break;
  951 + default:
  952 + break;
  953 + }
  954 + for ($i = 0; $i < count($newColumnValues); $i++)
  955 + {
  956 + $data= array();
  957 + $data[$newColumnObj->id] = (count($newColumnValues[$i]) > 1) ? $this->vectorToString($newColumnValues[$i]) : $newColumnValues[$i];
  958 + $valueArray = array(
  959 + 'cacheId' => $i,
  960 + 'isCatalog' => true,
  961 + 'data' => $data
  962 + );
  963 + if(!$this->modifyCacheInterval((object)$valueArray)){
  964 + return array('success' => false, 'message' => "Impossible to modify the column");
  965 + }
  966 + }
  967 + // return array('success' => true , 'token' => $this->cache->getToken(), 'status' => $this->cache->getStatus(),'parameters' => $this->cache->getParametersInfo());
  968 + return $cacheMgr->modifyAllIntervals();
  969 + }
825 970 /*
826 971 * $obj = { id: node.id, leaf: node.leaf, nodeType: node.nodeType }
827 972 */
... ...
php/classes/CatalogCacheMgr.php
... ... @@ -185,6 +185,11 @@ class CatalogCacheMgr extends TimeTableCacheMgr
185 185 return $this->cache->getParameterInfo($id);
186 186 }
187 187  
  188 + public function modifyAllIntervals(){
  189 +
  190 + return array('success' => true , 'token' => $this->cache->getToken(), 'status' => $this->cache->getStatus(),'parameters' => $this->cache->getParametersInfo());
  191 + }
  192 +
188 193 public function editColumn($id,$name, $type,$size, $description, $status){
189 194 if (!$this->loadFromFile())
190 195 return array('success' => false, 'message' => 'Cannot load cache file');
... ...
php/config.php
... ... @@ -220,6 +220,7 @@ $API = array(
220 220 'resetPwd' => array('len' => 1),
221 221 // Get column names for a cat
222 222 'getAllColumnNames' => array('len' => 1),
  223 + 'calculateAddColumn' => array('len' => 4),
223 224  
224 225 )
225 226 )
... ...