Uploaded image for project: 'OFBiz'
  1. OFBiz
  2. OFBIZ-4053

Implement an Entity Query Builder

Agile BoardAttach filesAttach ScreenshotVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • New Feature
    • Status: Closed
    • Major
    • Resolution: Fixed
    • Trunk
    • 14.12.01
    • framework
    • None

    Description

      As discussed on the dev list here: http://ofbiz.markmail.org/thread/l6kiywqzfj656dhc

      Attached is an initial implementation of builder classes (of sorts) that make use of method chaining in order to simplify use of the Delegator interface to query entities.

      Rather than taking all possible query parameters into a single method as the delegator does, this implementation instead builds a query through a succession of distinct method calls.

      A simple example:

      // Using the Delegator interface directly
      eli = delegator.find("FinAccountTrans", condition, null, null, UtilMisc.toList("-transactionDate"), null);
      
      // Using the new implementation
      eli = EntityBuilderUtil.list(delegator).from("FinAccountTrans").where(condition).orderBy("-transactionDate").iterator();
      

      A more complex example:

      // Delegator
      EntityCondition queryConditionsList = EntityCondition.makeCondition(allConditions, EntityOperator.AND);
      EntityFindOptions options = new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true);
      options.setMaxRows(viewSize * (viewIndex + 1));
      EntityListIterator iterator = delegator.find("OrderHeader", queryConditionsList, null, null, UtilMisc.toList("orderDate DESC"), options);
      
      // becomes
      EntityListIterator iterator = EntityBuilderUtil.list(delegator).distinct()
                                                                     .from("OrderHeader")
                                                                     .where(allConditions)
                                                                     .orderBy("orderDate DESC")
                                                                     .maxRows(viewSize * (viewIndex + 1))
                                                                     .cursorScrollInsensitive()
                                                                     .iterator();
      

      A couple of issues with the implementation so far that I'm not entirely happy with:

      • I'm not so sure that I like EntityBuilderUtil.list(delegator) in place of something like EntityList.use(delegator). The latter requires less typing and I think is more intuitive than typing EntityBuilderUtil because of its similarities to the corresponding minilang method calls, I actually kept having trouble remembering what it was called when converting some delegator calls over. It also requires a little more typing (16-17 characters vs. 12-13), not a big deal but every little bit helps with what would be a very commonly used class.
      • I'm struggling to see the point of having the GenericQueryBuilder interface, the two classes share very little in the way of API and its use seems a little superfluous to me.

      Opinions on the above points or anything else to do with the implementation are most welcome. I'd like to get the API locked down (and hopefully some javadocs in place) before committing.

      Attachments

        1. builder.patch
          18 kB
          Scott Gray
        2. builder.patch
          18 kB
          Scott Gray
        3. builder.patch
          15 kB
          Scott Gray

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            lektran Scott Gray
            lektran Scott Gray
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment