Esempio n. 1
0
        private static async Task Step13TempTables(ISqDatabase database)
        {
            var tmp = new TempTable();

            var tableUser    = new TableUser();
            var tableCompany = new TableCompany();

            await database.Statement(tmp.Script.Create());

            //Users
            await InsertInto(tmp, tmp.Name)
            .From(Select(tableUser.FirstName + " " + tableUser.LastName)
                  .From(tableUser))
            .Exec(database);

            //Companies
            await InsertInto(tmp, tmp.Name)
            .From(Select(tableCompany.CompanyName)
                  .From(tableCompany))
            .Exec(database);

            await Select(tmp.Columns)
            .From(tmp)
            .OrderBy(tmp.Name)
            .Query(database,
                   r => Console.WriteLine($"Id: {tmp.Id.Read(r)}, Name: {tmp.Name.Read(r)}"));

            //Dropping the temp table is optional
            //It will be automatically removed when
            //the connection is closed
            await database.Statement(tmp.Script.Drop());
        }
Esempio n. 2
0
        private static async Task Step12Merge(ISqDatabase database)
        {
            var data = new[]
            {
                new { FirstName = "Francois", LastName = "Sturman2" },
                new { FirstName = "Allina", LastName = "Freeborne2" },
                new { FirstName = "Maye", LastName = "Malloy" },
            };

            var action   = CustomColumnFactory.String("Actions");
            var inserted = CustomColumnFactory.NullableInt32("Inserted");
            var deleted  = CustomColumnFactory.NullableInt32("Deleted");

            var tableUser = new TableUser();

            await MergeDataInto(tableUser, data)
            .MapDataKeys(s => s
                         .Set(s.Target.FirstName, s.Source.FirstName))
            .MapData(s => s
                     .Set(s.Target.LastName, s.Source.LastName))
            .WhenMatchedThenUpdate()
            .AlsoSet(s => s
                     .Set(s.Target.Version, s.Target.Version + 1)
                     .Set(s.Target.ModifiedAt, GetUtcDate()))
            .WhenNotMatchedByTargetThenInsert()
            .AlsoInsert(s => s
                        .Set(s.Target.Version, 1)
                        .Set(s.Target.ModifiedAt, GetUtcDate()))
            .Output((t, s, m) => m.Inserted(t.UserId.As(inserted)).Deleted(t.UserId.As(deleted)).Action(action))
            .Done()
            .Query(database,
                   r => Console.WriteLine(
                       $"UserId Inserted: {inserted.Read(r)},UserId Deleted: {deleted.Read(r)} , Action: {action.Read(r)}"));
        }
Esempio n. 3
0
        private static async Task Step7CreatingCustomers(ISqDatabase database)
        {
            var tUser        = new TableUser();
            var tCompany     = new TableCompany();
            var tCustomer    = new TableCustomer();
            var tSubCustomer = new TableCustomer();

            //Users
            await InsertInto(tCustomer, tCustomer.UserId)
            .From(
                Select(tUser.UserId)
                .From(tUser)
                .Where(!Exists(
                           SelectOne()
                           .From(tSubCustomer)
                           .Where(tSubCustomer.UserId == tUser.UserId))))
            .Exec(database);

            //Companies
            await InsertInto(tCustomer, tCustomer.CompanyId)
            .From(
                Select(tCompany.CompanyId)
                .From(tCompany)
                .Where(!Exists(
                           SelectOne()
                           .From(tSubCustomer)
                           .Where(tSubCustomer.CompanyId == tCompany.CompanyId))))
            .Exec(database);
        }
Esempio n. 4
0
        private static async Task Step18ExportToJson(ISqDatabase database)
        {
            var tableUser = new TableUser(Alias.Empty);

            var selectExpr = Select(tableUser.FirstName, tableUser.LastName)
                             .From(tableUser)
                             .Where(tableUser.LastName == "Sturman")
                             .Done();

            //Exporting
            var memoryStream = new MemoryStream();
            var jsonWriter   = new Utf8JsonWriter(memoryStream);

            selectExpr.SyntaxTree().ExportToJson(jsonWriter);

            string json = Encoding.UTF8.GetString(memoryStream.ToArray());

            Console.WriteLine(json);

            //Importing
            var restored = (ExprQuerySpecification)ExprDeserializer
                           .DeserializeFormJson(JsonDocument.Parse(json).RootElement);

            var result = await restored
                         .QueryList(database, r => (tableUser.FirstName.Read(r), tableUser.LastName.Read(r)));

            foreach (var name in result)
            {
                Console.WriteLine(name);
            }
        }
Esempio n. 5
0
        private static async Task Step19ExportToXml(ISqDatabase database)
        {
            var tableUser = new TableUser(Alias.Empty);

            var selectExpr = Select(tableUser.FirstName, tableUser.LastName)
                             .From(tableUser)
                             .Where(tableUser.LastName == "Sturman")
                             .Done();

            //Exporting
            var stringBuilder = new StringBuilder();

            using XmlWriter writer = XmlWriter.Create(stringBuilder);
            selectExpr.SyntaxTree().ExportToXml(writer);

            //Importing
            XmlDocument document = new XmlDocument();

            document.LoadXml(stringBuilder.ToString());
            var restored = (ExprQuerySpecification)ExprDeserializer
                           .DeserializeFormXml(document.DocumentElement !);

            var result = await restored
                         .QueryList(database, r => (tableUser.FirstName.Read(r), tableUser.LastName.Read(r)));

            foreach (var name in result)
            {
                Console.WriteLine(name);
            }
        }
Esempio n. 6
0
            static async Task ReadTableDataIntoJson(Utf8JsonWriter writer, ISqDatabase database, TableBase table)
            {
                writer.WriteStartArray(table.FullName.AsExprTableFullName().TableName.Name);

                writer.WriteStartArray();
                foreach (var column in table.Columns)
                {
                    writer.WriteStringValue(column.ColumnName.Name);
                }

                writer.WriteEndArray();

                await Select(table.Columns)
                .From(table)
                .Query(database,
                       r =>
                {
                    writer.WriteStartArray();
                    foreach (var column in table.Columns)
                    {
                        var readAsString = column.ReadAsString(r);
                        writer.WriteStringValue(readAsString);
                    }

                    writer.WriteEndArray();
                });

                writer.WriteEndArray();
            }
Esempio n. 7
0
 private static async Task Script(ISqDatabase database, bool isMsSql)
 {
     await Step1CreatingTables(database);
     await Step2InsertingData(database);
     await Step3SelectingData(database);
     await Step4UpdatingData(database);
     await Step5DeletingData(database);
     await Step6CreatingOrganizations(database);
     await Step7CreatingCustomers(database);
     await Step8JoinTables(database);
     await Step9SetOperations(database);
     await Step12Merge(database, output : isMsSql);
     await Step10UseDerivedTables(database);
     await Step11SubQueries(database);
     await Step11AnalyticAndWindowFunctions(database);
     await Step13TempTables(database);
     await Step14TreeExploring(database);
     await Step15SyntaxModification(database);
     await Step16Models(database);
     await Step17ModelsSelectBuilder(database);
     await Step18ExportToJson(database);
     await Step19ExportToXml(database);
     await Step20ExportToPlain(database);
     await Step21ExportDataToJson(database);
 }
Esempio n. 8
0
        private static async Task Step11AnalyticAndWindowFunctions(ISqDatabase database)
        {
            var cUserName = CustomColumnFactory.String("Name");
            var cNum      = CustomColumnFactory.Int64("Num");
            var cFirst    = CustomColumnFactory.String("First");
            var cLast     = CustomColumnFactory.String("Last");

            var user = new TableUser();

            await Select(
                (user.FirstName + " " + user.LastName)
                .As(cUserName),
                RowNumber()
                /*.OverPartitionBy(some fields)*/
                .OverOrderBy(user.FirstName)
                .As(cNum),
                FirstValue(user.FirstName + " " + user.LastName)
                /*.OverPartitionBy(some fields)*/
                .OverOrderBy(user.FirstName)
                .FrameClauseEmpty()
                .As(cFirst),
                LastValue(user.FirstName + " " + user.LastName)
                /*.OverPartitionBy(some fields)*/
                .OverOrderBy(user.FirstName)
                .FrameClause(
                    FrameBorder.UnboundedPreceding,
                    FrameBorder.UnboundedFollowing)
                .As(cLast))
            .From(user)
            .Query(database,
                   r => Console.WriteLine(
                       $"Num: {cNum.Read(r)}, Name: {cUserName.Read(r)}, " +
                       $"First: {cFirst.Read(r)}, Last: {cLast.Read(r)}"));
        }
Esempio n. 9
0
        private static async Task Step15SyntaxModification(ISqDatabase database)
        {
            var tUser = new TableUser();

            Console.WriteLine("Original expression:");
            var expression = SelectTop(1, tUser.FirstName).From(tUser).Done();

            await expression.QueryScalar(database);

            expression = expression
                         .WithTop(null)
                         .WithSelectList(tUser.UserId, tUser.FirstName + " " + tUser.LastName)
                         .WithWhere(tUser.UserId == 7);

            Console.WriteLine("With changed selection list  and filter:");
            await expression.QueryScalar(database);

            var tCustomer = new TableCustomer();

            expression = expression
                         .WithInnerJoin(tCustomer, on: tCustomer.UserId == tUser.UserId);

            Console.WriteLine("With joined table");
            await expression.QueryScalar(database);
        }
Esempio n. 10
0
        private static async Task Step5DeletingData(ISqDatabase database)
        {
            var tUser = new TableUser();

            await Delete(tUser)
            .Where(tUser.FirstName.Like("May%"))
            .Output(tUser.UserId)
            .Query(database, record => Console.WriteLine("Removed user id: " + tUser.UserId.Read(record)));
        }
Esempio n. 11
0
 public static Task <Dictionary <TKey, TValue> > QueryDictionary <TKey, TValue>(
     this IExprQueryFinal query,
     ISqDatabase database,
     Func <ISqDataRecordReader, TKey> keyFactory,
     Func <ISqDataRecordReader, TValue> valueFactory,
     SqDatabaseExtensions.KeyDuplicationHandler <TKey, TValue>?keyDuplicationHandler = null,
     Func <TKey, TValue, bool>?predicate = null)
     where TKey : notnull
 => database.QueryDictionary(query.Done(), keyFactory, valueFactory, keyDuplicationHandler, predicate);
Esempio n. 12
0
 public static Task Query(this ISqDatabase database, IExprQuery query, Action <ISqDataRecordReader> handler)
 {
     return(database.Query <object?>(query,
                                     null,
                                     (acc, r) =>
     {
         handler(r);
         return acc;
     }));
 }
Esempio n. 13
0
 public static Task Query(this ISqDatabase database, IExprQuery query, Func <ISqDataRecordReader, Task> handler)
 {
     return(database.Query <object?>(query,
                                     null,
                                     async(acc, r) =>
     {
         await handler(r);
         return acc;
     }));
 }
Esempio n. 14
0
        private static async Task Step16Models(ISqDatabase database)
        {
            var tUser = new TableUser();

            var users = await Select(UserName.GetColumns(tUser))
                        .From(tUser)
                        .QueryList(database, r => UserName.Read(r, tUser));

            foreach (var userName in users)
            {
                Console.WriteLine($"{userName.Id} {userName.FirstName} {userName.LastName}");
            }
        }
Esempio n. 15
0
        private static async Task Step1CreatingTables(ISqDatabase database)
        {
            var tables = CreateTableList();

            foreach (var table in tables.Reverse())
            {
                await database.Statement(table.Script.DropIfExist());
            }

            foreach (var table in tables)
            {
                await database.Statement(table.Script.Create());
            }
        }
Esempio n. 16
0
        private static async Task Step6CreatingOrganizations(ISqDatabase database)
        {
            var tCompany = new TableCompany();

            Console.WriteLine("Companies:");
            await InsertDataInto(tCompany, new[] { "Microsoft", "Google" })
            .MapData(s => s.Set(s.Target.CompanyName, s.Source))
            .AlsoInsert(s => s
                        .Set(s.Target.Version, 1)
                        .Set(s.Target.ModifiedAt, GetUtcDate()))
            .Output(tCompany.CompanyId, tCompany.CompanyName)
            .Query(database,
                   r => Console.WriteLine($"Id: {tCompany.CompanyId.Read(r)}, Name: {tCompany.CompanyName.Read(r)}"));
        }
Esempio n. 17
0
        private static async Task Step9SetOperations(ISqDatabase database)
        {
            var select1 = Select(1);
            var select2 = Select(2);

            var result = await select1
                         .Union(select2)
                         .UnionAll(select2)
                         .Except(select2)
                         .Intersect(select1.Union(select2))
                         .QueryList(database, r => r.GetInt32(0));

            Console.WriteLine("Result Of Set Operators:");
            Console.WriteLine(result[0]);
        }
Esempio n. 18
0
        private static async Task Step10UseDerivedTables(ISqDatabase database)
        {
            var tCustomer = new DerivedTableCustomer("CUST");

            var customers = await Select(CustomerData.GetColumns(tCustomer))
                            .From(tCustomer)
                            .Where(tCustomer.Type == 2 | tCustomer.Name.Like("%Free%"))
                            .OrderBy(Desc(tCustomer.Name))
                            .OffsetFetch(1, 2)
                            .QueryList(database, r => CustomerData.Read(r, tCustomer));

            foreach (var customer in customers)
            {
                Console.WriteLine($"Id: {customer.Id}, Name: {customer.Name}, Type: {customer.CustomerType}");
            }
        }
Esempio n. 19
0
 public static Task <List <T> > QueryList <T>(this ISqDatabase database, IExprQuery expr, Func <ISqDataRecordReader, T> factory, Predicate <T>?predicateItem = null)
 {
     return(database.Query(expr,
                           new List <T>(),
                           (acc, record) =>
     {
         var item = factory(record);
         if (predicateItem != null)
         {
             if (!predicateItem(item))
             {
                 return acc;
             }
         }
         acc.Add(item);
         return acc;
     }));
 }
Esempio n. 20
0
            static async Task <string> ToJsonString(ISqDatabase database, TableBase[] tableBases)
            {
                using var ms = new MemoryStream();
                using Utf8JsonWriter writer = new Utf8JsonWriter(ms);

                writer.WriteStartObject();
                foreach (var table in tableBases)
                {
                    await ReadTableDataIntoJson(writer, database, table);
                }

                writer.WriteEndObject();
                writer.Flush();

                var s = Encoding.UTF8.GetString(ms.ToArray());

                return(s);
            }
Esempio n. 21
0
        private static async Task Step3SelectingData(ISqDatabase database)
        {
            var tUser = new TableUser();

            var selectResult = await Select(tUser.UserId, tUser.FirstName, tUser.LastName)
                               .From(tUser)
                               .OrderBy(tUser.FirstName, tUser.LastName)
                               .QueryList(database,
                                          r => (
                                              Id: tUser.UserId.Read(r),
                                              FirstName: tUser.FirstName.Read(r),
                                              LastName: tUser.LastName.Read(r)));

            foreach (var record in selectResult)
            {
                Console.WriteLine(record);
            }
        }
Esempio n. 22
0
        private static async Task Step14TreeExploring(ISqDatabase database)
        {
            //Var some external filter..
            ExprBoolean filter = CustomColumnFactory.Int16("Type") == 2 /*Company*/;

            var tableCustomer = new TableCustomer();

            var baseSelect = Select(tableCustomer.CustomerId)
                             .From(tableCustomer)
                             .Where(filter)
                             .Done();

            //Checking that filter has "Type" column
            var hasVirtualColumn = filter.SyntaxTree()
                                   .FirstOrDefault <ExprColumnName>(e => e.Name == "Type") !=
                                   null;

            if (hasVirtualColumn)
            {
                baseSelect = (ExprQuerySpecification)baseSelect.SyntaxTree()
                             .Modify(e =>
                {
                    var result = e;
                    //Joining with the sub query
                    if (e is TableCustomer table)
                    {
                        var derivedTable = new DerivedTableCustomer();

                        result = new ExprJoinedTable(
                            table,
                            ExprJoinedTable.ExprJoinType.Inner,
                            derivedTable,
                            table.CustomerId == derivedTable.CustomerId);
                    }

                    return(result);
                });
            }

            await baseSelect !
            .Query(database,
                   r => Console.WriteLine($"Id: {tableCustomer.CustomerId.Read(r)}"));
        }
Esempio n. 23
0
        private static async Task Step2InsertingData(ISqDatabase database)
        {
            var tUser = new TableUser();

            var data = new[]
            {
                new { FirstName = "Francois", LastName = "Sturman" },
                new { FirstName = "Allina", LastName = "Freeborne" },
                new { FirstName = "Maye", LastName = "Maloy" },
            };

            await InsertDataInto(tUser, data)
            .MapData(s => s
                     .Set(s.Target.FirstName, s.Source.FirstName)
                     .Set(s.Target.LastName, s.Source.LastName))
            .AlsoInsert(s => s
                        .Set(s.Target.Version, 1)
                        .Set(s.Target.ModifiedAt, GetUtcDate()))
            .Exec(database);
        }
Esempio n. 24
0
        private static async Task Step17ModelsSelectBuilder(ISqDatabase database)
        {
            var page = await SqModelSelectBuilder
                       .Select(ModelEmptyReader.Get <TableCustomer>())
                       .LeftJoin(UserName.GetReader(), on: t => t.Table.UserId == t.JoinedTable1.UserId)
                       .LeftJoin(CompanyName.GetReader(), on: t => t.Table.CompanyId == t.JoinedTable2.CompanyId)
                       .Find(0,
                             10,
                             filter: null,
                             order: t => Asc(IsNull(t.JoinedTable1.FirstName + t.JoinedTable1.LastName,
                                                    t.JoinedTable2.CompanyName)),
                             r => (r.JoinedModel1 != null ? r.JoinedModel1.FirstName + " " + r.JoinedModel1.LastName : null) ??
                             r.JoinedModel2?.Name ?? "Unknown")
                       .QueryPage(database);

            foreach (var name in page.Items)
            {
                Console.WriteLine(name);
            }
        }
Esempio n. 25
0
        private static async Task Step1CreatingTables(ISqDatabase database)
        {
            var tables = new TableBase[]
            {
                new TableUser(),
                new TableCompany(),
                new TableCustomer(),
                new TableFavoriteFilter(),
                new TableFavoriteFilterItem()
            };

            foreach (var table in tables.Reverse())
            {
                await database.Statement(table.Script.DropIfExist());
            }

            foreach (var table in tables)
            {
                await database.Statement(table.Script.Create());
            }
        }
Esempio n. 26
0
        public static Task <Dictionary <TKey, TValue> > QueryDictionary <TKey, TValue>(
            this ISqDatabase database,
            IExprQuery expr,
            Func <ISqDataRecordReader, TKey> keyFactory,
            Func <ISqDataRecordReader, TValue> valueFactory,
            KeyDuplicationHandler <TKey, TValue>?keyDuplicationHandler = null,
            Func <TKey, TValue, bool>?predicate = null)
            where TKey : notnull
        {
            return(database.Query(expr,
                                  new Dictionary <TKey, TValue>(),
                                  (acc, record) =>
            {
                var key = keyFactory(record);
                var value = valueFactory(record);

                if (predicate != null && !predicate(key, value))
                {
                    return acc;
                }

                if (keyDuplicationHandler == null)
                {
                    acc.Add(key, value);
                }
                else
                {
                    if (acc.TryGetValue(key, out var oldValue))
                    {
                        keyDuplicationHandler(key, oldValue, value, acc);
                    }
                    else
                    {
                        acc.Add(key, value);
                    }
                }
                return acc;
            }));
        }
Esempio n. 27
0
            static async Task InsertTableData(ISqDatabase database, TableBase table, JsonElement element)
            {
                var columnsDict = table.Columns.ToDictionary(i => i.ColumnName.Name, i => i);
                var colIndexes  = element.EnumerateArray().First().EnumerateArray().Select(c => c.GetString()).ToList();

                var rowsEnumerable = element
                                     .EnumerateArray()
                                     .Skip(1)
                                     .Select(e =>
                                             e.EnumerateArray()
                                             .Select((c, i) =>
                                                     columnsDict[colIndexes[i]]
                                                     .FromString(c.ValueKind == JsonValueKind.Null ? null : c.GetString()))
                                             .ToList());

                var insertExpr = IdentityInsertInto(table, table.Columns).Values(rowsEnumerable);

                if (!insertExpr.Insert.Source.IsEmpty)
                {
                    await insertExpr.Exec(database);
                }
            }
Esempio n. 28
0
        private static async Task Step21ExportDataToJson(ISqDatabase database)
        {
            var tables = CreateTableList();

            //To JSON
            var jsonString = await ToJsonString(database, tables);

            //Remove everything
            foreach (var table in tables.Reverse())
            {
                await Delete(table).All().Exec(database);
            }

            //From JSON
            await FromJsonString(sqDatabase : database, s : jsonString, tableBases : tables);

            //Again to JSON
            var jsonString2 = await ToJsonString(database, tables);

            if (jsonString != jsonString2)
            {
                throw new Exception("Export'n'Import was not correct");
            }
Esempio n. 29
0
        private static async Task Step8JoinTables(ISqDatabase database)
        {
            var tUser     = new TableUser();
            var tCompany  = new TableCompany();
            var tCustomer = new TableCustomer();

            var cType = CustomColumnFactory.Int16("Type");
            var cName = CustomColumnFactory.String("Name");

            var customers = await Select(
                tCustomer.CustomerId,
                Case()
                .When(IsNotNull(tUser.UserId))
                .Then(Cast(1, SqlType.Int16))
                .When(IsNotNull(tCompany.CompanyId))
                .Then(Cast(2, SqlType.Int16))
                .Else(Null)
                .As(cType),
                Case()
                .When(IsNotNull(tUser.UserId))
                .Then(tUser.FirstName + " " + tUser.LastName)
                .When(IsNotNull(tCompany.CompanyId))
                .Then(tCompany.CompanyName)
                .Else(Null)
                .As(cName)
                )
                            .From(tCustomer)
                            .LeftJoin(tUser, on: tUser.UserId == tCustomer.UserId)
                            .LeftJoin(tCompany, on: tCompany.CompanyId == tCustomer.CompanyId)
                            .QueryList(database,
                                       r => (Id: tCustomer.CustomerId.Read(r), CustomerType: cType.Read(r), Name: cName.Read(r)));

            foreach (var customer in customers)
            {
                Console.WriteLine($"Id: {customer.Id}, Name: {customer.Name}, Type: {customer.CustomerType}");
            }
        }
Esempio n. 30
0
            static async Task FromJsonString(ISqDatabase sqDatabase, string s, TableBase[] tableBases)
            {
                var document = JsonDocument.Parse(s);
                var pending  = new Dictionary <string, JsonElement>();

                using var enumerator = document.RootElement.EnumerateObject();
                if (!enumerator.MoveNext())
                {
                    throw new Exception("Enumerator is empty");
                }

                foreach (var table in tableBases)
                {
                    var         tableName = table.FullName.AsExprTableFullName().TableName.Name;
                    JsonElement element;

                    if (enumerator.Current.Name != tableName && pending.TryGetValue(tableName, out var e))
                    {
                        element = e;
                    }
                    else
                    {
                        while (enumerator.Current.Name != tableName)
                        {
                            pending.Add(enumerator.Current.Name, enumerator.Current.Value);
                            if (!enumerator.MoveNext())
                            {
                                throw new Exception("Enumerator is empty");
                            }
                        }

                        element = enumerator.Current.Value;
                    }

                    await InsertTableData(sqDatabase, table, element);
                }
            }