Uploaded image for project: 'C# Driver'
  1. C# Driver
  2. CSHARP-4555

Linq3 projection stage generated by group does not use registered class maps

    • Type: Icon: Bug Bug
    • Resolution: Unresolved
    • Priority: Icon: Unknown Unknown
    • None
    • Affects Version/s: 2.19.0
    • Component/s: LINQ3

      Summary

      Generated projection stage does not use registered class maps.

      How to Reproduce

      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
      BsonClassMap.RegisterClassMap(new ItemClassMap());
      BsonClassMap.RegisterClassMap(new SubItemClassMap());
      BsonClassMap.RegisterClassMap(new AggregationClassMap());var pipeline = PipelineDefinitionBuilder.For<Item>()
          .Group(
              e => e.Date,
              grouping => new Aggregation
              {
                  Date = grouping.Key, Count = grouping.Sum(item => item.Items.Length)
              });var renderedPipeline = pipeline.Render(BsonSerializer.LookupSerializer<Item>(), BsonSerializer.SerializerRegistry, LinqProvider.V3).Documents;foreach (var doc in renderedPipeline) Console.WriteLine(doc.ToString());
      
      public class SubItem
      {
          public string Name { get; set; }
      }
      
      public class Item
      {
          public string Id { get; set; }
          public DateTime Date { get; set; }
          public SubItem[] Items { get; set; }
      }
      
      public class Aggregation
      {
          public DateTime Date { get; set; }
          public long Count { get; set; }
      }
      
      public class SubItemClassMap : BsonClassMap<SubItem>
      {
          public SubItemClassMap()
          {
              MapMember(e => e.Name).SetElementName("name");
          }
      }
      
      public class ItemClassMap : BsonClassMap<Item>
      {
          public ItemClassMap()
          {
              MapIdField(e => e.Id).SetIdGenerator(StringObjectIdGenerator.Instance);
              MapMember(e => e.Date).SetElementName("date");
              MapMember(e => e.Items).SetElementName("items");
          }
      }
      
      public class AggregationClassMap : BsonClassMap<Aggregation>
      {
          public AggregationClassMap()
          {
              MapMember(e => e.Date).SetElementName("date");
              MapMember(e => e.Count).SetElementName("count");
          }
      } 

      The generated documents looks following:

      [
        { "$group" : { 
            "_id" : "$date", 
            "__agg0" : { "$sum" : { "$size" : "$items" } } 
        }}
        { "$project" : {
            "Date" : "$_id", 
            "Count" : { "$toLong" : "$__agg0" }, 
            "_id" : 0
        }}
      ]

      I've expected the following

      [
        { "$group" : { 
            "_id" : "$date", 
            "__agg0" : { "$sum" : { "$size" : "$items" } } 
        }}
        { "$project" : {
            "date" : "$_id", 
            "count" : { "$toLong" : "$__agg0" },
            "_id" : 0
        }}
      ] 

      The 2.18.0 driver generates a $convert step instead of the $toLong. Using $toLong seems to be correct for 2.19.0

            Assignee:
            Unassigned Unassigned
            Reporter:
            nesc58@gmail.com nesc58 N/A
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: