Hi Hackers, Can someone review and merge this patch?
Thanks Joao On Wed, Apr 18, 2018 at 10:23 AM Joao De Almeida Pereira < jdealmeidapere...@pivotal.io> wrote: > Hi Hackers, > Any other comment about this patch? > > Thanks > Joao > > On Tue, Apr 10, 2018 at 12:00 PM Joao De Almeida Pereira < > jdealmeidapere...@pivotal.io> wrote: > >> Hello Khushboo >> >> On Mon, Apr 9, 2018 at 1:59 AM Khushboo Vashi < >> khushboo.va...@enterprisedb.com> wrote: >> >>> Hi Joao, >>> >>> I have reviewed your patch and have some suggestions. >>> >>> On Sat, Apr 7, 2018 at 12:43 AM, Joao De Almeida Pereira < >>> jdealmeidapere...@pivotal.io> wrote: >>> >>>> Hello Murtuza/Dave, >>>> Yes now the extracted functions are spread into different files. The >>>> intent would be to make the files as small as possible, and also to group >>>> and name them in a way that would be easy to understand what each file is >>>> doing without the need of opening it. >>>> As a example: >>>> static/js/backup will contain all the backup related functionality >>>> inside of this folder we can see the file: >>>> >>> menu_utils.js At this moment in time we decided to group all the >>>> functions that are related to the menu, but we can split that also if we >>>> believe it is easier to see. >>>> >>> It's really very good to see the separated code for backup module. As we >>> have done for backup, we would like do it for other PG utilities like >>> restore, maintenance etc. >>> Considering this, we should separate the code in a way that some of the >>> common functionalities can be used for other modules like menu (as you >>> have mentioned above), dialogue factory etc. >>> Also, I think these functionalities should be in their respective static >>> folder instead of pgadmin/static. >>> >> >> About the location of the files. The move of the files to >> pgadmin/static/js was made on purpose in order to clearly separate >> Javascript from python code. >> The rational behind it was >> - Create a clear separation between the backend and frontend >> - Having Javascript code concentrated in a single place, hopefully, will >> encourage to developers to look for a functionality, that is already >> implemented in another modules, because they are right there. (When we >> started this journey we realized that the 'nodes' have a big groups of code >> that could be shared, but because the Javascript is spread everywhere it is >> much harder to look for it) >> >> >> There are some drawbacks of this separation: >> - When creating a new module we will need to put the javascript in a >> separate location from the backend code >> >> >>> >>> >>>> static/js/datagrid folder contains all the datagrid related >>>> functionality >>>> >>> Same as backup module, this should be in it's respective static/js >>> folder. >>> >>>> Inside of the folder we can see the files: >>>> get_panel_title.js is responsible for retrieving the name of the panel >>>> show_data.js is responsible for showing the datagrid >>>> show_query_tool.js is responsible for showing the query tool >>>> >>>> Does this structure make sense? >>>> Can you give an example of a comment that you think is missing and that >>>> could help? >>>> >>>> As a personal note, unless the algorithm is very obscure or very >>>> complicated, I believe that if the code needs comments it is a signal that >>>> something needs to change in terms of naming, structure of the part in >>>> question. This being said, I am open to add some comments that might help >>>> people. >>>> >>> You are right, with the help of naming convention and structure of the >>> code, any one can get the idea about the code. But it is very useful to >>> understand the code >>> very easily with the proper comments especially when there are multiple >>> developers working on a single project. >>> >>> I found some of the places where it would be great to have comments. >>> >>> - treeMenu: new tree.Tree() in a browser.js >>> - tree.js (especially Tree class) >>> >> About the comment point I need a more clear understanding on what kind of >> comments you are looking for. Because when you read the function names you >> understand the intent, what they are doing. The parameters also explain >> what you need to pass into them. >> >> If what you are looking for in these comments is the reasoning being the >> change itself, then that should be present in the commit message. Specially >> because this is going to be a very big patch with a very big number of >> changes. >> >>> >>> Thanks >>>> Joao >>>> >>>> >>>> Thanks, >>> Khushboo >>> >>>> >>>> On Fri, Apr 6, 2018 at 4:48 AM Murtuza Zabuawala < >>>> murtuza.zabuaw...@enterprisedb.com> wrote: >>>> >>>>> Hi Joao, >>>>> >>>>> Patch looks good and working as expected. >>>>> >>>>> I also agree with Dave, Can we please add some comments in each file >>>>> which can help us to understand the flow, I'm saying because now the code >>>>> is segregated in so many separate files it will be hard to keep track of >>>>> the flow from one file to another when debugging. >>>>> >>>>> >>>>> -- >>>>> Regards, >>>>> Murtuza Zabuawala >>>>> EnterpriseDB: http://www.enterprisedb.com >>>>> The Enterprise PostgreSQL Company >>>>> >>>>> >>>>> On Thu, Apr 5, 2018 at 7:08 PM, Joao De Almeida Pereira < >>>>> jdealmeidapere...@pivotal.io> wrote: >>>>> >>>>>> Hi Khushboo, >>>>>> Attached you can find both patches rebased >>>>>> >>>>>> Thanks >>>>>> >>>>>> >>>>>> On Thu, Apr 5, 2018 at 6:31 AM Khushboo Vashi < >>>>>> khushboo.va...@enterprisedb.com> wrote: >>>>>> >>>>>>> Hi Joao, >>>>>>> >>>>>>> Can you please rebase the second patch? >>>>>>> >>>>>>> Thanks, >>>>>>> Khushboo >>>>>>> >>>>>>> >>>>>>> On Tue, Apr 3, 2018 at 12:15 AM, Joao De Almeida Pereira < >>>>>>> jdealmeidapere...@pivotal.io> wrote: >>>>>>> >>>>>>>> Hi Hackers, >>>>>>>> >>>>>>>> Attached you can find the patch that will start to decouple pgAdmin >>>>>>>> from ACITree library. >>>>>>>> This patch is intended to be merged after 3.0, because we do not >>>>>>>> want to cause any entropy or delay the release, but we want to start >>>>>>>> the >>>>>>>> discussion and show some code. >>>>>>>> >>>>>>>> This job that we started is a massive tech debt chore that will >>>>>>>> take some time to finalize and we would love the help of the community >>>>>>>> to >>>>>>>> do it. >>>>>>>> >>>>>>>> *Summary of the patch:* >>>>>>>> 0001 patch: >>>>>>>> - Creates a new tree that will allow us to create a separation >>>>>>>> between the application and ACI Tree >>>>>>>> - Creates a Fake Tree (Test double, for reference on the available >>>>>>>> test doubles: https://martinfowler.com/bliki/TestDouble.html) that >>>>>>>> can be used to inplace to replace the ACITree and also encapsulate the >>>>>>>> new >>>>>>>> tree behavior on our tests >>>>>>>> - Adds tests for all the tree functionalities >>>>>>>> >>>>>>>> 0002 patch: >>>>>>>> - Extracts, refactors, adds tests and remove dependency from ACI >>>>>>>> Tree on: >>>>>>>> - getTreeNodeHierarchy >>>>>>>> - on backup.js: menu_enabled, menu_enabled_server, >>>>>>>> start_backup_global_server, backup_objects >>>>>>>> - on datagrid.js: show_data_grid, get_panel_title, show_query_tool >>>>>>>> - Start using sprintf-js as Underscore.String is deprecating >>>>>>>> sprintf function >>>>>>>> >>>>>>>> This patch represents only 10 calls to ACITree.itemData out of 176 >>>>>>>> that are spread around our code >>>>>>>> >>>>>>>> >>>>>>>> *In Depth look on the process behind the patch:* >>>>>>>> >>>>>>>> We started writing this patch with the idea that we need to >>>>>>>> decouple pgAdmin4 from ACITree, because ACITree is no longer >>>>>>>> supported, the >>>>>>>> documentation is non existent and ACITree is no longer being actively >>>>>>>> developed. >>>>>>>> >>>>>>>> Our process: >>>>>>>> 1. We "randomly" selected a function that is part of the ACITree. >>>>>>>> From this point we decided to replace that function with our own >>>>>>>> version. >>>>>>>> The function that we choose was "itemData". >>>>>>>> The function gives us all the "data" that a specific node of the >>>>>>>> tree find. >>>>>>>> Given in order to replace the tree we would need to have a function >>>>>>>> that would give us the same information. We had 2 options: >>>>>>>> a) Create a tree with a function called itemData >>>>>>>> Pros: >>>>>>>> - At first view this was the simpler solution >>>>>>>> - Would keep the status quo >>>>>>>> Cons: >>>>>>>> - Not a OOP approach >>>>>>>> - Not very flexible >>>>>>>> b) Create a tree that would return a node given an ID and then >>>>>>>> the node would be responsible for giving it's data. >>>>>>>> Pros: >>>>>>>> - OOP Approach >>>>>>>> - More flexible and we do not need to bring the tree around, just >>>>>>>> a node >>>>>>>> Cons: >>>>>>>> - Break the current status quo >>>>>>>> >>>>>>>> Given these 2 options we decided to go for a more OOP approach >>>>>>>> creating a Tree and a TreeNode classes, that in the future will be >>>>>>>> renamed >>>>>>>> to ACITreeWrapper and TreeNode. >>>>>>>> >>>>>>>> 2. After we decided on the starting point we searched for >>>>>>>> occurrences of the function "itemData" and we found out that there >>>>>>>> were 303 >>>>>>>> occurrences of "itemData" in the code and roughly 176 calls to the >>>>>>>> function >>>>>>>> itself (some of the hits were variable names). >>>>>>>> >>>>>>>> 3. We selected the first file on the search and found the function >>>>>>>> that was responsible for calling the itemData function. >>>>>>>> >>>>>>>> 4. Extracted the function to a separate file >>>>>>>> >>>>>>>> 5. Wrap this function with tests >>>>>>>> >>>>>>>> 6. Refactor the function to ES6, give more declarative names to >>>>>>>> variables and break the functions into smaller chunks >>>>>>>> >>>>>>>> 7. When all the tests were passing we replaced ACITree with our Tree >>>>>>>> >>>>>>>> 8. We ensured that all tests were passing >>>>>>>> >>>>>>>> 9. Remove function from the original file and use the new function >>>>>>>> >>>>>>>> 10. Ensure everything still works >>>>>>>> >>>>>>>> 11. Find the next function and execute from step 4 until all the >>>>>>>> functions are replaced, refactored and tested. >>>>>>>> >>>>>>>> As you can see by the process this is a pretty huge undertake, >>>>>>>> because of the number of calls to the function. This is just the first >>>>>>>> step >>>>>>>> on the direction of completely isolating the ACITree so that we can >>>>>>>> solve >>>>>>>> the problem with a large number of elements on the tree. >>>>>>>> >>>>>>>> *What is on our radar that we need to address:* >>>>>>>> - Finish the complete decoupling of the ACITree >>>>>>>> - Performance of the current tree implementation >>>>>>>> - Tweak the naming of the Tree class to explicitly tell us this is >>>>>>>> to use only with ACITree. >>>>>>>> >>>>>>>> >>>>>>>> Thanks >>>>>>>> Joao >>>>>>>> >>>>>>>> >>>>>>> >>>>>