Ejemplo n.º 1
0
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan, PartitionPlan partitionPlan)
    {
        if (!partitionPlan.Documents.Any(x => x.IsMutable || x.IsTransient))
        {
            return;
        }

        var s = $@"
namespace {databasePlan.Namespace};

public class {partitionPlan.CreateOrReplaceClassName}
{{
    protected virtual {databasePlan.Namespace}.{partitionPlan.ClassName} {partitionPlan.ClassName} {{ get; }} = default!;

    /// <summary>Mocking constructor</summary>
    protected {partitionPlan.CreateOrReplaceClassName}() {{ }}

    internal protected {partitionPlan.CreateOrReplaceClassName}({databasePlan.Namespace}.{partitionPlan.ClassName} {partitionPlan.ClassNameArgument})
    {{
        this.{partitionPlan.ClassName} = {partitionPlan.ClassNameArgument} ?? throw new System.ArgumentNullException(nameof({partitionPlan.ClassNameArgument}));
    }}

{string.Concat(partitionPlan.Documents.Select(x => CreateOrReplace(partitionPlan, x)))}
}}
";

        outputModel.Context.AddSource($"partition_{partitionPlan.CreateOrReplaceClassName}.cs", s);
    }
Ejemplo n.º 2
0
    static string Unions(DatabasePlan databasePlan, PartitionPlan partitionPlan) =>
    partitionPlan.Unions.Count == 0 ? "" : $@"
    {databasePlan.Namespace}.{partitionPlan.QueryUnionsClassName}? unions;
    public virtual {databasePlan.Namespace}.{partitionPlan.QueryUnionsClassName} Unions => this.unions ??= new(
        {databasePlan.DbClassNameArgument}: this.{databasePlan.DbClassName},
        {partitionPlan.QueryBuilderClassNameArgument}: this.{partitionPlan.QueryBuilderClassName});
";
Ejemplo n.º 3
0
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan, PartitionPlan partitionPlan)
    {
        var s = $@"
namespace {databasePlan.Namespace};

public class {partitionPlan.QueryBuilderClassName} : Cosmogenesis.Core.DbQueryBuilderBase
{{
    protected virtual {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassName} {{ get; }} = default!;
    
    /// <summary>Mocking constructor</summary>
    protected {partitionPlan.QueryBuilderClassName}() {{ }}

    internal protected {partitionPlan.QueryBuilderClassName}(
        {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassNameArgument},
        Microsoft.Azure.Cosmos.PartitionKey? partitionKey)
        : base(
            dbBase: {databasePlan.DbClassNameArgument},
            partitionKey: partitionKey)
    {{
        {databasePlan.DbClassName} = {databasePlan.DbClassNameArgument} ?? throw new System.ArgumentNullException(nameof({databasePlan.DbClassNameArgument}));
    }}

{string.Concat(partitionPlan.Documents.Select(BuildQuery))}
{Unions(databasePlan, partitionPlan)}
}}
";

        if (partitionPlan.Unions.Any())
        {
            QueryBuilderUnionsWriter.Write(outputModel, databasePlan, partitionPlan);
        }

        outputModel.Context.AddSource($"partition_{partitionPlan.QueryBuilderClassName}.cs", s);
    }
Ejemplo n.º 4
0
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan)
    {
        var anyUnions = databasePlan.PartitionPlansByName.Values.SelectMany(x => x.Unions).Any();

        var s = $@"
namespace {databasePlan.Namespace};

public class {databasePlan.QueryBuilderClassName} : Cosmogenesis.Core.DbQueryBuilderBase
{{
    protected virtual {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassName} {{ get; }} = default!;

    /// <summary>Mocking constructor</summary>
    protected {databasePlan.QueryBuilderClassName}() {{ }}

    internal protected {databasePlan.QueryBuilderClassName}(
        {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassNameArgument})
        : base(
            dbBase: {databasePlan.DbClassNameArgument},
            partitionKey: null)
    {{
        {databasePlan.DbClassName} = {databasePlan.DbClassNameArgument} ?? throw new System.ArgumentNullException(nameof({databasePlan.DbClassNameArgument}));
    }}

{string.Concat(databasePlan.PartitionPlansByName.Values.SelectMany(x => x.Documents).Select(BuildQuery))}
{(anyUnions ? Unions(databasePlan) : "")}
}}
";

        if (anyUnions)
        {
            DbQueryBuilderUnionsWriter.Write(outputModel, databasePlan);
        }

        outputModel.Context.AddSource($"db_{databasePlan.QueryBuilderClassName}.cs", s);
    }
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan)
    {
        var anyUnions = databasePlan.PartitionPlansByName.Values.SelectMany(x => x.Unions).Any();

        var s = $@"
namespace {databasePlan.Namespace};

public class {databasePlan.QueryBuilderUnionsClassName} : Cosmogenesis.Core.DbQueryBuilderBase
{{
    /// <summary>Mocking constructor</summary>
    protected {databasePlan.QueryBuilderUnionsClassName}() {{ }}

    internal protected {databasePlan.QueryBuilderUnionsClassName}(
        {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassNameArgument})
        : base(
            dbBase: {databasePlan.DbClassNameArgument},
            partitionKey: null)
    {{
    }}

{string.Concat(databasePlan.PartitionPlansByName.Values.SelectMany(x => x.Unions).Select(BuildQuery))}
}}
";

        outputModel.Context.AddSource($"db_{databasePlan.QueryBuilderUnionsClassName}.cs", s);
    }
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan)
    {
        var s = $@"
namespace {databasePlan.Namespace};

public class {databasePlan.ChangeFeedProcessorClassName} : Cosmogenesis.Core.ChangeFeedProcessorBase
{{
    /// <summary>Mocking constructor</summary>
    protected {databasePlan.ChangeFeedProcessorClassName}() {{ }}

    public {databasePlan.ChangeFeedProcessorClassName}(
        Microsoft.Azure.Cosmos.Container databaseContainer,
        Microsoft.Azure.Cosmos.Container leaseContainer,
        string processorName,
        {databasePlan.Namespace}.{databasePlan.BatchHandlersClassName} {databasePlan.BatchHandlersArgumentName},
        {databasePlan.Namespace}.{databasePlan.SerializerClassName}? serializer = null,
        int maxItemsPerBatch = DefaultMaxItemsPerBatch,
        System.TimeSpan? pollInterval = null,
        System.DateTime? startTime = null) 
        : base (
            serializer: serializer ?? {databasePlan.Namespace}.{databasePlan.SerializerClassName}.Instance,
            processorName: processorName,            
            maxItemsPerBatch: maxItemsPerBatch,
            pollInterval: pollInterval,
            startTime: startTime,
            databaseContainer: databaseContainer,
            leaseContainer: leaseContainer,
            batchProcessor: new({databasePlan.BatchHandlersArgumentName}))
    {{
    }}
}}
";

        outputModel.Context.AddSource($"feed_{databasePlan.ChangeFeedProcessorClassName}.cs", s);
    }
Ejemplo n.º 7
0
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan, PartitionPlan partitionPlan)
    {
        var s = $@"
namespace {databasePlan.Namespace};

public class {partitionPlan.ReadClassName}
{{
    protected virtual {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassName} {{ get; }} = default!;
    protected virtual Microsoft.Azure.Cosmos.PartitionKey PartitionKey {{ get; }} = default!;

    /// <summary>Mocking constructor</summary>
    protected {partitionPlan.ReadClassName}() {{ }}

    internal protected {partitionPlan.ReadClassName}(
        {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassNameArgument},
        Microsoft.Azure.Cosmos.PartitionKey partitionKey)
    {{
        this.{databasePlan.DbClassName} = {databasePlan.DbClassNameArgument} ?? throw new System.ArgumentNullException(nameof({databasePlan.DbClassNameArgument}));
        this.PartitionKey = partitionKey;
    }}

{string.Concat(partitionPlan.Documents.Select(x => Read(databasePlan, x)))}
{Unions(databasePlan, partitionPlan)}
}}
";

        if (partitionPlan.Unions.Count > 0)
        {
            ReadUnionsWriter.Write(outputModel, databasePlan, partitionPlan);
        }

        outputModel.Context.AddSource($"partition_{partitionPlan.ReadClassName}.cs", s);
    }
Ejemplo n.º 8
0
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan)
    {
        var s = $@"
namespace {databasePlan.Namespace};

public class {databasePlan.PartitionsClassName}
{{
    protected virtual {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassName} {{ get; }} = default!;

    /// <summary>Mocking constructor</summary>
    protected {databasePlan.PartitionsClassName}() {{ }}

    internal protected {databasePlan.PartitionsClassName}({databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassNameArgument})
    {{
        this.{databasePlan.DbClassName} = {databasePlan.DbClassNameArgument} ?? throw new System.ArgumentNullException(nameof({databasePlan.DbClassNameArgument}));
    }}

{string.Concat(databasePlan.PartitionPlansByName.Values.Select(x => Partition(databasePlan, x)))}
}}
";

        outputModel.Context.AddSource($"db_{databasePlan.PartitionsClassName}.cs", s);

        foreach (var partition in databasePlan.PartitionPlansByName.Values)
        {
            PartitionWriter.Write(outputModel, databasePlan, partition);
        }
    }
Ejemplo n.º 9
0
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan)
    {
        var s = $@"
namespace {databasePlan.Namespace};

public class {databasePlan.ReadClassName}
{{
    protected virtual {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassName} {{ get; }} = default!;

    /// <summary>Mocking constructor</summary>
    protected {databasePlan.ReadClassName}() {{ }}

    internal protected {databasePlan.ReadClassName}({databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassNameArgument})
    {{
        this.{databasePlan.DbClassName} = {databasePlan.DbClassNameArgument} ?? throw new System.ArgumentNullException(nameof({databasePlan.DbClassNameArgument}));
    }}

    /// <summary>
    /// Try to load a document by pk & id.
    /// id should be transformed using DbDocHelper.GetValidId.
    /// Returns the document or null if not found.
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    public virtual System.Threading.Tasks.Task<Cosmogenesis.Core.DbDoc?> ByIdAsync(string partitionKey, string id) => 
        this.{databasePlan.DbClassName}.ReadByIdAsync(
            partitionKey: new Microsoft.Azure.Cosmos.PartitionKey(partitionKey), 
            id: id);

{string.Concat(databasePlan.PartitionPlansByName.Values.SelectMany(x => x.Documents).Select(x => Read(databasePlan, x)))}
}}
";

        outputModel.Context.AddSource($"db_{databasePlan.ReadClassName}.cs", s);
    }
Ejemplo n.º 10
0
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan)
    {
        var s = $@"
namespace {databasePlan.Namespace};

public class {databasePlan.QueryUnionsClassName} : Cosmogenesis.Core.DbQueryBase
{{
    protected virtual {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassName} {{ get; }} = default!;
    protected virtual {databasePlan.Namespace}.{databasePlan.QueryBuilderClassName} {databasePlan.QueryBuilderClassName} {{ get; }} = default!;

    /// <summary>Mocking constructor</summary>
    protected {databasePlan.QueryUnionsClassName}() {{ }}

    internal protected {databasePlan.QueryUnionsClassName}(
        {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassNameArgument},
        {databasePlan.Namespace}.{databasePlan.QueryBuilderClassName} {databasePlan.QueryBuilderClassNameArgument})
        : base(
            dbBase: {databasePlan.DbClassNameArgument},
            queryBuilder: {databasePlan.QueryBuilderClassNameArgument})
    {{
        this.{databasePlan.DbClassName} = {databasePlan.DbClassNameArgument} ?? throw new System.ArgumentNullException(nameof({databasePlan.DbClassNameArgument}));
        this.{databasePlan.QueryBuilderClassName} = {databasePlan.QueryBuilderClassNameArgument} ?? throw new System.ArgumentNullException(nameof({databasePlan.QueryBuilderClassNameArgument}));
    }}

{string.Concat(databasePlan.PartitionPlansByName.Values.SelectMany(x => x.Unions).Select(x => Query(databasePlan, x)))}
}}
";

        outputModel.Context.AddSource($"db_{databasePlan.QueryUnionsClassName}.cs", s);
    }
