On Sat, Apr 28, 2018 at 3:55 AM, Joao De Almeida Pereira < jdealmeidapere...@pivotal.io> wrote:
> Hi Hackers, > As you are aware we kept on working on the patch, so we are attaching to > this email a new version of the patch. > This new version contains all the changes in the previous one plus more > extractions of functions and refactoring of code. > > The objective of this patch is to create a separation between pgAdmin and > the ACI Tree. We are doing this because we realized that at this point in > time we have the ACI Tree all over the code of pgAdmin. I found a very > interesting article that really talks about this: > https://medium.freecodecamp.org/code-dependencies-are-the- > devil-35ed28b556d > > In this patch there are some visions and ideas about the location of the > code, the way to organize it and also try to pave the future for a > application that is stable, easy to develop on and that can be release at a > times notice. > > We are investing a big chunk of our time in doing this refactoring, but > while doing that we also try to respond to the patches sent to the mailing > list. We would like the feedback from the community because we believe this > is a changing point for the application. The idea is to change the way we > develop this application, instead of only correcting a bug of developing a > feature, with every commit we should correct the bug or develop a feature > but leave the code a little better than we found it (Refactoring, > refactoring, refactoring). This is hard work but that is what the users > from pgAdmin expect from this community of developers. > > > ====== > > > > It is a huge patch > 86 files changed, 5492 inserts, 1840 deletions > and we would like to get your feedback as soon as possible, because we are > continuing to work on it which means it is going to grow in size. > > > At this point in time we still have 124 of 176 calls to the function > itemData from ACITree. > > What does each patch contain: > 0001: > Very simple patch, we found out that the linter was not looking into all > the javascript test files, so this patch will ensure it is > > 0002: > New Tree abstraction. This patch contains the new Tree that works as an > adaptor for ACI Tree and is going to be used on all the extractions that we > are doing > > 0003: > Code that extracts, wrap with tests and replace ACI Tree invocations. > We start creating new pattern for the location of Javascript files and > their structure. > Create patterns for creation of dialogs (backup and restore) > Do you have some TODO left for the same? Or, is this the final one? Because - it gives us the better understanding during reviewing the patch. -- Thanks, Ashesh > > > Thanks > Joao > > > On Fri, Apr 27, 2018 at 5:34 AM Ashesh Vashi < > ashesh.va...@enterprisedb.com> wrote: > >> I have quite a few comments for the patch. >> I will send them soon. >> >> On Fri, Apr 27, 2018, 14:45 Dave Page <dp...@pgadmin.org> wrote: >> >>> How is your work on this going Ashesh? Will you be committing today? >>> >>> On Wed, Apr 25, 2018 at 8:52 AM, Dave Page <dp...@pgadmin.org> wrote: >>> >>>> Ashesh; you had agreed to work on this early this week. Please ensure >>>> you do so today. >>>> >>>> Thanks. >>>> >>>> On Tue, Apr 24, 2018 at 8:13 PM, Joao De Almeida Pereira < >>>> jdealmeidapere...@pivotal.io> wrote: >>>> >>>>> 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 >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>> >>>> >>>> -- >>>> Dave Page >>>> Blog: http://pgsnake.blogspot.com >>>> Twitter: @pgsnake >>>> >>>> EnterpriseDB UK: http://www.enterprisedb.com >>>> The Enterprise PostgreSQL Company >>>> >>> >>> >>> >>> -- >>> Dave Page >>> Blog: http://pgsnake.blogspot.com >>> Twitter: @pgsnake >>> >>> EnterpriseDB UK: http://www.enterprisedb.com >>> The Enterprise PostgreSQL Company >>> >>