Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Replace document/ref models with generic ref #182

Merged
merged 3 commits into from
Oct 9, 2024
Merged

Conversation

pnwpedro
Copy link
Contributor

@pnwpedro pnwpedro commented Oct 9, 2024

Description

  • This replaces a number of models used to represent documents with a generic Ref and NamedRef.
  • Adds support for non-standard Id, Collection, and Ts property names when modeling classes to represent documents.
  • Adds BaseRefSerializer, RefSerializer and NamedRefSerializer. The latter two simply wrap BaseRefSerializer.
  • Updates the DynamicSerializer to deserialize into Ref<>/NamedRef<>
  • Updates the DynamicSerializer to deserialize mapped classes into Ref or NamedRef instead of the mapped classes directly.
  • Splits Serializer.Test.cs and Deserializer.Test.cs into appropriately named test classes.

Below is the mapping for replaced types:

Existing Model Purpose Target Model
Ref For declaring refs, including as a return type or as a property of a document. Ref<Dictionary<string,object>>
Document Default when POCOs are not used. Ref<Dictionary<string,object>>
NamedRef For declaring named refs, including as a return type or as a property of a document. NamedRef<Dictionary<string,object>>
NamedDocument Default when POCOs are not used. NamedRef<Dictionary<string,object>>
NullableDocument The generic base type for NullDocument and NonNullDocument N/A
NullDocument For obtaining an object instead of an exception when materialization results in a null doc. Ref / NamedRef
NonNullDocument For obtaining a materialized document when it might be null. Ref / NamedRef

Motivation and context

BT-5145

The primary motivation is to support a case where a user defines a DataContext that includes documents with refs to other documents. In a LINQ query, they may wish to project the ref field, causing it to materialize as a sub-document, or may choose to just obtain the top level document leaving the ref field unmaterialized.

Given the LINQ API is strongly typed, there's no way to instruct a projection during a Select call unless you can obtain the type of the materialized ref (i.e. the document class).

A side effect is that this ultimately simplifies non-POCO cases.

How was the change tested?

  • A number of unit and e2e tests were added and updated.

Screenshots (if appropriate):

Change types

    • Bug fix (non-breaking change that fixes an issue)
    • New feature (non-breaking change that adds functionality)
    • Breaking change (backwards-incompatible fix or feature)

Checklist:

    • My code follows the code style of this project.
    • My change requires a change to Fauna documentation.
    • My change requires a change to the README, and I have updated it accordingly.

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Copy link
Contributor

@cynicaljoy cynicaljoy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just some whitespace nits and whatever is causing the 6.0 check to fail

Fauna/Types/BaseRefBuilder.cs Outdated Show resolved Hide resolved
@pnwpedro pnwpedro force-pushed the generic-refs branch 3 times, most recently from 149ccf5 to 8657855 Compare October 9, 2024 15:05
Copy link

github-actions bot commented Oct 9, 2024

Summary

Summary
Generated on: 10/09/2024 - 15:26:08
Parser: OpenCover
Assemblies: 1
Classes: 118
Files: 93
Line coverage: 80.7% (3106 of 3847)
Covered lines: 3106
Uncovered lines: 741
Coverable lines: 3847
Total lines: 8528
Branch coverage: 70.7% (1002 of 1416)
Covered branches: 1002
Total branches: 1416
Method coverage: Feature is only available for sponsors
Tag: ffef8ef

Coverage