Ejemplo n.º 11
0
    static string Read(DatabasePlan databasePlan, DocumentPlan documentPlan)
    {
        if (documentPlan.GetIdPlan.Arguments.Count == 0)
        {
            return("");
        }

        var singleType      = documentPlan.GetIdPlan.Arguments[0].FullTypeName;
        var singleTypeParam = documentPlan.GetIdPlan.Arguments[0].ArgumentName.Pluralize();

        var inputParams =
            documentPlan.GetIdPlan.Arguments.Count == 1
            ? $"System.Collections.Generic.IEnumerable<{singleType}> {singleTypeParam}"
            : $"System.Collections.Generic.IEnumerable<({documentPlan.GetIdPlan.AsInputParameters()})> ids";
        var toId =
            documentPlan.GetIdPlan.Arguments.Count == 1
            ? $"{singleTypeParam}.Select({documentPlan.GetIdPlan.FullMethodName}).Select(Cosmogenesis.Core.DbDocHelper.GetValidId)"
            : $"ids.Select(x => {documentPlan.GetIdPlan.FullMethodName}({documentPlan.GetIdPlan.ParametersToParametersMapping("x")})).Select(Cosmogenesis.Core.DbDocHelper.GetValidId)";

        return($@"
    /// <summary>
    /// Try to load {documentPlan.ClassName} documents by id.
    /// Returns an array of {documentPlan.ClassName} documents (or null if not found) in the same order as the ids were provided.
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    public virtual System.Threading.Tasks.Task<{documentPlan.FullTypeName}?[]> {documentPlan.ClassName.Pluralize()}Async({inputParams}) => 
        this.{databasePlan.DbClassName}.ReadByIdsAsync<{documentPlan.FullTypeName}>(
            partitionKey: this.PartitionKey, 
            ids: {toId}, 
            type: {documentPlan.ConstDocType});
");
    }
Ejemplo n.º 12
0
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan)
    {
        var s = $@"
namespace {databasePlan.Namespace};

/// <summary>
/// This converter knows how to convert the DbDoc base type into documents from the {databasePlan.Name} database.
/// </summary>
public class {databasePlan.ConverterClassName} : Cosmogenesis.Core.DbDocConverterBase
{{
    /// <summary>
    /// This converter knows how to convert the DbDoc base type into documents from the {databasePlan.Name} database.
    /// </summary>
    public static readonly {databasePlan.Namespace}.{databasePlan.ConverterClassName} Instance = new();

    protected override Cosmogenesis.Core.DbDoc? DeserializeByType(
        System.ReadOnlySpan<byte> data, 
        string? type, 
        System.Text.Json.JsonSerializerOptions options) => type switch
        {{
{string.Concat(databasePlan.PartitionPlansByName.Values.SelectMany(x => x.Documents).Select(DeserializeType))}
            _ => throw new System.NotSupportedException($""We don't know how to deserialize a message of type {{type}}"")
        }};
}}
";

        outputModel.Context.AddSource($"db_{databasePlan.ConverterClassName}.cs", s);
    }
Ejemplo n.º 13
0
    static string Query(DatabasePlan databasePlan, UnionPlan unionPlan) => $@"
    /// <summary>
    /// Build and execute a query filtered to {unionPlan.CommonName} documents.
    /// {unionPlan.CommonName} is a union of: {string.Join(", ", unionPlan.Documents.Select(x => x.ClassName))}
    /// <see cref=""https://github.com/Azure/azure-cosmos-dotnet-v3/blob/bb72ba5786d99d928b4774e16810f2655029e8a2/Microsoft.Azure.Cosmos/src/Linq/CosmosLinqExtensions.cs"" />
    /// </summary>
    public virtual System.Collections.Generic.IAsyncEnumerable<T> {unionPlan.CommonName.Pluralize()}<T>(
        System.Func<System.Linq.IQueryable<{unionPlan.FullCommonTypeName}>, System.Linq.IQueryable<T>> createQuery,
        System.Threading.CancellationToken cancellationToken = default) 
        => this.{databasePlan.DbClassName}
            .ExecuteQueryAsync(
                query: createQuery(this.{databasePlan.QueryBuilderClassName}.Unions.{unionPlan.CommonName.Pluralize()}()),
                cancellationToken: cancellationToken);

    /// <summary>
    /// Execute a query filtered to {unionPlan.CommonName} documents.
    /// {unionPlan.CommonName} is a union of: {string.Join(", ", unionPlan.Documents.Select(x => x.ClassName))}
    /// </summary>
    public virtual System.Collections.Generic.IAsyncEnumerable<{unionPlan.FullCommonTypeName}> {unionPlan.CommonName.Pluralize()}(
        System.Threading.CancellationToken cancellationToken = default)
        => this.{databasePlan.DbClassName}
            .ExecuteQueryAsync(
                query: this.{databasePlan.QueryBuilderClassName}.Unions.{unionPlan.CommonName.Pluralize()}(),
                cancellationToken: cancellationToken);
";
Ejemplo n.º 14
0
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan)
    {
        var s = $@"
namespace {databasePlan.Namespace};

public class {databasePlan.BatchHandlersClassName} : Cosmogenesis.Core.BatchHandlersBase
{{
    /// <summary>Mocking constructor</summary>
    protected {databasePlan.BatchHandlersClassName}() {{ }}

    public {databasePlan.BatchHandlersClassName}({ConstructorArgs(databasePlan)}
        System.Func<System.Threading.CancellationToken, System.Threading.Tasks.Task>? newChangeFeedBatch = null,
        System.Func<System.Threading.CancellationToken, System.Threading.Tasks.Task>? finishingBatch = null)
    {{
        this.NewChangeFeedBatch = newChangeFeedBatch;
        this.FinishingBatch = finishingBatch;
        {string.Concat(databasePlan.PartitionPlansByName.Values.Select(AssignArg))}
    }}

{string.Concat(databasePlan.PartitionPlansByName.Values.Select(Partition))}

    public override System.Threading.Tasks.Task? GetHandlerTask(
        Cosmogenesis.Core.DbDoc doc, 
        System.Threading.CancellationToken cancellationToken) => doc switch
        {{
    {string.Concat(databasePlan.PartitionPlansByName.Values.SelectMany(x => x.Documents.Select(d => CallHandler(databasePlan, x, d))))}
            _ => throw new System.NotSupportedException($""Document of type {{doc?.GetType().Name}} was unexpected"")
        }};
}}
";

        outputModel.Context.AddSource($"feed_{databasePlan.BatchHandlersClassName}.cs", s);
    }
Ejemplo n.º 15
0
    static string Read(DatabasePlan databasePlan, UnionPlan unionPlan) => $@"
    /// <summary>
    /// Try to load a {unionPlan.CommonName} by id.
    /// id should be transformed using Cosmogenesis.Core.DbDocHelper.GetValidId.
    /// {unionPlan.CommonName} is a union of: {string.Join(", ", unionPlan.Documents.Select(x => x.ClassName))}
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    protected virtual async System.Threading.Tasks.Task<{unionPlan.FullCommonTypeName}?> {unionPlan.CommonName}Async(string id) =>
        ({unionPlan.FullCommonTypeName}?)await this.{databasePlan.DbClassName}.ReadByIdAsync(
            partitionKey: this.PartitionKey,
            id: id);

    /// <summary>
    /// Try to load a {unionPlan.CommonName} by id.
    /// Returns the {unionPlan.CommonName} or null if not found.
    /// {unionPlan.CommonName} is a union of: {string.Join(", ", unionPlan.Documents.Select(x => x.ClassName))}
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    public virtual async System.Threading.Tasks.Task<{unionPlan.FullCommonTypeName}?> {unionPlan.CommonName}Async({unionPlan.GetIdPlan.AsInputParameters()}) =>
        ({unionPlan.FullCommonTypeName}?)await this.{databasePlan.DbClassName}.ReadByIdAsync(
            partitionKey: this.PartitionKey,
            id: Cosmogenesis.Core.DbDocHelper.GetValidId({unionPlan.GetIdPlan.FullMethodName}({unionPlan.GetIdPlan.AsInputParameterMapping()})));
";
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan, PartitionPlan partitionPlan)
    {
        var s = $@"
namespace {databasePlan.Namespace};

public class {partitionPlan.QueryBuilderUnionsClassName} : Cosmogenesis.Core.DbQueryBuilderBase
{{
    /// <summary>Mocking constructor</summary>
    protected {partitionPlan.QueryBuilderUnionsClassName}() {{ }}

    internal protected {partitionPlan.QueryBuilderUnionsClassName}(
        {databasePlan.Namespace}.{databasePlan.DbClassName} {databasePlan.DbClassNameArgument},
        Microsoft.Azure.Cosmos.PartitionKey? partitionKey)
        : base(
            dbBase: {databasePlan.DbClassNameArgument},
            partitionKey: partitionKey)
    {{
    }}

{string.Concat(partitionPlan.Unions.Select(BuildQuery))}
}}
";

        outputModel.Context.AddSource($"partition_{partitionPlan.QueryBuilderUnionsClassName}.cs", s);
    }
Ejemplo n.º 17
0
    static string Read(DatabasePlan databasePlan, DocumentPlan documentPlan) => $@"
    /// <summary>
    /// Try to load a {documentPlan.ClassName} by id.
    /// Returns the {documentPlan.ClassName} or null if not found.
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    protected virtual System.Threading.Tasks.Task<{documentPlan.FullTypeName}?> {documentPlan.ClassName}ByIdAsync(string id) => 
        this.{databasePlan.DbClassName}.ReadByIdAsync<{documentPlan.FullTypeName}>(
            partitionKey: this.PartitionKey, 
            id: id, 
            type: {documentPlan.ConstDocType});

    /// <summary>
    /// Try to load a {documentPlan.ClassName} using an id generated by the parameters.
    /// Returns the {documentPlan.ClassName} or null if not found.
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    public virtual System.Threading.Tasks.Task<{documentPlan.FullTypeName}?> {documentPlan.ClassName}Async({documentPlan.GetIdPlan.AsInputParameters()}) => 
        this.{databasePlan.DbClassName}.ReadByIdAsync<{documentPlan.FullTypeName}>(
            partitionKey: this.PartitionKey, 
            id: Cosmogenesis.Core.DbDocHelper.GetValidId({documentPlan.GetIdPlan.FullMethodName}({documentPlan.GetIdPlan.AsInputParameterMapping()})), 
            type: {documentPlan.ConstDocType});
";
Ejemplo n.º 18
0
    static string Unions(DatabasePlan databasePlan, PartitionPlan partitionPlan) =>
    partitionPlan.Unions.Count == 0 ? "" : $@"
    {databasePlan.Namespace}.{partitionPlan.ReadOrThrowUnionsClassName}? unions;
    public virtual {databasePlan.Namespace}.{partitionPlan.ReadOrThrowUnionsClassName} Unions => this.unions ??= new(
        {databasePlan.DbClassNameArgument}: this.{databasePlan.DbClassName},
        partitionKey: this.PartitionKey);
";
Ejemplo n.º 19
0
    static string CreateOrReplace(DatabasePlan databasePlan, PartitionPlan partitionPlan) =>
    !partitionPlan.Documents.Any(x => x.IsTransient || x.IsMutable)
        ? ""
        : $@"
        {partitionPlan.CreateOrReplaceClassName}? createOrReplace;
    /// <summary>
    /// Methods to create or replace (unconditionally overwrite) documents.
    /// </summary>
    public virtual {databasePlan.Namespace}.{partitionPlan.CreateOrReplaceClassName} CreateOrReplace => this.createOrReplace ??= new(this);
";
Ejemplo n.º 20
0
    static string ReadMany(DatabasePlan databasePlan, PartitionPlan partitionPlan) =>
    !partitionPlan.Documents.Any(x => x.GetIdPlan.Arguments.Count > 0)
        ? ""
        : $@"
        {partitionPlan.ReadManyClassName}? readMany;
    /// <summary>
    /// Methods to read multiple documents at once, though not necessarily in a single operation.
    /// </summary>
    public virtual {databasePlan.Namespace}.{partitionPlan.ReadManyClassName} ReadMany => this.readMany ??= new(
        {databasePlan.DbClassNameArgument}: {databasePlan.DbClassName}, 
        partitionKey: this.PartitionKey);
";
Ejemplo n.º 21
0
    static string Replace(DatabasePlan databasePlan, PartitionPlan partitionPlan, DocumentPlan documentPlan) =>
    !documentPlan.IsMutable
        ? ""
        : $@"
    /// <summary>
    /// Queue a {documentPlan.ClassName} for replacement in the batch
    /// </summary>
    public virtual {databasePlan.Namespace}.{partitionPlan.BatchClassName} Replace({documentPlan.FullTypeName} {documentPlan.ClassNameArgument})
    {{    
        this.ReplaceCore(item: {documentPlan.ClassNameArgument}, type: {documentPlan.ConstDocType});
        return this;
    }}
";
Ejemplo n.º 22
0
    static string Delete(DatabasePlan databasePlan, PartitionPlan partitionPlan, DocumentPlan documentPlan) =>
    !documentPlan.IsTransient
        ? ""
        : $@"
    /// <summary>
    /// Queue a {documentPlan.ClassName} for deletion in the batch
    /// </summary>
    public virtual {databasePlan.Namespace}.{partitionPlan.BatchClassName} Delete({documentPlan.FullTypeName} {documentPlan.ClassNameArgument})
    {{
        this.DeleteCore(item: {documentPlan.ClassNameArgument});
        return this;
    }}
";
Ejemplo n.º 23
0
    public static void Write(OutputModel outputModel, DatabasePlan databasePlan)
    {
        var s = $@"
namespace {databasePlan.Namespace};

public static class {databasePlan.TypesClassName}
{{
{string.Concat(databasePlan.PartitionPlansByName.Values.Select(PartitionTypes))}
}}
";

        outputModel.Context.AddSource($"db_{databasePlan.TypesClassName}.cs", s);
    }
Ejemplo n.º 24
0
    static string Read(DatabasePlan databasePlan, DocumentPlan documentPlan) => $@"
    /// <summary>
    /// Try to load a {documentPlan.ClassName} by pk & id.
    /// id should be transformed using DbDocHelper.GetValidId.
    /// Returns the {documentPlan.ClassName} or null if not found.
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    public virtual System.Threading.Tasks.Task<{documentPlan.FullTypeName}?> {documentPlan.ClassName}ByIdAsync(string partitionKey, string id) => 
        this.{databasePlan.DbClassName}.ReadByIdAsync<{documentPlan.FullTypeName}>(
            partitionKey: new Microsoft.Azure.Cosmos.PartitionKey(partitionKey), 
            id: id, 
            type: {documentPlan.ConstDocType});
";
Ejemplo n.º 25
0
    static string ReadById(DatabasePlan databasePlan, DocumentPlan documentPlan) =>
    documentPlan.GetIdPlan.Arguments.Count == 0
        ? ""
        : $@"
    /// <summary>
    /// Try to load {documentPlan.ClassName} documents by id.
    /// id should be transformed using Cosmogenesis.Core.DbDocHelper.GetValidId.
    /// Returns an array of {documentPlan.ClassName} documents (or null if not found) in the same order as the ids were provided.
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    protected virtual System.Threading.Tasks.Task<{documentPlan.FullTypeName}?[]> {documentPlan.ClassName.Pluralize()}ByIdAsync(System.Collections.Generic.IEnumerable<string> ids) => 
        this.{databasePlan.DbClassName}.ReadByIdsAsync<{documentPlan.FullTypeName}>(
            partitionKey: this.PartitionKey, 
            ids: ids, 
            type: {documentPlan.ConstDocType});
";
Ejemplo n.º 26
0
    static string Create(DatabasePlan databasePlan, PartitionPlan partitionPlan, DocumentPlan documentPlan) => $@"
    /// <summary>
    /// Queue a {documentPlan.ClassName} for creation in the batch
    /// </summary>
    protected virtual {databasePlan.Namespace}.{partitionPlan.BatchClassName} Create({documentPlan.FullTypeName} {documentPlan.ClassNameArgument})
    {{
        {DocumentModelWriter.CreateAndCheckPkAndId(partitionPlan, documentPlan, documentPlan.ClassNameArgument)}
        this.CreateCore(item: {documentPlan.ClassNameArgument}, type: {documentPlan.ConstDocType});
        return this;
    }}

    /// <summary>
    /// Queue a {documentPlan.ClassName} for creation in the batch
    /// </summary>
    public virtual {databasePlan.Namespace}.{partitionPlan.BatchClassName} Create{documentPlan.ClassName}({documentPlan.PropertiesByName.Values.Where(x => !partitionPlan.GetPkPlan.ArgumentByPropertyName.ContainsKey(x.PropertyName)).AsInputParameters()}) =>
        this.Create({documentPlan.ClassNameArgument}: new {documentPlan.FullTypeName} {{ {partitionPlan.AsSettersFromDocumentPlanAndPartitionClass(documentPlan)} }});
";
Ejemplo n.º 27
0
    static string ReadOrThrow(DatabasePlan databasePlan, DocumentPlan documentPlan) => $@"
    /// <summary>
    /// Try to load a {documentPlan.ClassName} by id.
    /// id should be transformed using Cosmogenesis.Core.DbDocHelper.GetValidId.
    /// Returns the {documentPlan.ClassName} or throws DbConflictException if not found.
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbConflictException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    protected virtual async System.Threading.Tasks.Task<{documentPlan.FullTypeName}> {documentPlan.ClassName}ByIdAsync(string id)
    {{
        var result = await this.{databasePlan.DbClassName}.ReadByIdAsync<{documentPlan.FullTypeName}>(
            partitionKey: this.PartitionKey, 
            id: id, 
            type: {documentPlan.ConstDocType}).ConfigureAwait(false);
        if (result is null)
        {{
            throw Cosmogenesis.Core.DbModelFactory.CreateDbConflictException(dbConflictType: Cosmogenesis.Core.DbConflictType.Missing);
        }}
        return result;
    }}

    /// <summary>
    /// Try to load a {documentPlan.ClassName} using an id generated by the parameters.
    /// Returns the {documentPlan.ClassName} or throws DbConflictException if not found.
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbConflictException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    public virtual async System.Threading.Tasks.Task<{documentPlan.FullTypeName}> {documentPlan.ClassName}Async({documentPlan.GetIdPlan.AsInputParameters()})
    {{
        var result = await this.{databasePlan.DbClassName}.ReadByIdAsync<{documentPlan.FullTypeName}>(
            partitionKey: this.PartitionKey, 
            id: Cosmogenesis.Core.DbDocHelper.GetValidId({documentPlan.GetIdPlan.FullMethodName}({documentPlan.GetIdPlan.AsInputParameterMapping()})), 
            type: {documentPlan.ConstDocType}).ConfigureAwait(false);
        if (result is null)
        {{
            throw Cosmogenesis.Core.DbModelFactory.CreateDbConflictException(dbConflictType: Cosmogenesis.Core.DbConflictType.Missing);
        }}
        return result;
    }}
";
Ejemplo n.º 28
0
    static string ReadOrThrow(DatabasePlan databasePlan, UnionPlan unionPlan) => $@"
    /// <summary>
    /// Try to load a {unionPlan.CommonName} by id.
    /// id should be transformed using Cosmogenesis.Core.DbDocHelper.GetValidId.
    /// Returns the {unionPlan.CommonName} or throws DbConflictException if not found.
    /// {unionPlan.CommonName} is a union of: {string.Join(", ", unionPlan.Documents.Select(x => x.ClassName))}
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbConflictException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    protected virtual async System.Threading.Tasks.Task<{unionPlan.FullCommonTypeName}> {unionPlan.CommonName}Async(string id)
    {{
        var result = ({unionPlan.FullCommonTypeName}?)await this.{databasePlan.DbClassName}.ReadByIdAsync(
            partitionKey: this.PartitionKey,
            id: id);
        if (result is null)
        {{
            throw Cosmogenesis.Core.DbModelFactory.CreateDbConflictException(dbConflictType: Cosmogenesis.Core.DbConflictType.Missing);
        }}
        return result;
    }}

    /// <summary>
    /// Try to load a {unionPlan.CommonName} by id.
    /// Returns the {unionPlan.CommonName} or throws DbConflictException if not found.
    /// {unionPlan.CommonName} is a union of: {string.Join(", ", unionPlan.Documents.Select(x => x.ClassName))}
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbConflictException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    public virtual async System.Threading.Tasks.Task<{unionPlan.FullCommonTypeName}> {unionPlan.CommonName}Async({unionPlan.GetIdPlan.AsInputParameters()})
    {{
        var result = ({unionPlan.FullCommonTypeName}?)await this.{databasePlan.DbClassName}.ReadByIdAsync(
            partitionKey: this.PartitionKey,
            id: Cosmogenesis.Core.DbDocHelper.GetValidId({unionPlan.GetIdPlan.FullMethodName}({unionPlan.GetIdPlan.AsInputParameterMapping()})));
        if (result is null)
        {{
            throw Cosmogenesis.Core.DbModelFactory.CreateDbConflictException(dbConflictType: Cosmogenesis.Core.DbConflictType.Missing);
        }}
        return result;
    }}
";
Ejemplo n.º 29
0
    static string ReadById(DatabasePlan databasePlan, UnionPlan unionPlan) => $@"
    /// <summary>
    /// Try to load {unionPlan.CommonName} documents by id.
    /// id should be transformed using Cosmogenesis.Core.DbDocHelper.GetValidId.
    /// Returns an array of {unionPlan.CommonName} documents (or null if not found) in the same order as the ids were provided.
    /// {unionPlan.CommonName} is a union of: {string.Join(", ", unionPlan.Documents.Select(x => x.ClassName))}
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    protected virtual async System.Threading.Tasks.Task<{unionPlan.FullCommonTypeName}?[]> {unionPlan.CommonName.Pluralize()}ByIdAsync(System.Collections.Generic.IEnumerable<string> ids)
    {{
        var docs = await this.{databasePlan.DbClassName}.ReadByIdsAsync(
            partitionKey: this.PartitionKey, 
            ids: ids);
        var results = new {unionPlan.FullCommonTypeName}?[docs.Length];
        for (var x = 0; x < docs.Length; ++x)
        {{
            results[x] = ({unionPlan.FullCommonTypeName}?)docs[x];
        }}
        return results;
    }}
";
Ejemplo n.º 30
0
    static string Read(DatabasePlan databasePlan, UnionPlan unionPlan)
    {
        var singleType      = unionPlan.GetIdPlan.Arguments[0].FullTypeName;
        var singleTypeParam = unionPlan.GetIdPlan.Arguments[0].ArgumentName.Pluralize();

        var inputParams =
            unionPlan.GetIdPlan.Arguments.Count == 1
            ? $"System.Collections.Generic.IEnumerable<{singleType}> {singleTypeParam}"
            : $"System.Collections.Generic.IEnumerable<({unionPlan.GetIdPlan.AsInputParameters()})> ids";
        var toId =
            unionPlan.GetIdPlan.Arguments.Count == 1
            ? $"{singleTypeParam}.Select({unionPlan.GetIdPlan.FullMethodName}).Select(Cosmogenesis.Core.DbDocHelper.GetValidId)"
            : $"ids.Select(x => {unionPlan.GetIdPlan.FullMethodName}({unionPlan.GetIdPlan.ParametersToParametersMapping("x")})).Select(Cosmogenesis.Core.DbDocHelper.GetValidId)";

        return($@"
    /// <summary>
    /// Try to load {unionPlan.CommonName} documents by id.
    /// Returns an array of {unionPlan.CommonName} documents (or null if not found) in the same order as the ids were provided.
    /// {unionPlan.CommonName} is a union of: {string.Join(", ", unionPlan.Documents.Select(x => x.ClassName))}
    /// </summary>
    /// <exception cref=""Cosmogenesis.Core.DbOverloadedException"" />
    /// <exception cref=""Cosmogenesis.Core.DbUnknownStatusCodeException"" />
    public virtual async System.Threading.Tasks.Task<{unionPlan.FullCommonTypeName}?[]> {unionPlan.CommonName.Pluralize()}Async({inputParams})
    {{
        var docs = await this.{databasePlan.DbClassName}.ReadByIdsAsync(
            partitionKey: this.PartitionKey, 
            ids: {toId});
        var results = new {unionPlan.FullCommonTypeName}?[docs.Length];
        for (var x = 0; x < docs.Length; ++x)
        {{
            results[x] = ({unionPlan.FullCommonTypeName}?)docs[x];
        }}
        return results;
    }}
");
    }