Commit 536056b120dafc45b8a5aca487ea59d587a94df3
1 parent
33d022a8
Exists in
master
and in
2 other branches
Working, but optimisation to do
Showing
4 changed files
with
223 additions
and
8 deletions
Show diff stats
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