Fauna - 80.7%
Name Line Branch
Fauna 80.7% 70.7%
Fauna.BaseClient 81.4% 68.7%
Fauna.Client 73.4% 52.9%
Fauna.Configuration 100% 100%
Fauna.Core.Connection 94.1% 72.2%
Fauna.Core.Endpoints 100% 100%
Fauna.Core.ErrorInfo 100%
Fauna.Core.QueryFailure 100% 66.6%
Fauna.Core.QueryOptions 82.1% 81.8%
Fauna.Core.QueryResponse 70% 77.2%
Fauna.Core.QueryStats 57.1%
Fauna.Core.QuerySuccess`1 69.2% 50%
Fauna.Core.RetryConfiguration 100% 100%
Fauna.Core.Stats 100%
Fauna.Core.StatsCollector 86.2% 100%
Fauna.Core.StreamEnumerable`1 100% 66.6%
Fauna.Exceptions.AbortException 100% 83.3%
Fauna.Exceptions.AuthenticationException 100%
Fauna.Exceptions.AuthorizationException 100%
Fauna.Exceptions.BadGatewayException 0%
Fauna.Exceptions.ConstraintFailure 100%
Fauna.Exceptions.ConstraintFailureException 100%
Fauna.Exceptions.ContendedTransactionException 100%
Fauna.Exceptions.ExceptionHandler 84.3% 89.3%
Fauna.Exceptions.FaunaException 25%
Fauna.Exceptions.InvalidRequestException 100%
Fauna.Exceptions.NetworkException 100%
Fauna.Exceptions.NullDocumentException 100% 100%
Fauna.Exceptions.ProtocolException 0%
Fauna.Exceptions.QueryCheckException 100%
Fauna.Exceptions.QueryRuntimeException 100%
Fauna.Exceptions.QueryTimeoutException 100%
Fauna.Exceptions.SerializationException 100%
Fauna.Exceptions.ServiceException 80.9%
Fauna.Exceptions.ThrottlingException 42.8%
Fauna.Exceptions.TimeoutException 100%
Fauna.IQueryFragmentExtensions 0%
Fauna.Linq.DataContext 84.1% 87.5%
Fauna.Linq.DataContextBuilder`1 92.1% 86.6%
Fauna.Linq.IntermediateQueryHelpers 80% 83.3%
Fauna.Linq.IPipelineExecutor 55.2% 28.2%
Fauna.Linq.IQuerySource 0% 0%
Fauna.Linq.LookupTable 40% 16.6%
Fauna.Linq.MappedDeserializer`2 75%
Fauna.Linq.Pipeline 100% 100%
Fauna.Linq.ProjectionAnalysisVisitor 96.1% 87.5%
Fauna.Linq.ProjectionDeserializer 80.9% 58.3%
Fauna.Linq.ProjectionRewriteVisitor 100% 100%
Fauna.Linq.QuerySource 100%
Fauna.Linq.QuerySource`1 93.7% 90.7%
Fauna.Linq.QuerySourceExtensions 25% 50%
Fauna.Linq.SubQuerySwitch 56.7% 19.4%
Fauna.Mapping.BaseFieldAttribute 100%
Fauna.Mapping.CollectionAttribute 100%
Fauna.Mapping.FieldAttribute 100%
Fauna.Mapping.FieldInfo 100% 91.6%
Fauna.Mapping.FieldName 100% 100%
Fauna.Mapping.IdAttribute 100% 50%
Fauna.Mapping.IgnoreAttribute 100%
Fauna.Mapping.MappingContext 100% 100%
Fauna.Mapping.MappingInfo 96.5% 100%
Fauna.Mapping.TsAttribute 100%
Fauna.Query 100%
Fauna.QueryArr 58.6% 50%
Fauna.QueryExpr 80% 50%
Fauna.QueryLiteral 86.1% 62.5%
Fauna.QueryObj 32.1% 0%
Fauna.QueryStringHandler 100% 100%
Fauna.QueryVal 79.5% 50%
Fauna.Serialization.BaseRefSerializer`1 82.8% 78.5%
Fauna.Serialization.BaseSerializer`1 18.7% 0%
Fauna.Serialization.BooleanSerializer 92.3% 83.3%
Fauna.Serialization.ByteSerializer 92.3% 83.3%
Fauna.Serialization.ClassSerializer`1 83.6% 80.9%
Fauna.Serialization.DateOnlySerializer 92.3% 83.3%
Fauna.Serialization.DateTimeOffsetSerializer 92.3% 83.3%
Fauna.Serialization.DateTimeSerializer 92.3% 83.3%
Fauna.Serialization.DictionarySerializer`1 84% 75%
Fauna.Serialization.DoubleSerializer 92.3% 83.3%
Fauna.Serialization.DynamicSerializer 90.7% 75%
Fauna.Serialization.FloatSerializer 92.3% 83.3%
Fauna.Serialization.IntSerializer 92.3% 83.3%
Fauna.Serialization.ListSerializer`1 85% 66.6%
Fauna.Serialization.LongSerializer 92.3% 83.3%
Fauna.Serialization.ModuleSerializer 30.7% 16.6%
Fauna.Serialization.NamedRefSerializer`1 100%
Fauna.Serialization.NullableSerializer`1 100% 100%
Fauna.Serialization.NullableStructSerializer`1 100% 100%
Fauna.Serialization.PageSerializer`1 92.1% 87.5%
Fauna.Serialization.QueryArrSerializer 0% 0%
Fauna.Serialization.QueryExprSerializer 77.7% 66.6%
Fauna.Serialization.QueryLiteralSerializer 55.5% 50%
Fauna.Serialization.QueryObjSerializer 69.2% 50%
Fauna.Serialization.QuerySerializer 60% 50%
Fauna.Serialization.QueryValSerializer 69.2% 50%
Fauna.Serialization.RefSerializer`1 100%
Fauna.Serialization.SByteSerializer 92.3% 83.3%
Fauna.Serialization.Serializer 86.6% 81.2%
Fauna.Serialization.ShortSerializer 92.3% 83.3%
Fauna.Serialization.StreamSerializer 57.1% 50%
Fauna.Serialization.StringSerializer 92.8% 87.5%
Fauna.Serialization.UIntSerializer 92.3% 83.3%
Fauna.Serialization.UShortSerializer 92.3% 83.3%
Fauna.Serialization.Utf8FaunaReader 72.6% 77.8%
Fauna.Serialization.Utf8FaunaWriter 90.1%
Fauna.StreamOptions 61.5%
Fauna.Types.BaseRef`1 55%
Fauna.Types.BaseRefBuilder`1 95% 81.8%
Fauna.Types.Event`1 85.4% 66.6%
Fauna.Types.Module 52.6% 20%
Fauna.Types.NamedRef`1 60% 62.5%
Fauna.Types.Page`1 100%
Fauna.Types.Ref`1 60% 62.5%
Fauna.Types.Stream 66.6% 35.7%
Fauna.Util.DefaultExpressionSwitch`1 0%
Fauna.Util.Expressions 100% 100%
Fauna.Util.ExpressionSwitch`1 84.8% 75.5%
Fauna.Util.Extensions.PaginationExtensions 100% 100%
Fauna.Util.Extensions.TypeExtensions 93.3% 81.2%

Delta Summary

Generated on: 10/09/2024 - 15:26
Description Previous Current Delta
Coverage date: 10/09/2024 - 15:25 10/09/2024 - 15:26
Tag: main ffef8ef
Line coverage: 81.5% 80.7% -0.8%
Covered lines: 3244 3106 -138
Coverable lines: 3978 3847 -131
Total lines: 14886 14836 -50
Branch coverage: 70.4% 70.7% 0.3%
Covered branches: 1057 1002 -55
Total branches: 1500 1416 -84
Method coverage: Feature is only available for sponsors

@pnwpedro pnwpedro merged commit 5bf33fd into main Oct 9, 2024
5 checks passed
@pnwpedro pnwpedro deleted the generic-refs branch October 9, 2024 15:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants