Improve PartialEvaluator.VisitConditional simplifications

XMLWordPrintableJSON

    • Type: Improvement
    • Resolution: Unresolved
    • Priority: Minor - P4
    • None
    • Affects Version/s: 3.4.0
    • Component/s: LINQ3
    • None
    • None
    • Dotnet Drivers
    • Hide

      1. What would you like to communicate to the user about this feature?
      2. Would you like the user to see examples of the syntax and/or executable code and its output?
      3. Which versions of the driver/connector does this apply to?

      Show
      1. What would you like to communicate to the user about this feature? 2. Would you like the user to see examples of the syntax and/or executable code and its output? 3. Which versions of the driver/connector does this apply to?
    • None
    • None
    • None
    • None
    • None
    • None

      I noticed while working with Odata and Mongo that some queries were very inefficient.  

      I believe I have identified the root cause of the problem which is described here: AspNetCoreOData/Issues/1490/Useless Expression.Condition when parsing IsOf

      Although the bug needs to be fixed on the OData side, I believe the Mongo driver could do better and should have simplified the expression. The case presented is simple, but it's likely that many optimizations could result from such a change.
      At a minimum, the driver should have simplified the expression:

      Unable to find source-code formatter for language: csharp. Available languages are: actionscript, ada, applescript, bash, c, c#, c++, cpp, css, erlang, go, groovy, haskell, html, java, javascript, js, json, lua, none, nyan, objc, perl, php, python, r, rainbow, ruby, scala, sh, sql, swift, visualbasic, xml, yaml
      o => o.SomeProperty.Any(o2 => o2 is SomeType ? true : false)
      

      Mongo query:

      { "$expr" : { "$anyElementTrue" : { "$map" : { "input" : "$SomeProperty", "as" : "se", "in" : { "$cond" : { "if" : { "$eq" : ["$$se._t", "SomeType"] }, "then" : true, "else" : false } } } } } }
      

      To:

      Unable to find source-code formatter for language: csharp. Available languages are: actionscript, ada, applescript, bash, c, c#, c++, cpp, css, erlang, go, groovy, haskell, html, java, javascript, js, json, lua, none, nyan, objc, perl, php, python, r, rainbow, ruby, scala, sh, sql, swift, visualbasic, xml, yaml
      o => o.SomeProperty.Any(o2 => o2 is SomeType)
      

      Mongo query:

      { "SomeProperty" : { "$elemMatch" : { "_t" : "SomeType" } } }
      

      But I imagine the biggest gains would be to do it recursively. And include Expression.Not unary expression.

       
       

            Assignee:
            Robert Stam
            Reporter:
            Rafael Pallares
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: