From a46782062d255dad762b24d879b47b50f352e0ad Mon Sep 17 00:00:00 2001 From: Ninja Date: Sat, 9 Nov 2024 15:26:32 +0000 Subject: [PATCH 01/64] - Checkpoint: Initial v2.0 changes --- .github/workflows/PullRequest-CI.yml | 26 +- GitVersion.yml | 2 +- LICENSE | 21 + README.md | 533 +++++++++++++++++- Schemio.sln | 44 +- src/{Schemio => Schemio.Core}/AssemblyInfo.cs | 3 +- .../BaseEntitySchema.cs | 2 +- src/{Schemio => Schemio.Core}/BaseQuery.cs | 19 +- .../BaseTransformer.cs | 2 +- .../CacheResultAttribute.cs | 2 +- .../ChildrenQueries.cs | 2 +- src/Schemio.Core/CollectionResult.cs | 9 + src/{Schemio => Schemio.Core}/CreateSchema.cs | 2 +- src/{Schemio => Schemio.Core}/DataContext.cs | 2 +- .../Helpers/ArrayUtil.cs | 2 +- .../Helpers/EnumerableExtentions.cs | 2 +- .../Helpers/StringExtensions.cs | 2 +- .../Helpers/Xml/XDocumentExts.cs | 2 +- .../Helpers/Xml/XmlHelper.cs | 2 +- .../Helpers/Xml/XmlSanitizer.cs | 2 +- src/{Schemio => Schemio.Core}/IDataContext.cs | 2 +- .../IDataProvider.cs | 2 +- src/{Schemio => Schemio.Core}/IEntity.cs | 2 +- src/Schemio.Core/IEntityBuilder.cs | 7 + .../IEntityContext.cs | 2 +- .../IEntityContextCache.cs | 2 +- .../IEntityContextValidator.cs | 2 +- .../IEntitySchema.cs | 4 +- src/Schemio.Core/IEntitySchema1.cs | 6 + .../IPolymorphicResult.cs | 2 +- src/Schemio.Core/IQuery.cs | 21 + .../IQueryBuilder.cs | 2 +- src/{Schemio => Schemio.Core}/IQueryEngine.cs | 8 +- .../IQueryExecutor.cs | 2 +- src/{Schemio => Schemio.Core}/IQueryList.cs | 2 +- .../IQueryParameter.cs | 2 +- src/{Schemio => Schemio.Core}/IQueryResult.cs | 2 +- .../ISchemaPathMatcher.cs | 2 +- src/{Schemio => Schemio.Core}/ITransformer.cs | 2 +- .../ITransformerContext.cs | 2 +- .../ITransformerQueryResult.cs | 2 +- .../Impl/DataProvider.cs | 30 +- .../Impl/EntityBuilder.cs} | 8 +- .../Impl/EventPublisher.cs} | 6 +- .../Impl/EventSubscriber.cs | 10 +- .../Impl/QueryBuilder.cs | 17 +- .../Impl/QueryExecutor.cs | 23 +- src/Schemio.Core/Motley - Backup.Core.csproj | 46 ++ .../PathMatchers/JPathMatcher.cs | 4 +- .../PathMatchers/XPathMatcher.cs | 2 +- .../QueryComparer.cs | 2 +- src/{Schemio => Schemio.Core}/QueryList.cs | 2 +- .../Schemio.Core.csproj | 7 +- src/Schemio.Core/ServicesExtensions.cs | 37 ++ .../XML/XMLDataProvider.cs | 4 +- .../{BaseSQLChildQuery.cs => BaseSQLQuery.cs} | 7 +- .../BaseSQLRootQuery.cs | 17 - src/Schemio.EntityFramework/ISQLQuery.cs | 3 +- src/Schemio.EntityFramework/QueryEngine.cs | 18 +- .../Schemio.EntityFramework.csproj | 8 +- src/Schemio.SQL/BaseSQLChildQuery.cs | 9 - src/Schemio.SQL/BaseSQLQuery.cs | 9 +- src/Schemio.SQL/BaseSQLRootQuery.cs | 9 - src/Schemio.SQL/ISQLQuery.cs | 3 +- .../Motley - Backup (1).SQL.csproj | 55 ++ .../Motley - Backup (10).SQL.csproj | 55 ++ .../Motley - Backup (100).SQL.csproj | 55 ++ .../Motley - Backup (101).SQL.csproj | 55 ++ .../Motley - Backup (102).SQL.csproj | 55 ++ .../Motley - Backup (103).SQL.csproj | 55 ++ .../Motley - Backup (104).SQL.csproj | 55 ++ .../Motley - Backup (105).SQL.csproj | 55 ++ .../Motley - Backup (106).SQL.csproj | 55 ++ .../Motley - Backup (107).SQL.csproj | 55 ++ .../Motley - Backup (108).SQL.csproj | 55 ++ .../Motley - Backup (109).SQL.csproj | 55 ++ .../Motley - Backup (11).SQL.csproj | 55 ++ .../Motley - Backup (110).SQL.csproj | 55 ++ .../Motley - Backup (111).SQL.csproj | 55 ++ .../Motley - Backup (112).SQL.csproj | 55 ++ .../Motley - Backup (113).SQL.csproj | 55 ++ .../Motley - Backup (114).SQL.csproj | 55 ++ .../Motley - Backup (115).SQL.csproj | 55 ++ .../Motley - Backup (116).SQL.csproj | 55 ++ .../Motley - Backup (117).SQL.csproj | 55 ++ .../Motley - Backup (118).SQL.csproj | 55 ++ .../Motley - Backup (119).SQL.csproj | 55 ++ .../Motley - Backup (12).SQL.csproj | 55 ++ .../Motley - Backup (120).SQL.csproj | 55 ++ .../Motley - Backup (121).SQL.csproj | 55 ++ .../Motley - Backup (122).SQL.csproj | 55 ++ .../Motley - Backup (123).SQL.csproj | 55 ++ .../Motley - Backup (124).SQL.csproj | 55 ++ .../Motley - Backup (125).SQL.csproj | 55 ++ .../Motley - Backup (126).SQL.csproj | 55 ++ .../Motley - Backup (127).SQL.csproj | 55 ++ .../Motley - Backup (128).SQL.csproj | 55 ++ .../Motley - Backup (129).SQL.csproj | 55 ++ .../Motley - Backup (13).SQL.csproj | 55 ++ .../Motley - Backup (130).SQL.csproj | 55 ++ .../Motley - Backup (131).SQL.csproj | 55 ++ .../Motley - Backup (132).SQL.csproj | 55 ++ .../Motley - Backup (133).SQL.csproj | 55 ++ .../Motley - Backup (134).SQL.csproj | 55 ++ .../Motley - Backup (135).SQL.csproj | 55 ++ .../Motley - Backup (136).SQL.csproj | 55 ++ .../Motley - Backup (137).SQL.csproj | 55 ++ .../Motley - Backup (138).SQL.csproj | 55 ++ .../Motley - Backup (139).SQL.csproj | 55 ++ .../Motley - Backup (14).SQL.csproj | 55 ++ .../Motley - Backup (140).SQL.csproj | 55 ++ .../Motley - Backup (141).SQL.csproj | 55 ++ .../Motley - Backup (142).SQL.csproj | 55 ++ .../Motley - Backup (143).SQL.csproj | 55 ++ .../Motley - Backup (144).SQL.csproj | 55 ++ .../Motley - Backup (145).SQL.csproj | 55 ++ .../Motley - Backup (146).SQL.csproj | 55 ++ .../Motley - Backup (147).SQL.csproj | 55 ++ .../Motley - Backup (148).SQL.csproj | 55 ++ .../Motley - Backup (149).SQL.csproj | 55 ++ .../Motley - Backup (15).SQL.csproj | 55 ++ .../Motley - Backup (150).SQL.csproj | 55 ++ .../Motley - Backup (151).SQL.csproj | 55 ++ .../Motley - Backup (152).SQL.csproj | 55 ++ .../Motley - Backup (153).SQL.csproj | 55 ++ .../Motley - Backup (154).SQL.csproj | 55 ++ .../Motley - Backup (155).SQL.csproj | 55 ++ .../Motley - Backup (156).SQL.csproj | 55 ++ .../Motley - Backup (157).SQL.csproj | 55 ++ .../Motley - Backup (158).SQL.csproj | 55 ++ .../Motley - Backup (159).SQL.csproj | 55 ++ .../Motley - Backup (16).SQL.csproj | 55 ++ .../Motley - Backup (160).SQL.csproj | 55 ++ .../Motley - Backup (161).SQL.csproj | 55 ++ .../Motley - Backup (162).SQL.csproj | 55 ++ .../Motley - Backup (163).SQL.csproj | 55 ++ .../Motley - Backup (164).SQL.csproj | 55 ++ .../Motley - Backup (165).SQL.csproj | 55 ++ .../Motley - Backup (166).SQL.csproj | 55 ++ .../Motley - Backup (167).SQL.csproj | 55 ++ .../Motley - Backup (168).SQL.csproj | 55 ++ .../Motley - Backup (169).SQL.csproj | 55 ++ .../Motley - Backup (17).SQL.csproj | 55 ++ .../Motley - Backup (170).SQL.csproj | 55 ++ .../Motley - Backup (171).SQL.csproj | 55 ++ .../Motley - Backup (172).SQL.csproj | 55 ++ .../Motley - Backup (173).SQL.csproj | 55 ++ .../Motley - Backup (174).SQL.csproj | 55 ++ .../Motley - Backup (175).SQL.csproj | 55 ++ .../Motley - Backup (176).SQL.csproj | 55 ++ .../Motley - Backup (177).SQL.csproj | 55 ++ .../Motley - Backup (178).SQL.csproj | 55 ++ .../Motley - Backup (179).SQL.csproj | 55 ++ .../Motley - Backup (18).SQL.csproj | 55 ++ .../Motley - Backup (180).SQL.csproj | 55 ++ .../Motley - Backup (181).SQL.csproj | 55 ++ .../Motley - Backup (182).SQL.csproj | 55 ++ .../Motley - Backup (183).SQL.csproj | 55 ++ .../Motley - Backup (184).SQL.csproj | 55 ++ .../Motley - Backup (185).SQL.csproj | 55 ++ .../Motley - Backup (186).SQL.csproj | 55 ++ .../Motley - Backup (187).SQL.csproj | 55 ++ .../Motley - Backup (188).SQL.csproj | 55 ++ .../Motley - Backup (189).SQL.csproj | 55 ++ .../Motley - Backup (19).SQL.csproj | 55 ++ .../Motley - Backup (190).SQL.csproj | 55 ++ .../Motley - Backup (191).SQL.csproj | 55 ++ .../Motley - Backup (192).SQL.csproj | 55 ++ .../Motley - Backup (193).SQL.csproj | 55 ++ .../Motley - Backup (194).SQL.csproj | 55 ++ .../Motley - Backup (195).SQL.csproj | 55 ++ .../Motley - Backup (196).SQL.csproj | 55 ++ .../Motley - Backup (197).SQL.csproj | 55 ++ .../Motley - Backup (198).SQL.csproj | 55 ++ .../Motley - Backup (199).SQL.csproj | 55 ++ .../Motley - Backup (2).SQL.csproj | 55 ++ .../Motley - Backup (20).SQL.csproj | 55 ++ .../Motley - Backup (200).SQL.csproj | 55 ++ .../Motley - Backup (201).SQL.csproj | 55 ++ .../Motley - Backup (202).SQL.csproj | 55 ++ .../Motley - Backup (203).SQL.csproj | 55 ++ .../Motley - Backup (204).SQL.csproj | 55 ++ .../Motley - Backup (205).SQL.csproj | 55 ++ .../Motley - Backup (206).SQL.csproj | 55 ++ .../Motley - Backup (207).SQL.csproj | 55 ++ .../Motley - Backup (208).SQL.csproj | 55 ++ .../Motley - Backup (209).SQL.csproj | 55 ++ .../Motley - Backup (21).SQL.csproj | 55 ++ .../Motley - Backup (210).SQL.csproj | 55 ++ .../Motley - Backup (211).SQL.csproj | 55 ++ .../Motley - Backup (212).SQL.csproj | 55 ++ .../Motley - Backup (213).SQL.csproj | 55 ++ .../Motley - Backup (214).SQL.csproj | 55 ++ .../Motley - Backup (215).SQL.csproj | 55 ++ .../Motley - Backup (216).SQL.csproj | 55 ++ .../Motley - Backup (217).SQL.csproj | 55 ++ .../Motley - Backup (218).SQL.csproj | 55 ++ .../Motley - Backup (219).SQL.csproj | 55 ++ .../Motley - Backup (22).SQL.csproj | 55 ++ .../Motley - Backup (220).SQL.csproj | 55 ++ .../Motley - Backup (221).SQL.csproj | 55 ++ .../Motley - Backup (222).SQL.csproj | 54 ++ .../Motley - Backup (23).SQL.csproj | 55 ++ .../Motley - Backup (24).SQL.csproj | 55 ++ .../Motley - Backup (25).SQL.csproj | 55 ++ .../Motley - Backup (26).SQL.csproj | 55 ++ .../Motley - Backup (27).SQL.csproj | 55 ++ .../Motley - Backup (28).SQL.csproj | 55 ++ .../Motley - Backup (29).SQL.csproj | 55 ++ .../Motley - Backup (3).SQL.csproj | 55 ++ .../Motley - Backup (30).SQL.csproj | 55 ++ .../Motley - Backup (31).SQL.csproj | 55 ++ .../Motley - Backup (32).SQL.csproj | 55 ++ .../Motley - Backup (33).SQL.csproj | 55 ++ .../Motley - Backup (34).SQL.csproj | 55 ++ .../Motley - Backup (35).SQL.csproj | 55 ++ .../Motley - Backup (36).SQL.csproj | 55 ++ .../Motley - Backup (37).SQL.csproj | 55 ++ .../Motley - Backup (38).SQL.csproj | 55 ++ .../Motley - Backup (39).SQL.csproj | 55 ++ .../Motley - Backup (4).SQL.csproj | 55 ++ .../Motley - Backup (40).SQL.csproj | 55 ++ .../Motley - Backup (41).SQL.csproj | 55 ++ .../Motley - Backup (42).SQL.csproj | 55 ++ .../Motley - Backup (43).SQL.csproj | 55 ++ .../Motley - Backup (44).SQL.csproj | 55 ++ .../Motley - Backup (45).SQL.csproj | 55 ++ .../Motley - Backup (46).SQL.csproj | 55 ++ .../Motley - Backup (47).SQL.csproj | 55 ++ .../Motley - Backup (48).SQL.csproj | 55 ++ .../Motley - Backup (49).SQL.csproj | 55 ++ .../Motley - Backup (5).SQL.csproj | 55 ++ .../Motley - Backup (50).SQL.csproj | 55 ++ .../Motley - Backup (51).SQL.csproj | 55 ++ .../Motley - Backup (52).SQL.csproj | 55 ++ .../Motley - Backup (53).SQL.csproj | 55 ++ .../Motley - Backup (54).SQL.csproj | 55 ++ .../Motley - Backup (55).SQL.csproj | 55 ++ .../Motley - Backup (56).SQL.csproj | 55 ++ .../Motley - Backup (57).SQL.csproj | 55 ++ .../Motley - Backup (58).SQL.csproj | 55 ++ .../Motley - Backup (59).SQL.csproj | 55 ++ .../Motley - Backup (6).SQL.csproj | 55 ++ .../Motley - Backup (60).SQL.csproj | 55 ++ .../Motley - Backup (61).SQL.csproj | 55 ++ .../Motley - Backup (62).SQL.csproj | 55 ++ .../Motley - Backup (63).SQL.csproj | 55 ++ .../Motley - Backup (64).SQL.csproj | 55 ++ .../Motley - Backup (65).SQL.csproj | 55 ++ .../Motley - Backup (66).SQL.csproj | 55 ++ .../Motley - Backup (67).SQL.csproj | 55 ++ .../Motley - Backup (68).SQL.csproj | 55 ++ .../Motley - Backup (69).SQL.csproj | 55 ++ .../Motley - Backup (7).SQL.csproj | 55 ++ .../Motley - Backup (70).SQL.csproj | 55 ++ .../Motley - Backup (71).SQL.csproj | 55 ++ .../Motley - Backup (72).SQL.csproj | 55 ++ .../Motley - Backup (73).SQL.csproj | 55 ++ .../Motley - Backup (74).SQL.csproj | 55 ++ .../Motley - Backup (75).SQL.csproj | 55 ++ .../Motley - Backup (76).SQL.csproj | 55 ++ .../Motley - Backup (77).SQL.csproj | 55 ++ .../Motley - Backup (78).SQL.csproj | 55 ++ .../Motley - Backup (79).SQL.csproj | 55 ++ .../Motley - Backup (8).SQL.csproj | 55 ++ .../Motley - Backup (80).SQL.csproj | 55 ++ .../Motley - Backup (81).SQL.csproj | 55 ++ .../Motley - Backup (82).SQL.csproj | 55 ++ .../Motley - Backup (83).SQL.csproj | 55 ++ .../Motley - Backup (84).SQL.csproj | 55 ++ .../Motley - Backup (85).SQL.csproj | 55 ++ .../Motley - Backup (86).SQL.csproj | 55 ++ .../Motley - Backup (87).SQL.csproj | 55 ++ .../Motley - Backup (88).SQL.csproj | 55 ++ .../Motley - Backup (89).SQL.csproj | 55 ++ .../Motley - Backup (9).SQL.csproj | 55 ++ .../Motley - Backup (90).SQL.csproj | 55 ++ .../Motley - Backup (91).SQL.csproj | 55 ++ .../Motley - Backup (92).SQL.csproj | 55 ++ .../Motley - Backup (93).SQL.csproj | 55 ++ .../Motley - Backup (94).SQL.csproj | 55 ++ .../Motley - Backup (95).SQL.csproj | 55 ++ .../Motley - Backup (96).SQL.csproj | 55 ++ .../Motley - Backup (97).SQL.csproj | 55 ++ .../Motley - Backup (98).SQL.csproj | 55 ++ .../Motley - Backup (99).SQL.csproj | 55 ++ src/Schemio.SQL/Motley - Backup.SQL.csproj | 55 ++ src/Schemio.SQL/QueryEngine.cs | 30 +- src/Schemio.SQL/Schemio.SQL.csproj | 8 +- src/Schemio/BaseChildQuery.cs | 19 - src/Schemio/BaseRootQuery.cs | 18 - src/Schemio/CollectionResult.cs | 15 - src/Schemio/IChildQuery.cs | 15 - src/Schemio/IQuery.cs | 14 - src/Schemio/IRootQuery.cs | 10 - src/Schemio/ITransformExecutor.cs | 7 - src/Schemio/ServicesExtensions.cs | 126 ----- .../DataProvider.Tests/DataProviderTests.cs | 16 +- .../DataProvider.Tests/EntityBuilderTests.cs} | 17 +- .../DataProvider.Tests/QueryBuilderTests.cs | 16 +- .../DataProvider.Tests/QueryExecutorTests.cs | 22 +- .../EntitySetup/CustomerContext.cs | 2 +- .../EntitySetup/Entities/Address.cs | 2 +- .../EntitySetup/Entities/Communication.cs | 2 +- .../EntitySetup/Entities/Customer.cs | 2 +- .../EntitySetup/Entities/EntityDiagram.cd | 0 .../EntitySetup/Entities/Order.cs | 2 +- .../EntitySetup/Entities/OrderItem.cs | 2 +- .../EntitySchemas/CustomerSchema.cs | 8 +- .../Queries/CommunicationResult.cs | 2 +- .../Queries/CustomerCommunicationQuery.cs | 6 +- .../Queries/CustomerOrderItemsQuery.cs | 6 +- .../Queries/CustomerOrdersQuery.cs | 10 + .../EntitySetup/Queries/CustomerParameter.cs | 2 +- .../EntitySetup/Queries/CustomerQuery.cs | 6 +- .../EntitySetup/Queries/CustomerResult.cs | 2 +- .../Queries/OrderCollectionResult.cs | 2 +- .../Queries/OrderItemCollectionResult.cs | 2 +- .../EntitySetup/Queries/OrderItemParameter.cs | 2 +- .../CustomerCommunicationTransform.cs | 6 +- .../Transforms/CustomerOrderItemsTransform.cs | 10 +- .../Transforms/CustomerOrdersTransform.cs | 10 +- .../Transforms/CustomerTransform.cs | 6 +- .../Schemio.Core.Tests.csproj} | 4 +- .../UnitTest1.cs | 2 +- .../Usings.cs | 0 .../Schemio.EntityFramework.Tests/BaseTest.cs | 9 +- .../Schemio.EntityFramework.Tests/Customer.db | Bin 32768 -> 32768 bytes .../CustomerDbContext.cs | 3 +- .../E2E.Tests.cs | 4 +- .../EntitySetup/CustomerContext.cs | 2 + .../EntitySetup/Entities/Customer.cs | 2 + .../EntitySchemas/CustomerSchema.cs | 1 + .../Queries/CommunicationResult.cs | 2 + .../Queries/CustomerCommunicationQuery.cs | 14 +- .../Queries/CustomerOrderItemsQuery.cs | 21 +- .../Queries/CustomerOrderResult.cs | 2 + .../Queries/CustomerOrdersQuery.cs | 12 +- .../Queries/CustomerParameter.cs | 4 +- .../EntitySchemas/Queries/CustomerQuery.cs | 14 +- .../EntitySchemas/Queries/CustomerResult.cs | 2 + .../Queries/OrderItemParameter.cs | 3 +- .../EntitySchemas/Queries/OrderItemResult.cs | 2 + .../CustomerCommunicationTransform.cs | 1 + .../Transforms/CustomerOrderItemsTransform.cs | 3 +- .../Transforms/CustomerOrdersTransform.cs | 3 +- .../Transforms/CustomerTransform.cs | 1 + tests/Schemio.SQL.Tests/BaseTest.cs | 8 +- tests/Schemio.SQL.Tests/Customer.db | Bin 32768 -> 32768 bytes tests/Schemio.SQL.Tests/E2E.Tests.cs | 7 +- .../EntitySetup/CustomerContext.cs | 2 + .../EntitySetup/Entities/Customer.cs | 2 + .../EntitySchemas/CustomerSchema.cs | 7 +- .../Queries/CommunicationResult.cs | 2 + .../Queries/CustomerCommunicationQuery.cs | 9 +- .../Queries/CustomerOrderItemsQuery.cs | 15 +- .../Queries/CustomerOrdersQuery.cs | 11 +- .../Queries/CustomerParameter.cs | 4 +- .../EntitySchemas/Queries/CustomerQuery.cs | 9 +- .../EntitySchemas/Queries/CustomerResult.cs | 2 + .../Queries/OrderItemParameter.cs | 3 +- .../EntitySchemas/Queries/OrderItemResult.cs | 2 + .../EntitySchemas/Queries/OrderResult.cs | 2 + ...Transform.cs => CommunicationTransform.cs} | 3 +- .../Transforms/CustomerOrderItemsTransform.cs | 27 - .../Transforms/CustomerOrdersTransform.cs | 26 - .../Transforms/CustomerTransform.cs | 1 + .../Transforms/OrderItemsTransform.cs | 31 + .../Transforms/OrdersTransform.cs | 30 + .../Queries/CustomerOrdersQuery.cs | 10 - 370 files changed, 13397 insertions(+), 656 deletions(-) create mode 100644 LICENSE rename src/{Schemio => Schemio.Core}/AssemblyInfo.cs (88%) rename src/{Schemio => Schemio.Core}/BaseEntitySchema.cs (96%) rename src/{Schemio => Schemio.Core}/BaseQuery.cs (58%) rename src/{Schemio => Schemio.Core}/BaseTransformer.cs (98%) rename src/{Schemio => Schemio.Core}/CacheResultAttribute.cs (72%) rename src/{Schemio => Schemio.Core}/ChildrenQueries.cs (87%) create mode 100644 src/Schemio.Core/CollectionResult.cs rename src/{Schemio => Schemio.Core}/CreateSchema.cs (99%) rename src/{Schemio => Schemio.Core}/DataContext.cs (93%) rename src/{Schemio => Schemio.Core}/Helpers/ArrayUtil.cs (95%) rename src/{Schemio => Schemio.Core}/Helpers/EnumerableExtentions.cs (96%) rename src/{Schemio => Schemio.Core}/Helpers/StringExtensions.cs (83%) rename src/{Schemio => Schemio.Core}/Helpers/Xml/XDocumentExts.cs (96%) rename src/{Schemio => Schemio.Core}/Helpers/Xml/XmlHelper.cs (94%) rename src/{Schemio => Schemio.Core}/Helpers/Xml/XmlSanitizer.cs (96%) rename src/{Schemio => Schemio.Core}/IDataContext.cs (82%) rename src/{Schemio => Schemio.Core}/IDataProvider.cs (85%) rename src/{Schemio => Schemio.Core}/IEntity.cs (89%) create mode 100644 src/Schemio.Core/IEntityBuilder.cs rename src/{Schemio => Schemio.Core}/IEntityContext.cs (89%) rename src/{Schemio => Schemio.Core}/IEntityContextCache.cs (91%) rename src/{Schemio => Schemio.Core}/IEntityContextValidator.cs (83%) rename src/{Schemio => Schemio.Core}/IEntitySchema.cs (75%) create mode 100644 src/Schemio.Core/IEntitySchema1.cs rename src/{Schemio => Schemio.Core}/IPolymorphicResult.cs (75%) create mode 100644 src/Schemio.Core/IQuery.cs rename src/{Schemio => Schemio.Core}/IQueryBuilder.cs (81%) rename src/{Schemio => Schemio.Core}/IQueryEngine.cs (66%) rename src/{Schemio => Schemio.Core}/IQueryExecutor.cs (84%) rename src/{Schemio => Schemio.Core}/IQueryList.cs (94%) rename src/{Schemio => Schemio.Core}/IQueryParameter.cs (69%) rename src/{Schemio => Schemio.Core}/IQueryResult.cs (68%) rename src/{Schemio => Schemio.Core}/ISchemaPathMatcher.cs (82%) rename src/{Schemio => Schemio.Core}/ITransformer.cs (95%) rename src/{Schemio => Schemio.Core}/ITransformerContext.cs (93%) rename src/{Schemio => Schemio.Core}/ITransformerQueryResult.cs (92%) rename src/{Schemio => Schemio.Core}/Impl/DataProvider.cs (71%) rename src/{Schemio/Impl/TransformExecutor.cs => Schemio.Core/Impl/EntityBuilder.cs} (87%) rename src/{Schemio/Impl/EventAggregator.cs => Schemio.Core/Impl/EventPublisher.cs} (82%) rename src/{Schemio => Schemio.Core}/Impl/EventSubscriber.cs (88%) rename src/{Schemio => Schemio.Core}/Impl/QueryBuilder.cs (82%) rename src/{Schemio => Schemio.Core}/Impl/QueryExecutor.cs (78%) create mode 100644 src/Schemio.Core/Motley - Backup.Core.csproj rename src/{Schemio => Schemio.Core}/PathMatchers/JPathMatcher.cs (84%) rename src/{Schemio => Schemio.Core}/PathMatchers/XPathMatcher.cs (95%) rename src/{Schemio => Schemio.Core}/QueryComparer.cs (92%) rename src/{Schemio => Schemio.Core}/QueryList.cs (98%) rename src/{Schemio => Schemio.Core}/Schemio.Core.csproj (90%) create mode 100644 src/Schemio.Core/ServicesExtensions.cs rename src/{Schemio => Schemio.Core}/XML/XMLDataProvider.cs (97%) rename src/Schemio.EntityFramework/{BaseSQLChildQuery.cs => BaseSQLQuery.cs} (65%) delete mode 100644 src/Schemio.EntityFramework/BaseSQLRootQuery.cs delete mode 100644 src/Schemio.SQL/BaseSQLChildQuery.cs delete mode 100644 src/Schemio.SQL/BaseSQLRootQuery.cs create mode 100644 src/Schemio.SQL/Motley - Backup (1).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (10).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (100).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (101).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (102).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (103).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (104).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (105).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (106).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (107).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (108).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (109).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (11).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (110).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (111).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (112).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (113).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (114).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (115).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (116).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (117).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (118).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (119).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (12).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (120).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (121).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (122).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (123).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (124).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (125).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (126).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (127).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (128).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (129).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (13).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (130).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (131).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (132).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (133).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (134).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (135).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (136).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (137).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (138).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (139).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (14).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (140).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (141).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (142).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (143).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (144).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (145).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (146).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (147).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (148).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (149).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (15).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (150).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (151).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (152).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (153).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (154).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (155).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (156).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (157).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (158).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (159).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (16).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (160).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (161).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (162).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (163).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (164).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (165).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (166).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (167).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (168).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (169).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (17).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (170).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (171).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (172).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (173).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (174).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (175).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (176).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (177).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (178).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (179).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (18).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (180).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (181).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (182).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (183).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (184).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (185).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (186).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (187).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (188).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (189).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (19).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (190).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (191).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (192).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (193).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (194).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (195).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (196).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (197).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (198).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (199).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (2).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (20).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (200).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (201).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (202).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (203).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (204).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (205).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (206).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (207).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (208).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (209).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (21).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (210).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (211).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (212).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (213).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (214).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (215).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (216).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (217).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (218).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (219).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (22).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (220).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (221).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (222).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (23).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (24).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (25).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (26).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (27).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (28).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (29).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (3).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (30).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (31).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (32).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (33).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (34).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (35).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (36).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (37).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (38).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (39).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (4).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (40).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (41).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (42).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (43).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (44).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (45).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (46).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (47).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (48).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (49).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (5).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (50).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (51).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (52).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (53).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (54).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (55).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (56).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (57).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (58).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (59).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (6).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (60).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (61).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (62).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (63).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (64).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (65).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (66).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (67).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (68).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (69).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (7).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (70).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (71).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (72).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (73).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (74).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (75).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (76).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (77).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (78).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (79).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (8).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (80).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (81).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (82).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (83).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (84).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (85).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (86).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (87).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (88).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (89).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (9).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (90).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (91).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (92).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (93).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (94).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (95).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (96).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (97).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (98).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (99).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup.SQL.csproj delete mode 100644 src/Schemio/BaseChildQuery.cs delete mode 100644 src/Schemio/BaseRootQuery.cs delete mode 100644 src/Schemio/CollectionResult.cs delete mode 100644 src/Schemio/IChildQuery.cs delete mode 100644 src/Schemio/IQuery.cs delete mode 100644 src/Schemio/IRootQuery.cs delete mode 100644 src/Schemio/ITransformExecutor.cs delete mode 100644 src/Schemio/ServicesExtensions.cs rename tests/{Schemio.Tests => Schemio.Core.Tests}/DataProvider.Tests/DataProviderTests.cs (68%) rename tests/{Schemio.Tests/DataProvider.Tests/TransformExecutorTests.cs => Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs} (88%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/DataProvider.Tests/QueryBuilderTests.cs (95%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/DataProvider.Tests/QueryExecutorTests.cs (70%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/CustomerContext.cs (79%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/Address.cs (85%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/Communication.cs (81%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/Customer.cs (84%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/EntityDiagram.cd (100%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/Order.cs (80%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/OrderItem.cs (76%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/EntitySchemas/CustomerSchema.cs (81%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CommunicationResult.cs (89%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CustomerCommunicationQuery.cs (51%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CustomerOrderItemsQuery.cs (54%) create mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CustomerParameter.cs (68%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CustomerQuery.cs (54%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CustomerResult.cs (80%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/OrderCollectionResult.cs (87%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/OrderItemCollectionResult.cs (85%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/OrderItemParameter.cs (69%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Transforms/CustomerCommunicationTransform.cs (85%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Transforms/CustomerOrderItemsTransform.cs (69%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Transforms/CustomerOrdersTransform.cs (64%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Transforms/CustomerTransform.cs (73%) rename tests/{Schemio.Tests/Schemio.Tests.csproj => Schemio.Core.Tests/Schemio.Core.Tests.csproj} (89%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/UnitTest1.cs (86%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/Usings.cs (100%) rename tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/{CustomerCommunicationTransform.cs => CommunicationTransform.cs} (89%) delete mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs delete mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs create mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs create mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs delete mode 100644 tests/Schemio.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs diff --git a/.github/workflows/PullRequest-CI.yml b/.github/workflows/PullRequest-CI.yml index cd8dfb2..6d47951 100644 --- a/.github/workflows/PullRequest-CI.yml +++ b/.github/workflows/PullRequest-CI.yml @@ -10,7 +10,7 @@ jobs: Run-Lint: runs-on: ubuntu-latest env: - github-token: '${{ secrets.GITHUB_TOKEN }}' + github-token: '${{ secrets.GH_Packages }}' steps: - name: Step-01 Checkout code uses: actions/checkout@v3 @@ -30,7 +30,7 @@ jobs: beta_Version: ${{ steps.gitversion.outputs.nuGetVersion }} branchName: ${{ steps.gitversion.outputs.branchName }} env: - working-directory: /home/runner/work/Schemio/Schemio + working-directory: /home/runner/work/Motley/Motley steps: - name: Step-01 Install GitVersion @@ -85,9 +85,9 @@ jobs: outputs: semVersion: ${{ needs.Build-Release.outputs.semVersion }} env: - github-token: '${{ secrets.GITHUB_TOKEN }}' + github-token: '${{ secrets.GH_Packages }}' nuget-token: '${{ secrets.NUGET_API_KEY }}' - working-directory: /home/runner/work/Schemio/Schemio + working-directory: /home/runner/work/Motley/Motley steps: - name: Step-01 Retrieve Build Artifacts uses: actions/download-artifact@v3 @@ -100,16 +100,16 @@ jobs: - name: Step-03 Publish to Github Packages run: find -name "*.nupkg" -print -exec gpr push -k ${{env.github-token}} {} \; - - - name: Step-03 Release to Nuget Org - if: ${{ startsWith(github.head_ref, 'release/')}} - run: dotnet nuget push ${{env.working-directory}}/src/Schemio/bin/Release/*.nupkg --skip-duplicate --api-key ${{ env.nuget-token }} --source https://api.nuget.org/v3/index.json Release: name: Release to Nuget needs: [Package] if: ${{ startsWith(github.head_ref, 'release/')}} runs-on: ubuntu-latest + env: + github-token: '${{ secrets.GH_Packages }}' + nuget-token: '${{ secrets.NUGET_API_KEY }}' + working-directory: /home/runner/work/Motley/Motley steps: - uses: actions/checkout@v2 @@ -119,15 +119,15 @@ jobs: # dotnet-version: '6.0.x' # Publish - - name: publish Schemio package + - name: publish Motley package id: publish_nuget uses: Rebel028/publish-nuget@v2.8.0 with: # Filepath of the project to be packaged, relative to root of repository - PROJECT_FILE_PATH: Schemio/Schemio.csproj + PROJECT_FILE_PATH: Motley/Motley.csproj # NuGet package id, used for version detection & defaults to project name - PACKAGE_NAME: Schemio + PACKAGE_NAME: Motley # Filepath with version info, relative to root of repository & defaults to PROJECT_FILE_PATH # VERSION_FILE_PATH: Directory.Build.props @@ -145,10 +145,10 @@ jobs: # TAG_FORMAT: v* # API key to authenticate with NuGet server, or a token, issued for GITHUB_USER if you use GPR - # NUGET_KEY: ${{secrets.NUGET_API_KEY}} + NUGET_KEY: ${{secrets.NUGET_API_KEY}} # NuGet server uri hosting the packages, defaults to https://api.nuget.org - # NUGET_SOURCE: https://api.nuget.org + NUGET_SOURCE: https://api.nuget.org/v3/index.json # Flag to toggle pushing symbols along with nuget package to the server, disabled by default # INCLUDE_SYMBOLS: false diff --git a/GitVersion.yml b/GitVersion.yml index 89b0a62..280505f 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -1,4 +1,4 @@ -next-version: 1.0.0 +next-version: 2.0.0 tag-prefix: '[vV]' mode: ContinuousDeployment branches: diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..daf3b65 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Code Shayk + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index f4af87b..449adf7 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ # ninja Schemio v1.0 -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/CodeShayk/Schemio/blob/master/LICENSE.md) +[![NuGet version](https://badge.fury.io/nu/Schemio.Core.svg)](https://badge.fury.io/nu/Schemio.Core) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/CodeShayk/Schemio/blob/master/LICENSE.md) [![Master-Build](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml) [![GitHub Release](https://img.shields.io/github/v/release/CodeShayk/Schemio?logo=github&sort=semver)](https://github.com/CodeShayk/Schemio/releases/latest) [![Master-CodeQL](https://github.com/CodeShayk/Schemio/actions/workflows/Master-CodeQL.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Master-CodeQL.yml) [![.Net 8.0](https://img.shields.io/badge/.Net-8.0-blue)](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) -- - #### Nuget Packages -| Latest | Details | -| -------- | --------| -| ![NuGet Version](https://img.shields.io/nuget/v/Schemio.Core?style=for-the-badge&label=Schemio.Core&labelColor=green) | Provides `core` functionality to configure nested queries and transformers. With ability to map schema paths (XPath/JSONPath) to entity's object graph. `No QueryEngine` provided and requires implementing IQueryEngine to execute IQuery instances. | -| ![NuGet Version](https://img.shields.io/nuget/v/Schemio.SQL?style=for-the-badge&label=Schemio.SQL&labelColor=green) | Provides schemio with query engine using Dapper to execute SQL queries. | -|![NuGet Version](https://img.shields.io/nuget/v/Schemio.EntityFramework?style=for-the-badge&label=Schemio.EntityFramework&labelColor=green) | Provides schemio with `Entity Framework` query engine to execute queries using DbContext. | +> #### Nuget Packages +>i. `Schemio.Core` - Provides `core` functionality to configure nested queries and transformers. With ability to map schema paths (XPath/JSONPath) to entity's object graph. `No QueryEngine` provided and requires implementing IQueryEngine to execute IQuery instances. +> +>ii. `Schemio.SQL` - Provides schemio with query engine using `Dapper` to execute SQL queries. +> +>iii. `Schemio.EntityFramework` - Provides schemio with `Entity Framework` query engine to execute queries using DbContext. ## Concept ### What is Schemio? @@ -26,40 +26,519 @@ Few example schemio use cases that require the service tier to dynamically fetch > - Content Management Systems > - Many more -## Getting Started? -### i. Installation -Install the nuget package as appropriate for Core, SQL using Dapper or EntityFramework. +## How to use Schemio? +To use schemio you need to +> Step 1 - Setup the entity to be fetched. +> +> Step 2 - Construct the `DataProvider` with required dependencies. -`Scemio.Core` - for installing schemio for `bespoke` implementation of query engine. +### Step 1. Entity Setup +Setting up an entity includes the following. +* Define the `entity` to be fetched using `DataProvider` - which is basically a class with entire object graph (with nested typed properties). +* Define the `entity schema` which is schema path mapping of the entire entity object graph. Each mapping consists of a `query` and `transformer` pair mapped to a sections of object graph (using XPaths or JsonPath for schema paths) + +#### 1.1 Entity +To mark the class as Entity, implement the class from `IEntity` interface. +Bear in mind this is the root entity to be fetched. + +>Below is an example `Customer` entity. +> +> ``` +> public class Customer : IEntity +> { +> public int CustomerId { get; set; } +> public string CustomerCode { get; set; } +> public string CustomerName { get; set; } +> public Communication Communication { get; set; } +> public Order[] Orders { get; set; } +> } +> ``` + +For the customer class, we can see there are three levels of nesting in the object graph. +- Level 1 with paths: `Customer` +- Level 2 with paths: `Customer.Communication` and `Customer.Orders` +- Level 3 with paths: `Customer.Orders.Items` + +If we choose XML Schema Definition (XSD) for the object schema of the above Customer class fo mapping with XPATHs +then below is the Customer XSD and XPaths for different nesting levels. + +> Customer XSD is +> ``` +> Coming soon... +> ``` + +> Schema mappings using XPaths are +> ``` +> - Level 1 with XPath: Customer +> - Level 2 with XPaths: Customer/Communication and Customer/Orders +> - Level 3 with XPath: Customer/Orders/Order/Items/Item + +#### 1.2 Entity Schema Definition +Define entity schema definition for the entity in context. + +* `Entity schema definition` is basically a configuration with hierarchy of `query/transformer` pairs mapped to the schema paths pointing to different levels of the entity's object graph. +* `Query` is an implementation to fetch data for a certain section of object graph from an underlying data storage. +* `Transformer` is an implementation to map the data fetched by the linked query to the relevant sections of the entity's object graph. + +To define Entity schema, implement `BaseEntitySchema` interface where T is entity in context. + +> +Example Entity Schema Definition (using XPaths) +> The `Customer` entity with `three` levels of `nesting` is configured below in `CustomerSchema` definition to show `query/transformer` pairs nested accordingly mapping to object graph using the XPath definitions. +> +> ``` +> internal class CustomerSchema : BaseEntitySchema +> { +> public override IEnumerable> GetSchema() +> { +> return CreateSchema.For() +> .Map(For.Paths("customer"), +> customer => customer.Dependents +> .Map(For.Paths("customer/communication")) +> .Map(For.Paths("customer/orders"), +> customerOrders => customerOrders.Dependents +> .Map(For.Paths("customer/orders/order/items"))) +> ).Create(); +> } +> } +>``` + +##### i. Query/Transformer Mapping +Every `Query` type in the `EntitySchema` definition should have a complementing `Transformer` type. +You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. + +>Below is the snippet from `CustomerSchema` definition. +>``` +> .Map(For.Paths("customer", "customer/code", "customer/name")) +>``` + +##### ii. Nested Query/Transformer Mappings +* You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query paramter. +* The query/transformer mappings can be `nested` to `5` levels down. +* When certain `schema paths` are included in the DataProvider `request` to fetch the Entity, the relevant query and transformer pairs get executed in the order of their nesting to hydrate the entity. + +>Example nesting of Communication query under Customer query. +>``` +> .Map(For.Paths("customer"), -- Parent +> customer => customer.Dependents +> .Map(For.Paths("customer/communication")) -- Child +>``` + + +Please see the execution sequence below for queries and transformers nested in CustomerSchema implemented above. + +image + + +`Please Note:` If you need to support custom schema language for mapping the object graph, then see extending schemio section below. + + +#### 1.2.1 Query Class +The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. + +QueryEngine is an implementation of `IQueryEngine` to execute queries against a supported data storage to return a collection of query results (ie. of type IQueryResult). + +As explained above, You can configure a query in `Parent` or `Child` (nested) mode in nested hierarchies. + +i. Parent Query + +To define a `parent` or `root` query which is usually configured at level 1 to query the root entity, derive from `BaseQuery` +* `TQueryParameter` is basically the class that holds the `inputs` required by the root query for execution. It is an implementation of `IQueryParameter` type. +* `TQueryResult` is the result that will be returned from executing the root query. It is an implementation of `IQueryResult` type. + +The query parameter needs to be resolved before executing the query with QueryEngine. + +In `parent` mode, the query parameter is resolved using the `IDataContext` parameter passed to data provider class. + + +> See example `CustomerQuery` implemented to be configured and run in parent mode below. +> ``` +>internal class CustomerQuery : BaseQuery +> { +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Executes as Parent or Level 1 query. +> // The query parameter is resolved using IDataContext parameter of data provider class. Parent query result will be null. +> +> var customer = (CustomerContext)context; +> QueryParameter = new CustomerParameter +> { +> CustomerId = customer.CustomerId +> }; +> } +> } +>``` + +ii. Child Query + +To define a `child` or `dependant` query which is usually configured as child at level below the root query to query, derive from `BaseQuery` +* `TQueryParameter` is basically the class that holds the `inputs` required by the child query for execution. It is an implementation of `IQueryParameter` type. +* `TQueryResult` is the result that will be returned by executing the child query. It is an implementation of `IQueryResult` type. + +Similar to Root query, the query parameter of child query needs to be resolved before executing with QueryEngine. + +In `child` mode, the query parameter is resolved using the `query result` of the `parent` query. You can have a maximum of `5` levels of query nestings. + +> See example `CustomerCommunicationQuery` implemented to be configured and run as child or nested query to customer query below. Please see `CustomerSchema` definition above for parent/child configuration setup. +>``` +> internal class CustomerCommunicationQuery : BaseQuery +> { +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Execute as child to customer query. +> // The result from parent customer query is used to resolve the query parameter of the nested communication query. +> +> var customer = (CustomerResult)parentQueryResult; +> QueryParameter = new CustomerParameter +> { +> CustomerId = customer.Id +> }; +> } +> } +>``` + +#### Query Engines + +`Please Note:` The above query implementation examples are with respect to parent/child configuration. The actual storage specific query definition should vary with specific implementation of the QueryEngine. +> Please see supported Query engine implementations below. +- `Schemio.SQL` - provides the implementation of IQueryEngine to execute SQL queries. Uses `Dapper` for SQL data acess. +- `Schemio.EntityFramework` - provides implementation of IQueryEngine to execute `Entity Framework` queries. + +`Query using Schemio.SQL` +The SQL query needs to implement `BaseSQLQuery`. +And, requires implementing `public abstract CommandDefinition GetCommandDefinition()` method to return `command definition` for query to be executed with `Dapper` supported QueryEngine. + +See below example `CustomerQuery` implemented as Root SQL query +>``` +> internal class CustomerQuery : BaseSQLQuery +> { +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Executes as root or level 1 query. parent QueryResult should be null. +> var customer = (CustomerContext)context.Entity; +> QueryParameter = new CustomerParameter +> { +> CustomerId = (int)customer.CustomerId +> }; +> } +> +> public override IEnumerable Execute(IDbConnection conn) +> { +> return conn.Query(new CommandDefinition +> ( +> "select CustomerId as Id, " + +> "Customer_Name as Name," + +> "Customer_Code as Code " + +> $"from TCustomer where customerId={QueryParameter.CustomerId}" +> )); +> } +> } +>``` +> +See below example `CustomerOrderItemsQuery` implemented as child SQL query. +>``` +>internal class CustomerOrderItemsQuery : BaseSQLQuery +> { +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Execute as child query to order query taking OrderResult to resolve query parameter. +> var ordersResult = (OrderResult)parentQueryResult; +> +> QueryParameter ??= new OrderItemParameter(); +> QueryParameter.OrderIds.Add(ordersResult.OrderId); +> } +> +> public override IEnumerable Execute(IDbConnection conn) +> { +> return conn.Query(new CommandDefinition +> ( +> "select OrderId, " + +> "OrderItemId as ItemId, " + +> "Name, " + +> "Cost " + +> $"from TOrderItem where OrderId in ({QueryParameter.ToCsv()})" +> )); +> } +> } +>``` + +`Query using Schemio.EntityFramework` +The SQL query needs to implement `BaseSQLQuery`. +And, requires implementing `public abstract IEnumerable Run(DbContext dbContext)` method to implement query using `DbContext` using entity framework. + +See below example `CustomerQuery` implemented as Root Entity framework query +>``` +> internal class CustomerQuery : BaseSQLQuery +> { +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Executes as root or level 1 query. parent QueryResult shuld be null. +> var customer = (CustomerContext)context.Entity; +> QueryParameter = new CustomerParameter +> { +> CustomerId = (int)customer.CustomerId +> }; +> } +> +> public override IEnumerable Run(DbContext dbContext) +> { +> return dbContext.Set() +> .Where(c => c.Id == QueryParameter.CustomerId) +> .Select(c => new CustomerResult +> { +> Id = c.Id, +> Name = c.Name, +> Code = c.Code +> }); +> } +> } +>``` +> +See below example `CustomerOrderItemsQuery` implemented as child Entity framework query. +>``` +>internal class CustomerOrderItemsQuery : BaseSQLQuery +> { +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Execute as child query to order query taking OrderResult to resolve query parameter. +> var ordersResult = (CustomerOrderResult)parentQueryResult; +> +> QueryParameter ??= new OrderItemParameter(); +> QueryParameter.OrderIds.Add(ordersResult.OrderId); +> } +> +> public override IEnumerable Run(DbContext dbContext) +> { +> return dbContext.Set() +> .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) +> .Select(c => new OrderItemResult +> { +> ItemId = c.ItemId, +> Name = c.Name, +> Cost = c.Cost, +> OrderId = c.Order.OrderId +> }); +> ; +> } +> } +>``` + + +#### 2.2 Tranformer Class +The purpose of the transformer class is to transform the data fetched by the linked query class and mapp to the configured object graph of the entity. + +To define a transformer class, you need to implement `BaseTransformer` +- where TEntity is Entity implementing `IEntity`. eg. Customer. +- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. + +Note: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. + +For the example query/transformer mapping +>``` +> .Map(For.Paths("customer")) +>``` + +The customer transformer maps data only to the `customer` xpath mapped object graph of customer class. +ie. - `customer/id`, `customer/customercode`, `customer/customername` + +In below transformer example, `CustomerTransformer` is implemented to transform entity `Customer` with `CustomerResult` query result obtained from `CustomerQuery` execution. + +> +>``` +>internal class CustomerTransform : BaseTransformer +> { +> public override Customer Transform(CustomerResult queryResult, Customer entity) +> { +> var customer = entity ?? new Customer(); +> customer.CustomerId = queryResult.Id; +> customer.CustomerName = queryResult.CustomerName; +> customer.CustomerCode = queryResult.CustomerCode; +> return customer; +> } +> } +>``` + +### DataProvider Setup +Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. + +- `ILogger>` - logger implementation. default no logger. +- `IEntitySchema` - mandatory entity schema definition for entity's object graph. +- `IQueryEngine` - implementation of query engine to execute queries (of type IQuery) with supported data storage. +- `ISchemaPathMatcher` - implementation of schema path matcher to use custom schema paths with entity schema definition. + +Example constructors: + +i. With `EntitySchema` and `QueryEngine` implementations. + +``` + public DataProvider(IEntitySchema entitySchema, params IQueryEngine[] queryEngines) +``` +ii. With `Logger`, `EntitySchema`, `QueryEngine`, and `SchemaPathmMatcher` for custom schema paths mapping in entity schema definition. +``` + public DataProvider(ILogger> logger, IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) + +``` +#### Schemio.SQL +Construct DataProvider using `Schemio.SQL.QueryEngine` query engine. + +``` +var provider = new DataProvider(new CustomerSchema(), new Schemio.SQL.QueryEngine(new SQLConfiguration())); +``` + +#### Schemio.EntityFramework +Construct DataProvider using `Schemio.EntityFramework.QueryEngine` query engine. + +``` +var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.QueryEngine()); +``` + +### Using IOC for registrations + +#### Registrations + +With ServiceCollection, you need to register the below dependencies. ``` -NuGet\Install-Package Schemio.Core -Version 1.0.0 + // Register core services + services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); + services.AddTransient(typeof(ITransformExecutor<>), typeof(TransformExecutor<>)); + services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); + services.AddTransient(); + + // Register instance of ISchemaPathMatcher - Json, XPath or Custom. + services.AddTransient(c => new XPathMatcher()); + + // Enable logging + services.AddLogging(); + + //For Dapper SQL engine. + services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { + Providername = "System.Data.SqlClient", + ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" + }}); + + // For entity framework engine. + services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); + services.AddTransient(c => new QueryEngine(c.GetService>()); + + + // Register schema definitions. eg CustomerSchema + services.AddTransient, CustomerSchema>(); ``` -`Schemio.SQL` - for installing schemio for SQL with `Dapper` engine. + +`Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. + +#### Data Provider (DI) +To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` + +## Extend Schemio +### Custom Query Engine +To provide custom query engine and query implementations, you need to extend the base interfaces as depicted below +- IQueryEngine interface to implement the custom query engine to be used with schemio. ``` -NuGet\Install-Package Schemio.SQL -Version 1.0.0 +public interface IQueryEngine + { + /// + /// Detrmines whether an instance of query can be executed with this engine. + /// + /// instance of IQuery. + /// Boolean; True when supported. + bool CanExecute(IQuery query); + + /// + /// Executes a list of queries returning a list of aggregated results. + /// + /// List of IQuery instances. + /// List of query results. Instances of IQueryResult. + IEnumerable Execute(IEnumerable queries); + } ``` -`Schemio.EntityFramework` - for installing schemio for SQL with `EntityFramework` engine. +Example Entity Framework implementation is below ``` -NuGet\Install-Package Schemio.EntityFramework -Version 1.0.0 +public class QueryEngine : IQueryEngine where T : DbContext + { + private readonly IDbContextFactory _dbContextFactory; + + public QueryEngine(IDbContextFactory _dbContextFactory) + { + this._dbContextFactory = _dbContextFactory; + } + + public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; + + public IEnumerable Execute(IEnumerable queries) + { + var output = new List(); + + using (var dbcontext = _dbContextFactory.CreateDbContext()) + { + foreach (var query in queries) + { + var results = ((ISQLQuery)query).Run(dbcontext); + + if (results == null) + continue; + + output.AddRange(results); + } + + return output.ToArray(); + } + } + } ``` +- Provide base implementation supporting IQuery, IRootQuery & IChildQuery interfaces. +- You can implement the parent and child base class implementations to construct for queries to be executed with custom engine implementation above. -### ii. Developer Guide +For Parent Query base implementation, see example below. +``` +public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery + where TQueryParameter : IQueryParameter + where TQueryResult : IQueryResult + { + /// + /// Get query delegate with implementation to return query result. + /// Delegate returns a collection from db. + /// + /// Func> + public abstract IEnumerable Run(DbContext dbContext); + } +``` -Please see [wiki](https://github.com/CodeShayk/Schemio/wiki) for details on how to implement schemio in your project. +### Custom Schema Language +You can provide your own schema language support for use in entity schema definition to map sections of object graph. -## Support +To do this you need to follow the below steps +* Provide entity schema definition with query/transformer pairs using custom schema language paths +* Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. This matcher is used by query builder to pick queries for matched paths against the configured p in Entity schema definition. +``` +public interface ISchemaPathMatcher + { + bool IsMatch(string inputPath, ISchemaPaths configuredPaths); + } +``` +Example implementation of XPath matcher is below. +``` +public class XPathMatcher : ISchemaPathMatcher + { + private static readonly Regex ancestorRegex = new Regex(@"=ancestor::(?'path'.*?)(/@|\[.*\]/@)", RegexOptions.Compiled); -If you are having problems, please let me know by [raising a new issue](https://github.com/CodeShayk/Schemio/issues/new/choose). + public bool IsMatch(string inputXPath, ISchemaPaths configuredXPaths) + { + if (inputXPath == null) + return false; -## License + if (configuredXPaths.Paths.Any(x => inputXPath.ToLower().Contains(x.ToLower()))) + return true; -This project is licensed with the [MIT license](LICENSE). + if (configuredXPaths.Paths.Any(x => inputXPath.Contains("ancestor::") + && ancestorRegex.Matches(inputXPath).Select(match => match.Groups["path"].Value).Distinct().Any(match => x.EndsWith(match)))) + return true; -## Version History -The main branch is now on .NET 8.0. The following previous versions are available: -| Version | Release Notes | -| -------- | --------| -| [`v1.0.0`](https://github.com/CodeShayk/Schemio/tree/v1.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v1.0.0) | + return false; + } + } +``` ## Credits Thank you for reading. Please fork, explore, contribute and report. Happy Coding !! :) diff --git a/Schemio.sln b/Schemio.sln index 837bcd6..dc87320 100644 --- a/Schemio.sln +++ b/Schemio.sln @@ -5,8 +5,6 @@ VisualStudioVersion = 17.5.33516.290 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F41DA3D8-A0E9-4A05-8A35-78313C0F5804}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio", "src\Schemio\Schemio.Core.csproj", "{6F017146-B95A-4081-9CC0-B0245F78D72B}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{07BAE427-96CF-4F9B-80A9-48CFB0A89CF3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{AF995FEF-BB94-48D0-B02B-6671DA73056B}" @@ -16,11 +14,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{AF README.md = README.md EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL", "src\Schemio.SQL\Schemio.SQL.csproj", "{1A0CB973-23C9-4A17-905E-59510CD18932}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework", "src\Schemio.EntityFramework\Schemio.EntityFramework.csproj", "{6B92CC17-B7DB-446F-BF2F-A93696D48B5D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.Tests", "tests\Schemio.Tests\Schemio.Tests.csproj", "{B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.Core.Tests", "tests\Schemio.Core.Tests\Schemio.Core.Tests.csproj", "{B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL.Tests", "tests\Schemio.SQL.Tests\Schemio.SQL.Tests.csproj", "{1E319404-8EF0-40A1-A9D7-A404A71A98C4}" EndProject @@ -35,24 +29,18 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "github", "github", "{39FD80 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework.Tests", "tests\Schemio.EntityFramework.Tests\Schemio.EntityFramework.Tests.csproj", "{FE039675-00BE-4DC5-945F-14E7625170D0}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.Core", "src\Schemio.Core\Schemio.Core.csproj", "{4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework", "src\Schemio.EntityFramework\Schemio.EntityFramework.csproj", "{E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL", "src\Schemio.SQL\Schemio.SQL.csproj", "{52986844-698F-486B-AEC9-846AAF50CF46}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6F017146-B95A-4081-9CC0-B0245F78D72B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6F017146-B95A-4081-9CC0-B0245F78D72B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6F017146-B95A-4081-9CC0-B0245F78D72B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6F017146-B95A-4081-9CC0-B0245F78D72B}.Release|Any CPU.Build.0 = Release|Any CPU - {1A0CB973-23C9-4A17-905E-59510CD18932}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1A0CB973-23C9-4A17-905E-59510CD18932}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1A0CB973-23C9-4A17-905E-59510CD18932}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1A0CB973-23C9-4A17-905E-59510CD18932}.Release|Any CPU.Build.0 = Release|Any CPU - {6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Release|Any CPU.Build.0 = Release|Any CPU {B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}.Debug|Any CPU.Build.0 = Debug|Any CPU {B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -65,18 +53,30 @@ Global {FE039675-00BE-4DC5-945F-14E7625170D0}.Debug|Any CPU.Build.0 = Debug|Any CPU {FE039675-00BE-4DC5-945F-14E7625170D0}.Release|Any CPU.ActiveCfg = Release|Any CPU {FE039675-00BE-4DC5-945F-14E7625170D0}.Release|Any CPU.Build.0 = Release|Any CPU + {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Release|Any CPU.Build.0 = Release|Any CPU + {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Release|Any CPU.Build.0 = Release|Any CPU + {52986844-698F-486B-AEC9-846AAF50CF46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {52986844-698F-486B-AEC9-846AAF50CF46}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52986844-698F-486B-AEC9-846AAF50CF46}.Release|Any CPU.ActiveCfg = Release|Any CPU + {52986844-698F-486B-AEC9-846AAF50CF46}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {6F017146-B95A-4081-9CC0-B0245F78D72B} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} - {1A0CB973-23C9-4A17-905E-59510CD18932} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} - {6B92CC17-B7DB-446F-BF2F-A93696D48B5D} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} {B09236CB-BBD2-4DCF-A698-74CCCAB29FFB} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3} {1E319404-8EF0-40A1-A9D7-A404A71A98C4} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3} {39FD806A-D320-43C9-800F-E9D9BCC90623} = {AF995FEF-BB94-48D0-B02B-6671DA73056B} {FE039675-00BE-4DC5-945F-14E7625170D0} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3} + {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} + {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} + {52986844-698F-486B-AEC9-846AAF50CF46} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C0FF62D6-1374-4939-A546-432862338528} diff --git a/src/Schemio/AssemblyInfo.cs b/src/Schemio.Core/AssemblyInfo.cs similarity index 88% rename from src/Schemio/AssemblyInfo.cs rename to src/Schemio.Core/AssemblyInfo.cs index 4005317..462744b 100644 --- a/src/Schemio/AssemblyInfo.cs +++ b/src/Schemio.Core/AssemblyInfo.cs @@ -11,8 +11,9 @@ // attribute to true on that type. [assembly: ComVisible(false)] -[assembly: InternalsVisibleTo("Schemio.Tests")] +[assembly: InternalsVisibleTo("Schemio.Core.Tests")] [assembly: InternalsVisibleTo("Schemio.SQL.Tests")] +[assembly: InternalsVisibleTo("Schemio.EntityFramework.Tests")] // The following GUID is for the ID of the typelib if this project is exposed to COM. diff --git a/src/Schemio/BaseEntitySchema.cs b/src/Schemio.Core/BaseEntitySchema.cs similarity index 96% rename from src/Schemio/BaseEntitySchema.cs rename to src/Schemio.Core/BaseEntitySchema.cs index d4b1b42..e013e9a 100644 --- a/src/Schemio/BaseEntitySchema.cs +++ b/src/Schemio.Core/BaseEntitySchema.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement to configure schema path mappings for an Entity. diff --git a/src/Schemio/BaseQuery.cs b/src/Schemio.Core/BaseQuery.cs similarity index 58% rename from src/Schemio/BaseQuery.cs rename to src/Schemio.Core/BaseQuery.cs index 9d82dfa..4cd8fb3 100644 --- a/src/Schemio/BaseQuery.cs +++ b/src/Schemio.Core/BaseQuery.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement this base class to create a data provider query. @@ -32,5 +32,22 @@ public Type ResultType /// /// public bool IsContextResolved() => QueryParameter != null; + + /// + /// Implement to resolve query parameter. + /// + /// data context passed to the data provider. + /// query result from parent query (when configured as nested query). Can be null. + public abstract void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult); + + /// + /// Run query with supporting IQueryEngine instance. + /// + /// IQueryEngine Instance + /// Instance of IQueryResult + public Task Run(IQueryEngine engine) + { + return engine.Execute(this); + } } } \ No newline at end of file diff --git a/src/Schemio/BaseTransformer.cs b/src/Schemio.Core/BaseTransformer.cs similarity index 98% rename from src/Schemio/BaseTransformer.cs rename to src/Schemio.Core/BaseTransformer.cs index 4bb2176..3669abf 100644 --- a/src/Schemio/BaseTransformer.cs +++ b/src/Schemio.Core/BaseTransformer.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public abstract class BaseTransformer : ITransformer, ITransformerContext, ITransformerQueryResult diff --git a/src/Schemio/CacheResultAttribute.cs b/src/Schemio.Core/CacheResultAttribute.cs similarity index 72% rename from src/Schemio/CacheResultAttribute.cs rename to src/Schemio.Core/CacheResultAttribute.cs index 0b32eb8..d989780 100644 --- a/src/Schemio/CacheResultAttribute.cs +++ b/src/Schemio.Core/CacheResultAttribute.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public class CacheResultAttribute : Attribute { } diff --git a/src/Schemio/ChildrenQueries.cs b/src/Schemio.Core/ChildrenQueries.cs similarity index 87% rename from src/Schemio/ChildrenQueries.cs rename to src/Schemio.Core/ChildrenQueries.cs index 42b30d9..9906175 100644 --- a/src/Schemio/ChildrenQueries.cs +++ b/src/Schemio.Core/ChildrenQueries.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public class ChildrenQueries { diff --git a/src/Schemio.Core/CollectionResult.cs b/src/Schemio.Core/CollectionResult.cs new file mode 100644 index 0000000..bd7c28d --- /dev/null +++ b/src/Schemio.Core/CollectionResult.cs @@ -0,0 +1,9 @@ +namespace Schemio.Core +{ + public class CollectionResult : List, IQueryResult + { + public CollectionResult(IEnumerable list) : base(list) + { + } + } +} \ No newline at end of file diff --git a/src/Schemio/CreateSchema.cs b/src/Schemio.Core/CreateSchema.cs similarity index 99% rename from src/Schemio/CreateSchema.cs rename to src/Schemio.Core/CreateSchema.cs index 309e324..43e9ff0 100644 --- a/src/Schemio/CreateSchema.cs +++ b/src/Schemio.Core/CreateSchema.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { #region Helpers diff --git a/src/Schemio/DataContext.cs b/src/Schemio.Core/DataContext.cs similarity index 93% rename from src/Schemio/DataContext.cs rename to src/Schemio.Core/DataContext.cs index edb4020..140e743 100644 --- a/src/Schemio/DataContext.cs +++ b/src/Schemio.Core/DataContext.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { internal class DataContext : IDataContext { diff --git a/src/Schemio/Helpers/ArrayUtil.cs b/src/Schemio.Core/Helpers/ArrayUtil.cs similarity index 95% rename from src/Schemio/Helpers/ArrayUtil.cs rename to src/Schemio.Core/Helpers/ArrayUtil.cs index 01d6bd8..b9a7ae6 100644 --- a/src/Schemio/Helpers/ArrayUtil.cs +++ b/src/Schemio.Core/Helpers/ArrayUtil.cs @@ -1,4 +1,4 @@ -namespace Schemio.Helpers +namespace Schemio.Core.Helpers { public static class ArrayUtil { diff --git a/src/Schemio/Helpers/EnumerableExtentions.cs b/src/Schemio.Core/Helpers/EnumerableExtentions.cs similarity index 96% rename from src/Schemio/Helpers/EnumerableExtentions.cs rename to src/Schemio.Core/Helpers/EnumerableExtentions.cs index 5e7f7b8..d455d10 100644 --- a/src/Schemio/Helpers/EnumerableExtentions.cs +++ b/src/Schemio.Core/Helpers/EnumerableExtentions.cs @@ -1,6 +1,6 @@ using System.Text; -namespace Schemio.Helpers +namespace Schemio.Core.Helpers { public static class EnumerableExtentions { diff --git a/src/Schemio/Helpers/StringExtensions.cs b/src/Schemio.Core/Helpers/StringExtensions.cs similarity index 83% rename from src/Schemio/Helpers/StringExtensions.cs rename to src/Schemio.Core/Helpers/StringExtensions.cs index cce4dbf..2cefe2d 100644 --- a/src/Schemio/Helpers/StringExtensions.cs +++ b/src/Schemio.Core/Helpers/StringExtensions.cs @@ -1,4 +1,4 @@ -namespace Schemio.Helpers +namespace Schemio.Core.Helpers { public static class StringExtensions { diff --git a/src/Schemio/Helpers/Xml/XDocumentExts.cs b/src/Schemio.Core/Helpers/Xml/XDocumentExts.cs similarity index 96% rename from src/Schemio/Helpers/Xml/XDocumentExts.cs rename to src/Schemio.Core/Helpers/Xml/XDocumentExts.cs index ad04e7d..936e178 100644 --- a/src/Schemio/Helpers/Xml/XDocumentExts.cs +++ b/src/Schemio.Core/Helpers/Xml/XDocumentExts.cs @@ -1,6 +1,6 @@ using System.Xml.Linq; -namespace Schemio.Helpers.Xml +namespace Schemio.Core.Helpers.Xml { public static class XDocumentExts { diff --git a/src/Schemio/Helpers/Xml/XmlHelper.cs b/src/Schemio.Core/Helpers/Xml/XmlHelper.cs similarity index 94% rename from src/Schemio/Helpers/Xml/XmlHelper.cs rename to src/Schemio.Core/Helpers/Xml/XmlHelper.cs index 1f1f9a4..b38db24 100644 --- a/src/Schemio/Helpers/Xml/XmlHelper.cs +++ b/src/Schemio.Core/Helpers/Xml/XmlHelper.cs @@ -2,7 +2,7 @@ using System.Xml; using System.Xml.Serialization; -namespace Schemio.Helpers.Xml +namespace Schemio.Core.Helpers.Xml { public static class XmlHelper { diff --git a/src/Schemio/Helpers/Xml/XmlSanitizer.cs b/src/Schemio.Core/Helpers/Xml/XmlSanitizer.cs similarity index 96% rename from src/Schemio/Helpers/Xml/XmlSanitizer.cs rename to src/Schemio.Core/Helpers/Xml/XmlSanitizer.cs index 4b16ef1..24f3b1a 100644 --- a/src/Schemio/Helpers/Xml/XmlSanitizer.cs +++ b/src/Schemio.Core/Helpers/Xml/XmlSanitizer.cs @@ -2,7 +2,7 @@ using System.Text.RegularExpressions; using System.Xml; -namespace Schemio.Helpers.Xml +namespace Schemio.Core.Helpers.Xml { public static class XmlSanitizer { diff --git a/src/Schemio/IDataContext.cs b/src/Schemio.Core/IDataContext.cs similarity index 82% rename from src/Schemio/IDataContext.cs rename to src/Schemio.Core/IDataContext.cs index d86f11f..151268f 100644 --- a/src/Schemio/IDataContext.cs +++ b/src/Schemio.Core/IDataContext.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IDataContext : IEntityContextCache { diff --git a/src/Schemio/IDataProvider.cs b/src/Schemio.Core/IDataProvider.cs similarity index 85% rename from src/Schemio/IDataProvider.cs rename to src/Schemio.Core/IDataProvider.cs index cb6c7ba..12329e8 100644 --- a/src/Schemio/IDataProvider.cs +++ b/src/Schemio.Core/IDataProvider.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IDataProvider where TEntity : IEntity { diff --git a/src/Schemio/IEntity.cs b/src/Schemio.Core/IEntity.cs similarity index 89% rename from src/Schemio/IEntity.cs rename to src/Schemio.Core/IEntity.cs index 6319a64..efe74ed 100644 --- a/src/Schemio/IEntity.cs +++ b/src/Schemio.Core/IEntity.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement Entity required to be hydrated (using query/transformer). diff --git a/src/Schemio.Core/IEntityBuilder.cs b/src/Schemio.Core/IEntityBuilder.cs new file mode 100644 index 0000000..d375e1b --- /dev/null +++ b/src/Schemio.Core/IEntityBuilder.cs @@ -0,0 +1,7 @@ +namespace Schemio.Core +{ + public interface IEntityBuilder where TEntity : IEntity + { + TEntity Build(IDataContext context, IList results); + } +} \ No newline at end of file diff --git a/src/Schemio/IEntityContext.cs b/src/Schemio.Core/IEntityContext.cs similarity index 89% rename from src/Schemio/IEntityContext.cs rename to src/Schemio.Core/IEntityContext.cs index f15c465..1e85b70 100644 --- a/src/Schemio/IEntityContext.cs +++ b/src/Schemio.Core/IEntityContext.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IEntityContext { diff --git a/src/Schemio/IEntityContextCache.cs b/src/Schemio.Core/IEntityContextCache.cs similarity index 91% rename from src/Schemio/IEntityContextCache.cs rename to src/Schemio.Core/IEntityContextCache.cs index 60a5955..b4bbd9a 100644 --- a/src/Schemio/IEntityContextCache.cs +++ b/src/Schemio.Core/IEntityContextCache.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IEntityContextCache { diff --git a/src/Schemio/IEntityContextValidator.cs b/src/Schemio.Core/IEntityContextValidator.cs similarity index 83% rename from src/Schemio/IEntityContextValidator.cs rename to src/Schemio.Core/IEntityContextValidator.cs index 9622b23..f1accbe 100644 --- a/src/Schemio/IEntityContextValidator.cs +++ b/src/Schemio.Core/IEntityContextValidator.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IEntityContextValidator { diff --git a/src/Schemio/IEntitySchema.cs b/src/Schemio.Core/IEntitySchema.cs similarity index 75% rename from src/Schemio/IEntitySchema.cs rename to src/Schemio.Core/IEntitySchema.cs index aa96154..11de773 100644 --- a/src/Schemio/IEntitySchema.cs +++ b/src/Schemio.Core/IEntitySchema.cs @@ -1,10 +1,10 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement to configure schema path mappings for an Entity. /// /// Entity type - public interface IEntitySchema where TEntity : IEntity + public interface IEntitySchema : IEntitySchema where TEntity : IEntity { /// /// Entity schema mappings. diff --git a/src/Schemio.Core/IEntitySchema1.cs b/src/Schemio.Core/IEntitySchema1.cs new file mode 100644 index 0000000..6bd2ed7 --- /dev/null +++ b/src/Schemio.Core/IEntitySchema1.cs @@ -0,0 +1,6 @@ +namespace Schemio.Core +{ + public interface IEntitySchema + { + } +} \ No newline at end of file diff --git a/src/Schemio/IPolymorphicResult.cs b/src/Schemio.Core/IPolymorphicResult.cs similarity index 75% rename from src/Schemio/IPolymorphicResult.cs rename to src/Schemio.Core/IPolymorphicResult.cs index 6e0181c..7d505a5 100644 --- a/src/Schemio/IPolymorphicResult.cs +++ b/src/Schemio.Core/IPolymorphicResult.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IPolymorphicResult : IQueryResult { diff --git a/src/Schemio.Core/IQuery.cs b/src/Schemio.Core/IQuery.cs new file mode 100644 index 0000000..bd6478c --- /dev/null +++ b/src/Schemio.Core/IQuery.cs @@ -0,0 +1,21 @@ +namespace Schemio.Core +{ + /// + /// Implement IQuery to fetch data using API or database. + /// + public interface IQuery : IQueryRunner + { + List Children { get; set; } + + Type ResultType { get; } + + bool IsContextResolved(); + + void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult = null); + } + + public interface IQueryRunner + { + Task Run(IQueryEngine engine); + } +} \ No newline at end of file diff --git a/src/Schemio/IQueryBuilder.cs b/src/Schemio.Core/IQueryBuilder.cs similarity index 81% rename from src/Schemio/IQueryBuilder.cs rename to src/Schemio.Core/IQueryBuilder.cs index 61223cc..8d7686d 100644 --- a/src/Schemio/IQueryBuilder.cs +++ b/src/Schemio.Core/IQueryBuilder.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryBuilder { diff --git a/src/Schemio/IQueryEngine.cs b/src/Schemio.Core/IQueryEngine.cs similarity index 66% rename from src/Schemio/IQueryEngine.cs rename to src/Schemio.Core/IQueryEngine.cs index a2e2535..acfb7cb 100644 --- a/src/Schemio/IQueryEngine.cs +++ b/src/Schemio.Core/IQueryEngine.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryEngine { @@ -12,8 +12,8 @@ public interface IQueryEngine /// /// Executes a list of queries returning a list of aggregated results. /// - /// List of IQuery instances. - /// List of query results. Instances of IQueryResult. - IEnumerable Execute(IEnumerable queries); + /// Instance of IQuery. + /// Instance of IQueryResult. + Task Execute(IQuery query); } } \ No newline at end of file diff --git a/src/Schemio/IQueryExecutor.cs b/src/Schemio.Core/IQueryExecutor.cs similarity index 84% rename from src/Schemio/IQueryExecutor.cs rename to src/Schemio.Core/IQueryExecutor.cs index 3085279..13ee57a 100644 --- a/src/Schemio/IQueryExecutor.cs +++ b/src/Schemio.Core/IQueryExecutor.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryExecutor { diff --git a/src/Schemio/IQueryList.cs b/src/Schemio.Core/IQueryList.cs similarity index 94% rename from src/Schemio/IQueryList.cs rename to src/Schemio.Core/IQueryList.cs index 82794d8..31c9244 100644 --- a/src/Schemio/IQueryList.cs +++ b/src/Schemio.Core/IQueryList.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryList { diff --git a/src/Schemio/IQueryParameter.cs b/src/Schemio.Core/IQueryParameter.cs similarity index 69% rename from src/Schemio/IQueryParameter.cs rename to src/Schemio.Core/IQueryParameter.cs index 68c0ed0..eda20dd 100644 --- a/src/Schemio/IQueryParameter.cs +++ b/src/Schemio.Core/IQueryParameter.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryParameter { diff --git a/src/Schemio/IQueryResult.cs b/src/Schemio.Core/IQueryResult.cs similarity index 68% rename from src/Schemio/IQueryResult.cs rename to src/Schemio.Core/IQueryResult.cs index fbfa3a6..41f1ba4 100644 --- a/src/Schemio/IQueryResult.cs +++ b/src/Schemio.Core/IQueryResult.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryResult { diff --git a/src/Schemio/ISchemaPathMatcher.cs b/src/Schemio.Core/ISchemaPathMatcher.cs similarity index 82% rename from src/Schemio/ISchemaPathMatcher.cs rename to src/Schemio.Core/ISchemaPathMatcher.cs index 4c54ded..c52ef0f 100644 --- a/src/Schemio/ISchemaPathMatcher.cs +++ b/src/Schemio.Core/ISchemaPathMatcher.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface ISchemaPathMatcher { diff --git a/src/Schemio/ITransformer.cs b/src/Schemio.Core/ITransformer.cs similarity index 95% rename from src/Schemio/ITransformer.cs rename to src/Schemio.Core/ITransformer.cs index 9bbbb0b..76ae8ef 100644 --- a/src/Schemio/ITransformer.cs +++ b/src/Schemio.Core/ITransformer.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement transformer to map data from supported query result to entity in context. diff --git a/src/Schemio/ITransformerContext.cs b/src/Schemio.Core/ITransformerContext.cs similarity index 93% rename from src/Schemio/ITransformerContext.cs rename to src/Schemio.Core/ITransformerContext.cs index dee4f46..df6a1a9 100644 --- a/src/Schemio/ITransformerContext.cs +++ b/src/Schemio.Core/ITransformerContext.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement to set transform with data context. diff --git a/src/Schemio/ITransformerQueryResult.cs b/src/Schemio.Core/ITransformerQueryResult.cs similarity index 92% rename from src/Schemio/ITransformerQueryResult.cs rename to src/Schemio.Core/ITransformerQueryResult.cs index c9758c5..893fce6 100644 --- a/src/Schemio/ITransformerQueryResult.cs +++ b/src/Schemio.Core/ITransformerQueryResult.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement to get supported Query result. diff --git a/src/Schemio/Impl/DataProvider.cs b/src/Schemio.Core/Impl/DataProvider.cs similarity index 71% rename from src/Schemio/Impl/DataProvider.cs rename to src/Schemio.Core/Impl/DataProvider.cs index 9fe3c2a..c23555f 100644 --- a/src/Schemio/Impl/DataProvider.cs +++ b/src/Schemio.Core/Impl/DataProvider.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Logging; -using Schemio.PathMatchers; +using Schemio.Core.PathMatchers; -namespace Schemio.Impl +namespace Schemio.Core.Impl { public class DataProvider : IDataProvider where TEntity : IEntity, new() @@ -9,13 +9,13 @@ public class DataProvider : IDataProvider private readonly ILogger> logger; private readonly IQueryExecutor queryExecutor; private readonly IQueryBuilder queryBuilder; - private readonly ITransformExecutor transformExecutor; + private readonly IEntityBuilder entityBuilder; public DataProvider( IEntitySchema entitySchema, params IQueryEngine[] queryEngines) : this(null, new QueryBuilder(entitySchema, new XPathMatcher()), - new QueryExecutor(queryEngines), new TransformExecutor(entitySchema)) + new QueryExecutor(queryEngines), new EntityBuilder(entitySchema)) { } @@ -25,7 +25,7 @@ public DataProvider( ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) : this(logger, new QueryBuilder(entitySchema, schemaPathMatcher), - new QueryExecutor(queryEngines), new TransformExecutor(entitySchema)) + new QueryExecutor(queryEngines), new EntityBuilder(entitySchema)) { } @@ -33,12 +33,12 @@ public DataProvider( ILogger> logger, IQueryBuilder queryBuilder, IQueryExecutor queryExecutor, - ITransformExecutor transformExecutor) + IEntityBuilder entityBuilder) { this.logger = logger; this.queryBuilder = queryBuilder; this.queryExecutor = queryExecutor; - this.transformExecutor = transformExecutor; + this.entityBuilder = entityBuilder; } public TEntity GetData(IEntityContext entityContext) @@ -52,6 +52,20 @@ internal TEntity GetData(IDataContext context) // Build queries for the data source based on the included xPaths var watch = System.Diagnostics.Stopwatch.StartNew(); var queries = queryBuilder.Build(context); + + //foreach (var item in queries.Queries) + //{ + // Console.WriteLine("L1 Query To Execute: " + item.GetType().Name); + + // foreach (var item2 in item.Children) + // { + // Console.WriteLine("L2 Query To Execute: " + item2.GetType().Name); + + // foreach (var item3 in item2.Children) + // Console.WriteLine("L3 Query To Execute: " + item3.GetType().Name); + // } + //} + watch.Stop(); logger?.LogInformation("Query builder executed in " + watch.ElapsedMilliseconds + " ms"); @@ -63,7 +77,7 @@ internal TEntity GetData(IDataContext context) // Executes configured transformers to map query results to target entity watch = System.Diagnostics.Stopwatch.StartNew(); - var entity = transformExecutor.Execute(context, results); + var entity = entityBuilder.Build(context, results); watch.Stop(); logger?.LogInformation("Transform executor executed in " + watch.ElapsedMilliseconds + " ms"); diff --git a/src/Schemio/Impl/TransformExecutor.cs b/src/Schemio.Core/Impl/EntityBuilder.cs similarity index 87% rename from src/Schemio/Impl/TransformExecutor.cs rename to src/Schemio.Core/Impl/EntityBuilder.cs index ed55eb0..b799dd0 100644 --- a/src/Schemio/Impl/TransformExecutor.cs +++ b/src/Schemio.Core/Impl/EntityBuilder.cs @@ -1,10 +1,10 @@ -namespace Schemio.Impl +namespace Schemio.Core.Impl { - public class TransformExecutor : ITransformExecutor where T : IEntity, new() + public class EntityBuilder : IEntityBuilder where T : IEntity, new() { private readonly IEntitySchema entitySchema; - public TransformExecutor(IEntitySchema entitySchema) + public EntityBuilder(IEntitySchema entitySchema) { this.entitySchema = entitySchema; } @@ -15,7 +15,7 @@ public TransformExecutor(IEntitySchema entitySchema) /// Entity Context /// List of Query results /// - public T Execute(IDataContext context, IList queryResults) + public T Build(IDataContext context, IList queryResults) { var entity = new T { /*Version = entitySchemaMapping.Version*/ }; diff --git a/src/Schemio/Impl/EventAggregator.cs b/src/Schemio.Core/Impl/EventPublisher.cs similarity index 82% rename from src/Schemio/Impl/EventAggregator.cs rename to src/Schemio.Core/Impl/EventPublisher.cs index 4628367..f135e55 100644 --- a/src/Schemio/Impl/EventAggregator.cs +++ b/src/Schemio.Core/Impl/EventPublisher.cs @@ -1,10 +1,10 @@ -namespace Schemio.Impl +namespace Schemio.Core.Impl { - public class EventAggregator + public class EventPublisher { private readonly ISubscriber subscriber; - public EventAggregator(ISubscriber subscriber) + public EventPublisher(ISubscriber subscriber) { this.subscriber = subscriber; } diff --git a/src/Schemio/Impl/EventSubscriber.cs b/src/Schemio.Core/Impl/EventSubscriber.cs similarity index 88% rename from src/Schemio/Impl/EventSubscriber.cs rename to src/Schemio.Core/Impl/EventSubscriber.cs index 33baf8e..9390e0a 100644 --- a/src/Schemio/Impl/EventSubscriber.cs +++ b/src/Schemio.Core/Impl/EventSubscriber.cs @@ -1,4 +1,4 @@ -namespace Schemio.Impl +namespace Schemio.Core.Impl { public class EventSubscriber : ISubscriber { @@ -28,8 +28,8 @@ public void OnEventHandler(IDataContext context, ExecutorResultArgs args) if (unresolved.ParentQueryResultType != result.GetType()) continue; - foreach (var query in unresolved.Queries.Cast()) - query.ResolveChildQueryParameter(context, queryResult); + foreach (var query in unresolved.Queries) + query.ResolveQueryParameter(context, queryResult); } } @@ -48,8 +48,8 @@ public void OnEventHandler(IDataContext context, ExecutorResultArgs args) !unresolved.ParentQueryResultType.IsAssignableFrom(result.GetType())) continue; - foreach (var query in unresolved.Queries.Cast()) - query.ResolveChildQueryParameter(context, queryResult); + foreach (var query in unresolved.Queries) + query.ResolveQueryParameter(context, queryResult); } } } diff --git a/src/Schemio/Impl/QueryBuilder.cs b/src/Schemio.Core/Impl/QueryBuilder.cs similarity index 82% rename from src/Schemio/Impl/QueryBuilder.cs rename to src/Schemio.Core/Impl/QueryBuilder.cs index c79f3c2..90f56f0 100644 --- a/src/Schemio/Impl/QueryBuilder.cs +++ b/src/Schemio.Core/Impl/QueryBuilder.cs @@ -1,4 +1,4 @@ -namespace Schemio.Impl +namespace Schemio.Core.Impl { public class QueryBuilder : IQueryBuilder where T : IEntity { @@ -18,10 +18,12 @@ public QueryBuilder(IEntitySchema entitySchema, ISchemaPathMatcher schemaPath /// public IQueryList Build(IDataContext context) { - var queries = GetMappedQueries(entitySchema.Mappings.ToList(), context); + var mappings = entitySchema.Mappings.ToList(); - foreach (var query in queries.Queries.Cast()) - query.ResolveRootQueryParameter(context); + var queries = GetMappedQueries(mappings, context); + + foreach (var query in queries.Queries) + query.ResolveQueryParameter(context); return new QueryList(queries.Queries); } @@ -32,16 +34,17 @@ private QueryList GetMappedQueries(IReadOnlyCollection> for (var index = 1; index <= queryDependencyDepth; index++) { - var maps = mappings.Where(x => x.Order == index); + var maps = mappings.Where(x => x.Order == index).ToList(); foreach (var map in maps) { var dependentQueries = mappings.Where(x => x.Order == index + 1 && x.DependentOn != null && x.DependentOn.GetType() == map.Query.GetType()).ToList(); - map.Query.Children ??= new List(); + map.Query.Children = new List(); - map.Query.Children.AddRange(FilterByPaths(context, dependentQueries)); + var filtered = FilterByPaths(context, dependentQueries); + map.Query.Children.AddRange(filtered); } } diff --git a/src/Schemio/Impl/QueryExecutor.cs b/src/Schemio.Core/Impl/QueryExecutor.cs similarity index 78% rename from src/Schemio/Impl/QueryExecutor.cs rename to src/Schemio.Core/Impl/QueryExecutor.cs index 41bbbdf..87c92e0 100644 --- a/src/Schemio/Impl/QueryExecutor.cs +++ b/src/Schemio.Core/Impl/QueryExecutor.cs @@ -1,4 +1,4 @@ -namespace Schemio.Impl +namespace Schemio.Core.Impl { public class QueryExecutor : IQueryExecutor { @@ -24,7 +24,7 @@ public IList Execute(IDataContext context, IQueryList queries) private IQueryList Process(IDataContext context, IQueryList queries, List globalResults) { var subscriber = new EventSubscriber(queries.GetChildrenQueries()); - var eventAggregator = new EventAggregator(subscriber); + var eventAggregator = new EventPublisher(subscriber); var results = RunQueries(queries); @@ -55,12 +55,19 @@ private List RunQueries(IQueryList queryList) foreach (var engine in queryEngines) { - var queries = queryList.Queries.Where(x => engine.CanExecute(x)); - - var results = engine.Execute(queries); - - if (results != null) - output.AddRange(results); + var tasks = queryList.Queries + .Where(x => engine.CanExecute(x)) + .Select(s => s.Run(engine)) + .ToList(); + + Task.WhenAll(tasks); + + foreach (var task in tasks) + { + var result = task.Result; + if (result != null) + output.Add(result); + } } return output; diff --git a/src/Schemio.Core/Motley - Backup.Core.csproj b/src/Schemio.Core/Motley - Backup.Core.csproj new file mode 100644 index 0000000..8d8a202 --- /dev/null +++ b/src/Schemio.Core/Motley - Backup.Core.csproj @@ -0,0 +1,46 @@ + + + + net8.0 + enable + enable + true + Code Shayk + Code Shayk + Copyright (c) 2024 Code Shayk + https://github.com/CodeShayk/Schemio + git + README.md + ninja-icon-16.png + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley motley-core + https://github.com/CodeShayk/Schemio/wiki/i.-Home + LICENSE.md + Schemio (No Query Engine Provided) + True + True + snupkg + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + diff --git a/src/Schemio/PathMatchers/JPathMatcher.cs b/src/Schemio.Core/PathMatchers/JPathMatcher.cs similarity index 84% rename from src/Schemio/PathMatchers/JPathMatcher.cs rename to src/Schemio.Core/PathMatchers/JPathMatcher.cs index 56c9946..a24b1b2 100644 --- a/src/Schemio/PathMatchers/JPathMatcher.cs +++ b/src/Schemio.Core/PathMatchers/JPathMatcher.cs @@ -1,6 +1,6 @@ -using Schemio.Helpers; +using Schemio.Core.Helpers; -namespace Schemio.PathMatchers +namespace Schemio.Core.PathMatchers { public class JPathMatcher : ISchemaPathMatcher { diff --git a/src/Schemio/PathMatchers/XPathMatcher.cs b/src/Schemio.Core/PathMatchers/XPathMatcher.cs similarity index 95% rename from src/Schemio/PathMatchers/XPathMatcher.cs rename to src/Schemio.Core/PathMatchers/XPathMatcher.cs index b22fc2f..77e18d0 100644 --- a/src/Schemio/PathMatchers/XPathMatcher.cs +++ b/src/Schemio.Core/PathMatchers/XPathMatcher.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; -namespace Schemio.PathMatchers +namespace Schemio.Core.PathMatchers { public class XPathMatcher : ISchemaPathMatcher { diff --git a/src/Schemio/QueryComparer.cs b/src/Schemio.Core/QueryComparer.cs similarity index 92% rename from src/Schemio/QueryComparer.cs rename to src/Schemio.Core/QueryComparer.cs index 463eab4..85a1e11 100644 --- a/src/Schemio/QueryComparer.cs +++ b/src/Schemio.Core/QueryComparer.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public class QueryComparer : IEqualityComparer { diff --git a/src/Schemio/QueryList.cs b/src/Schemio.Core/QueryList.cs similarity index 98% rename from src/Schemio/QueryList.cs rename to src/Schemio.Core/QueryList.cs index 8b9c732..bc9422b 100644 --- a/src/Schemio/QueryList.cs +++ b/src/Schemio.Core/QueryList.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public class QueryList : IQueryList { diff --git a/src/Schemio/Schemio.Core.csproj b/src/Schemio.Core/Schemio.Core.csproj similarity index 90% rename from src/Schemio/Schemio.Core.csproj rename to src/Schemio.Core/Schemio.Core.csproj index bc47a73..00fcd1a 100644 --- a/src/Schemio/Schemio.Core.csproj +++ b/src/Schemio.Core/Schemio.Core.csproj @@ -1,11 +1,10 @@ - + net8.0 enable enable true - True Code Shayk Code Shayk Copyright (c) 2024 Code Shayk @@ -18,6 +17,10 @@ https://github.com/CodeShayk/Schemio/wiki/i.-Home LICENSE.md Schemio (No Query Engine Provided) + True + True + snupkg + True diff --git a/src/Schemio.Core/ServicesExtensions.cs b/src/Schemio.Core/ServicesExtensions.cs new file mode 100644 index 0000000..bdf3ce8 --- /dev/null +++ b/src/Schemio.Core/ServicesExtensions.cs @@ -0,0 +1,37 @@ +using Microsoft.Extensions.DependencyInjection; +using Schemio.Core.Impl; +using Schemio.Core.PathMatchers; + +namespace Schemio.Core +{ + public static class ServicesExtensions + { + public static IServiceCollection UseSchemio(this IServiceCollection services, + ISchemaPathMatcher schemaPathMatcher = null, + params Func[] queryEngines + ) + { + services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); + services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); + services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); + + services.AddTransient(); + services.AddTransient(c => schemaPathMatcher ?? new XPathMatcher()); + + if (queryEngines != null && queryEngines.Length > 0) + foreach (var engine in queryEngines) + services.AddTransient(c => engine(c)); + + return services; + } + + public static IServiceCollection AddEntitySchema(this IServiceCollection services) + where TEntity : IEntity + where TSchema : IEntitySchema + { + services.AddTransient(typeof(IEntitySchema), typeof(TSchema)); + + return services; + } + } +} \ No newline at end of file diff --git a/src/Schemio/XML/XMLDataProvider.cs b/src/Schemio.Core/XML/XMLDataProvider.cs similarity index 97% rename from src/Schemio/XML/XMLDataProvider.cs rename to src/Schemio.Core/XML/XMLDataProvider.cs index 2aab53e..d4e859d 100644 --- a/src/Schemio/XML/XMLDataProvider.cs +++ b/src/Schemio.Core/XML/XMLDataProvider.cs @@ -2,9 +2,9 @@ using System.Xml.Linq; using System.Xml.Serialization; using Microsoft.Extensions.Logging; -using Schemio.Helpers.Xml; +using Schemio.Core.Helpers.Xml; -namespace Schemio.XML +namespace Schemio.Core.XML { internal class XMLDataProvider where T : IEntity { diff --git a/src/Schemio.EntityFramework/BaseSQLChildQuery.cs b/src/Schemio.EntityFramework/BaseSQLQuery.cs similarity index 65% rename from src/Schemio.EntityFramework/BaseSQLChildQuery.cs rename to src/Schemio.EntityFramework/BaseSQLQuery.cs index 134d310..029b8a1 100644 --- a/src/Schemio.EntityFramework/BaseSQLChildQuery.cs +++ b/src/Schemio.EntityFramework/BaseSQLQuery.cs @@ -1,9 +1,10 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; namespace Schemio.EntityFramework { - public abstract class BaseSQLChildQuery - : BaseChildQuery, ISQLQuery + public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery where TQueryParameter : IQueryParameter where TQueryResult : IQueryResult { @@ -12,6 +13,6 @@ public abstract class BaseSQLChildQuery /// Delegate returns a collection from db. /// /// Func> - public abstract IEnumerable Run(DbContext dbContext); + public abstract Task Run(DbContext dbContext); } } \ No newline at end of file diff --git a/src/Schemio.EntityFramework/BaseSQLRootQuery.cs b/src/Schemio.EntityFramework/BaseSQLRootQuery.cs deleted file mode 100644 index c682126..0000000 --- a/src/Schemio.EntityFramework/BaseSQLRootQuery.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace Schemio.EntityFramework -{ - public abstract class BaseSQLRootQuery - : BaseRootQuery, ISQLQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// Func> - public abstract IEnumerable Run(DbContext dbContext); - } -} \ No newline at end of file diff --git a/src/Schemio.EntityFramework/ISQLQuery.cs b/src/Schemio.EntityFramework/ISQLQuery.cs index a8240e5..137e8de 100644 --- a/src/Schemio.EntityFramework/ISQLQuery.cs +++ b/src/Schemio.EntityFramework/ISQLQuery.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; namespace Schemio.EntityFramework { @@ -9,6 +10,6 @@ public interface ISQLQuery /// Delegate returns a collection from db. /// /// Func> - IEnumerable Run(DbContext dbContext); + Task Run(DbContext dbContext); } } \ No newline at end of file diff --git a/src/Schemio.EntityFramework/QueryEngine.cs b/src/Schemio.EntityFramework/QueryEngine.cs index 1aff4c1..acd2b2b 100644 --- a/src/Schemio.EntityFramework/QueryEngine.cs +++ b/src/Schemio.EntityFramework/QueryEngine.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; namespace Schemio.EntityFramework { @@ -13,23 +14,12 @@ public QueryEngine(IDbContextFactory _dbContextFactory) public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; - public IEnumerable Execute(IEnumerable queries) + public Task Execute(IQuery query) { - var output = new List(); - using (var dbcontext = _dbContextFactory.CreateDbContext()) { - foreach (var query in queries) - { - var results = ((ISQLQuery)query).Run(dbcontext); - - if (results == null) - continue; - - output.AddRange(results); - } - - return output.ToArray(); + var result = ((ISQLQuery)query).Run(dbcontext); + return result; } } } diff --git a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj index ff8fc03..3635f2d 100644 --- a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj +++ b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj @@ -19,6 +19,12 @@ LICENSE.md True True + snupkg + True + + + + True @@ -41,7 +47,7 @@ - + diff --git a/src/Schemio.SQL/BaseSQLChildQuery.cs b/src/Schemio.SQL/BaseSQLChildQuery.cs deleted file mode 100644 index b293575..0000000 --- a/src/Schemio.SQL/BaseSQLChildQuery.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Schemio.SQL -{ - public abstract class BaseSQLChildQuery : BaseSQLQuery, IChildQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - public abstract void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult); - } -} \ No newline at end of file diff --git a/src/Schemio.SQL/BaseSQLQuery.cs b/src/Schemio.SQL/BaseSQLQuery.cs index 98e6f26..96c29d5 100644 --- a/src/Schemio.SQL/BaseSQLQuery.cs +++ b/src/Schemio.SQL/BaseSQLQuery.cs @@ -1,6 +1,5 @@ -using System.Collections.Generic; using System.Data; -using Dapper; +using Schemio.Core; namespace Schemio.SQL { @@ -8,11 +7,11 @@ public abstract class BaseSQLQuery : BaseQuery Execute(IDbConnection conn); + public abstract Task Run(IDbConnection conn); - public IEnumerable Run(IDbConnection conn) + async Task ISQLQuery.Run(IDbConnection conn) { - return (IEnumerable)Execute(conn); + return await Run(conn); } } } \ No newline at end of file diff --git a/src/Schemio.SQL/BaseSQLRootQuery.cs b/src/Schemio.SQL/BaseSQLRootQuery.cs deleted file mode 100644 index 3573f88..0000000 --- a/src/Schemio.SQL/BaseSQLRootQuery.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Schemio.SQL -{ - public abstract class BaseSQLRootQuery : BaseSQLQuery, IRootQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - public abstract void ResolveRootQueryParameter(IDataContext context); - } -} \ No newline at end of file diff --git a/src/Schemio.SQL/ISQLQuery.cs b/src/Schemio.SQL/ISQLQuery.cs index 3445994..7292752 100644 --- a/src/Schemio.SQL/ISQLQuery.cs +++ b/src/Schemio.SQL/ISQLQuery.cs @@ -1,9 +1,10 @@ using System.Data; +using Schemio.Core; namespace Schemio.SQL { public interface ISQLQuery : IQuery { - IEnumerable Run(IDbConnection conn); + Task Run(IDbConnection conn); } } \ No newline at end of file diff --git a/src/Schemio.SQL/Motley - Backup (1).SQL.csproj b/src/Schemio.SQL/Motley - Backup (1).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (1).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (10).SQL.csproj b/src/Schemio.SQL/Motley - Backup (10).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (10).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (100).SQL.csproj b/src/Schemio.SQL/Motley - Backup (100).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (100).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (101).SQL.csproj b/src/Schemio.SQL/Motley - Backup (101).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (101).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (102).SQL.csproj b/src/Schemio.SQL/Motley - Backup (102).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (102).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (103).SQL.csproj b/src/Schemio.SQL/Motley - Backup (103).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (103).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (104).SQL.csproj b/src/Schemio.SQL/Motley - Backup (104).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (104).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (105).SQL.csproj b/src/Schemio.SQL/Motley - Backup (105).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (105).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (106).SQL.csproj b/src/Schemio.SQL/Motley - Backup (106).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (106).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (107).SQL.csproj b/src/Schemio.SQL/Motley - Backup (107).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (107).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (108).SQL.csproj b/src/Schemio.SQL/Motley - Backup (108).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (108).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (109).SQL.csproj b/src/Schemio.SQL/Motley - Backup (109).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (109).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (11).SQL.csproj b/src/Schemio.SQL/Motley - Backup (11).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (11).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (110).SQL.csproj b/src/Schemio.SQL/Motley - Backup (110).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (110).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (111).SQL.csproj b/src/Schemio.SQL/Motley - Backup (111).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (111).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (112).SQL.csproj b/src/Schemio.SQL/Motley - Backup (112).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (112).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (113).SQL.csproj b/src/Schemio.SQL/Motley - Backup (113).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (113).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (114).SQL.csproj b/src/Schemio.SQL/Motley - Backup (114).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (114).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (115).SQL.csproj b/src/Schemio.SQL/Motley - Backup (115).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (115).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (116).SQL.csproj b/src/Schemio.SQL/Motley - Backup (116).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (116).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (117).SQL.csproj b/src/Schemio.SQL/Motley - Backup (117).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (117).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (118).SQL.csproj b/src/Schemio.SQL/Motley - Backup (118).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (118).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (119).SQL.csproj b/src/Schemio.SQL/Motley - Backup (119).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (119).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (12).SQL.csproj b/src/Schemio.SQL/Motley - Backup (12).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (12).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (120).SQL.csproj b/src/Schemio.SQL/Motley - Backup (120).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (120).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (121).SQL.csproj b/src/Schemio.SQL/Motley - Backup (121).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (121).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (122).SQL.csproj b/src/Schemio.SQL/Motley - Backup (122).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (122).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (123).SQL.csproj b/src/Schemio.SQL/Motley - Backup (123).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (123).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (124).SQL.csproj b/src/Schemio.SQL/Motley - Backup (124).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (124).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (125).SQL.csproj b/src/Schemio.SQL/Motley - Backup (125).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (125).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (126).SQL.csproj b/src/Schemio.SQL/Motley - Backup (126).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (126).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (127).SQL.csproj b/src/Schemio.SQL/Motley - Backup (127).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (127).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (128).SQL.csproj b/src/Schemio.SQL/Motley - Backup (128).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (128).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (129).SQL.csproj b/src/Schemio.SQL/Motley - Backup (129).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (129).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (13).SQL.csproj b/src/Schemio.SQL/Motley - Backup (13).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (13).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (130).SQL.csproj b/src/Schemio.SQL/Motley - Backup (130).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (130).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (131).SQL.csproj b/src/Schemio.SQL/Motley - Backup (131).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (131).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (132).SQL.csproj b/src/Schemio.SQL/Motley - Backup (132).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (132).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (133).SQL.csproj b/src/Schemio.SQL/Motley - Backup (133).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (133).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (134).SQL.csproj b/src/Schemio.SQL/Motley - Backup (134).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (134).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (135).SQL.csproj b/src/Schemio.SQL/Motley - Backup (135).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (135).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (136).SQL.csproj b/src/Schemio.SQL/Motley - Backup (136).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (136).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (137).SQL.csproj b/src/Schemio.SQL/Motley - Backup (137).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (137).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (138).SQL.csproj b/src/Schemio.SQL/Motley - Backup (138).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (138).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (139).SQL.csproj b/src/Schemio.SQL/Motley - Backup (139).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (139).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (14).SQL.csproj b/src/Schemio.SQL/Motley - Backup (14).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (14).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (140).SQL.csproj b/src/Schemio.SQL/Motley - Backup (140).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (140).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (141).SQL.csproj b/src/Schemio.SQL/Motley - Backup (141).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (141).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (142).SQL.csproj b/src/Schemio.SQL/Motley - Backup (142).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (142).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (143).SQL.csproj b/src/Schemio.SQL/Motley - Backup (143).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (143).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (144).SQL.csproj b/src/Schemio.SQL/Motley - Backup (144).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (144).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (145).SQL.csproj b/src/Schemio.SQL/Motley - Backup (145).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (145).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (146).SQL.csproj b/src/Schemio.SQL/Motley - Backup (146).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (146).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (147).SQL.csproj b/src/Schemio.SQL/Motley - Backup (147).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (147).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (148).SQL.csproj b/src/Schemio.SQL/Motley - Backup (148).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (148).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (149).SQL.csproj b/src/Schemio.SQL/Motley - Backup (149).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (149).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (15).SQL.csproj b/src/Schemio.SQL/Motley - Backup (15).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (15).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (150).SQL.csproj b/src/Schemio.SQL/Motley - Backup (150).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (150).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (151).SQL.csproj b/src/Schemio.SQL/Motley - Backup (151).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (151).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (152).SQL.csproj b/src/Schemio.SQL/Motley - Backup (152).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (152).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (153).SQL.csproj b/src/Schemio.SQL/Motley - Backup (153).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (153).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (154).SQL.csproj b/src/Schemio.SQL/Motley - Backup (154).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (154).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (155).SQL.csproj b/src/Schemio.SQL/Motley - Backup (155).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (155).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (156).SQL.csproj b/src/Schemio.SQL/Motley - Backup (156).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (156).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (157).SQL.csproj b/src/Schemio.SQL/Motley - Backup (157).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (157).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (158).SQL.csproj b/src/Schemio.SQL/Motley - Backup (158).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (158).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (159).SQL.csproj b/src/Schemio.SQL/Motley - Backup (159).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (159).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (16).SQL.csproj b/src/Schemio.SQL/Motley - Backup (16).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (16).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (160).SQL.csproj b/src/Schemio.SQL/Motley - Backup (160).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (160).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (161).SQL.csproj b/src/Schemio.SQL/Motley - Backup (161).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (161).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (162).SQL.csproj b/src/Schemio.SQL/Motley - Backup (162).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (162).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (163).SQL.csproj b/src/Schemio.SQL/Motley - Backup (163).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (163).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (164).SQL.csproj b/src/Schemio.SQL/Motley - Backup (164).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (164).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (165).SQL.csproj b/src/Schemio.SQL/Motley - Backup (165).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (165).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (166).SQL.csproj b/src/Schemio.SQL/Motley - Backup (166).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (166).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (167).SQL.csproj b/src/Schemio.SQL/Motley - Backup (167).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (167).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (168).SQL.csproj b/src/Schemio.SQL/Motley - Backup (168).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (168).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (169).SQL.csproj b/src/Schemio.SQL/Motley - Backup (169).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (169).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (17).SQL.csproj b/src/Schemio.SQL/Motley - Backup (17).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (17).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (170).SQL.csproj b/src/Schemio.SQL/Motley - Backup (170).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (170).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (171).SQL.csproj b/src/Schemio.SQL/Motley - Backup (171).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (171).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (172).SQL.csproj b/src/Schemio.SQL/Motley - Backup (172).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (172).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (173).SQL.csproj b/src/Schemio.SQL/Motley - Backup (173).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (173).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (174).SQL.csproj b/src/Schemio.SQL/Motley - Backup (174).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (174).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (175).SQL.csproj b/src/Schemio.SQL/Motley - Backup (175).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (175).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (176).SQL.csproj b/src/Schemio.SQL/Motley - Backup (176).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (176).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (177).SQL.csproj b/src/Schemio.SQL/Motley - Backup (177).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (177).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (178).SQL.csproj b/src/Schemio.SQL/Motley - Backup (178).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (178).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (179).SQL.csproj b/src/Schemio.SQL/Motley - Backup (179).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (179).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (18).SQL.csproj b/src/Schemio.SQL/Motley - Backup (18).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (18).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (180).SQL.csproj b/src/Schemio.SQL/Motley - Backup (180).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (180).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (181).SQL.csproj b/src/Schemio.SQL/Motley - Backup (181).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (181).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (182).SQL.csproj b/src/Schemio.SQL/Motley - Backup (182).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (182).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (183).SQL.csproj b/src/Schemio.SQL/Motley - Backup (183).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (183).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (184).SQL.csproj b/src/Schemio.SQL/Motley - Backup (184).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (184).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (185).SQL.csproj b/src/Schemio.SQL/Motley - Backup (185).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (185).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (186).SQL.csproj b/src/Schemio.SQL/Motley - Backup (186).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (186).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (187).SQL.csproj b/src/Schemio.SQL/Motley - Backup (187).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (187).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (188).SQL.csproj b/src/Schemio.SQL/Motley - Backup (188).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (188).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (189).SQL.csproj b/src/Schemio.SQL/Motley - Backup (189).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (189).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (19).SQL.csproj b/src/Schemio.SQL/Motley - Backup (19).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (19).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (190).SQL.csproj b/src/Schemio.SQL/Motley - Backup (190).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (190).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (191).SQL.csproj b/src/Schemio.SQL/Motley - Backup (191).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (191).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (192).SQL.csproj b/src/Schemio.SQL/Motley - Backup (192).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (192).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (193).SQL.csproj b/src/Schemio.SQL/Motley - Backup (193).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (193).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (194).SQL.csproj b/src/Schemio.SQL/Motley - Backup (194).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (194).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (195).SQL.csproj b/src/Schemio.SQL/Motley - Backup (195).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (195).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (196).SQL.csproj b/src/Schemio.SQL/Motley - Backup (196).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (196).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (197).SQL.csproj b/src/Schemio.SQL/Motley - Backup (197).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (197).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (198).SQL.csproj b/src/Schemio.SQL/Motley - Backup (198).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (198).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (199).SQL.csproj b/src/Schemio.SQL/Motley - Backup (199).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (199).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (2).SQL.csproj b/src/Schemio.SQL/Motley - Backup (2).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (2).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (20).SQL.csproj b/src/Schemio.SQL/Motley - Backup (20).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (20).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (200).SQL.csproj b/src/Schemio.SQL/Motley - Backup (200).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (200).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (201).SQL.csproj b/src/Schemio.SQL/Motley - Backup (201).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (201).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (202).SQL.csproj b/src/Schemio.SQL/Motley - Backup (202).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (202).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (203).SQL.csproj b/src/Schemio.SQL/Motley - Backup (203).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (203).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (204).SQL.csproj b/src/Schemio.SQL/Motley - Backup (204).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (204).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (205).SQL.csproj b/src/Schemio.SQL/Motley - Backup (205).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (205).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (206).SQL.csproj b/src/Schemio.SQL/Motley - Backup (206).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (206).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (207).SQL.csproj b/src/Schemio.SQL/Motley - Backup (207).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (207).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (208).SQL.csproj b/src/Schemio.SQL/Motley - Backup (208).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (208).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (209).SQL.csproj b/src/Schemio.SQL/Motley - Backup (209).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (209).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (21).SQL.csproj b/src/Schemio.SQL/Motley - Backup (21).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (21).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (210).SQL.csproj b/src/Schemio.SQL/Motley - Backup (210).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (210).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (211).SQL.csproj b/src/Schemio.SQL/Motley - Backup (211).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (211).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (212).SQL.csproj b/src/Schemio.SQL/Motley - Backup (212).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (212).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (213).SQL.csproj b/src/Schemio.SQL/Motley - Backup (213).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (213).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (214).SQL.csproj b/src/Schemio.SQL/Motley - Backup (214).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (214).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (215).SQL.csproj b/src/Schemio.SQL/Motley - Backup (215).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (215).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (216).SQL.csproj b/src/Schemio.SQL/Motley - Backup (216).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (216).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (217).SQL.csproj b/src/Schemio.SQL/Motley - Backup (217).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (217).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (218).SQL.csproj b/src/Schemio.SQL/Motley - Backup (218).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (218).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (219).SQL.csproj b/src/Schemio.SQL/Motley - Backup (219).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (219).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (22).SQL.csproj b/src/Schemio.SQL/Motley - Backup (22).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (22).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (220).SQL.csproj b/src/Schemio.SQL/Motley - Backup (220).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (220).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (221).SQL.csproj b/src/Schemio.SQL/Motley - Backup (221).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (221).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (222).SQL.csproj b/src/Schemio.SQL/Motley - Backup (222).SQL.csproj new file mode 100644 index 0000000..f8e4eb3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (222).SQL.csproj @@ -0,0 +1,54 @@ + + + + net8.0 + enable + enable + true + Schemio with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Schemio + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Schemio/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (23).SQL.csproj b/src/Schemio.SQL/Motley - Backup (23).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (23).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (24).SQL.csproj b/src/Schemio.SQL/Motley - Backup (24).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (24).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (25).SQL.csproj b/src/Schemio.SQL/Motley - Backup (25).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (25).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (26).SQL.csproj b/src/Schemio.SQL/Motley - Backup (26).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (26).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (27).SQL.csproj b/src/Schemio.SQL/Motley - Backup (27).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (27).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (28).SQL.csproj b/src/Schemio.SQL/Motley - Backup (28).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (28).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (29).SQL.csproj b/src/Schemio.SQL/Motley - Backup (29).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (29).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (3).SQL.csproj b/src/Schemio.SQL/Motley - Backup (3).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (3).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (30).SQL.csproj b/src/Schemio.SQL/Motley - Backup (30).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (30).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (31).SQL.csproj b/src/Schemio.SQL/Motley - Backup (31).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (31).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (32).SQL.csproj b/src/Schemio.SQL/Motley - Backup (32).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (32).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (33).SQL.csproj b/src/Schemio.SQL/Motley - Backup (33).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (33).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (34).SQL.csproj b/src/Schemio.SQL/Motley - Backup (34).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (34).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (35).SQL.csproj b/src/Schemio.SQL/Motley - Backup (35).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (35).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (36).SQL.csproj b/src/Schemio.SQL/Motley - Backup (36).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (36).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (37).SQL.csproj b/src/Schemio.SQL/Motley - Backup (37).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (37).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (38).SQL.csproj b/src/Schemio.SQL/Motley - Backup (38).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (38).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (39).SQL.csproj b/src/Schemio.SQL/Motley - Backup (39).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (39).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (4).SQL.csproj b/src/Schemio.SQL/Motley - Backup (4).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (4).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (40).SQL.csproj b/src/Schemio.SQL/Motley - Backup (40).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (40).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (41).SQL.csproj b/src/Schemio.SQL/Motley - Backup (41).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (41).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (42).SQL.csproj b/src/Schemio.SQL/Motley - Backup (42).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (42).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (43).SQL.csproj b/src/Schemio.SQL/Motley - Backup (43).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (43).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (44).SQL.csproj b/src/Schemio.SQL/Motley - Backup (44).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (44).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (45).SQL.csproj b/src/Schemio.SQL/Motley - Backup (45).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (45).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (46).SQL.csproj b/src/Schemio.SQL/Motley - Backup (46).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (46).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (47).SQL.csproj b/src/Schemio.SQL/Motley - Backup (47).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (47).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (48).SQL.csproj b/src/Schemio.SQL/Motley - Backup (48).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (48).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (49).SQL.csproj b/src/Schemio.SQL/Motley - Backup (49).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (49).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (5).SQL.csproj b/src/Schemio.SQL/Motley - Backup (5).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (5).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (50).SQL.csproj b/src/Schemio.SQL/Motley - Backup (50).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (50).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (51).SQL.csproj b/src/Schemio.SQL/Motley - Backup (51).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (51).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (52).SQL.csproj b/src/Schemio.SQL/Motley - Backup (52).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (52).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (53).SQL.csproj b/src/Schemio.SQL/Motley - Backup (53).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (53).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (54).SQL.csproj b/src/Schemio.SQL/Motley - Backup (54).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (54).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (55).SQL.csproj b/src/Schemio.SQL/Motley - Backup (55).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (55).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (56).SQL.csproj b/src/Schemio.SQL/Motley - Backup (56).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (56).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (57).SQL.csproj b/src/Schemio.SQL/Motley - Backup (57).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (57).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (58).SQL.csproj b/src/Schemio.SQL/Motley - Backup (58).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (58).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (59).SQL.csproj b/src/Schemio.SQL/Motley - Backup (59).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (59).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (6).SQL.csproj b/src/Schemio.SQL/Motley - Backup (6).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (6).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (60).SQL.csproj b/src/Schemio.SQL/Motley - Backup (60).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (60).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (61).SQL.csproj b/src/Schemio.SQL/Motley - Backup (61).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (61).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (62).SQL.csproj b/src/Schemio.SQL/Motley - Backup (62).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (62).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (63).SQL.csproj b/src/Schemio.SQL/Motley - Backup (63).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (63).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (64).SQL.csproj b/src/Schemio.SQL/Motley - Backup (64).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (64).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (65).SQL.csproj b/src/Schemio.SQL/Motley - Backup (65).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (65).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (66).SQL.csproj b/src/Schemio.SQL/Motley - Backup (66).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (66).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (67).SQL.csproj b/src/Schemio.SQL/Motley - Backup (67).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (67).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (68).SQL.csproj b/src/Schemio.SQL/Motley - Backup (68).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (68).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (69).SQL.csproj b/src/Schemio.SQL/Motley - Backup (69).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (69).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (7).SQL.csproj b/src/Schemio.SQL/Motley - Backup (7).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (7).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (70).SQL.csproj b/src/Schemio.SQL/Motley - Backup (70).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (70).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (71).SQL.csproj b/src/Schemio.SQL/Motley - Backup (71).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (71).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (72).SQL.csproj b/src/Schemio.SQL/Motley - Backup (72).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (72).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (73).SQL.csproj b/src/Schemio.SQL/Motley - Backup (73).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (73).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (74).SQL.csproj b/src/Schemio.SQL/Motley - Backup (74).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (74).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (75).SQL.csproj b/src/Schemio.SQL/Motley - Backup (75).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (75).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (76).SQL.csproj b/src/Schemio.SQL/Motley - Backup (76).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (76).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (77).SQL.csproj b/src/Schemio.SQL/Motley - Backup (77).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (77).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (78).SQL.csproj b/src/Schemio.SQL/Motley - Backup (78).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (78).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (79).SQL.csproj b/src/Schemio.SQL/Motley - Backup (79).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (79).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (8).SQL.csproj b/src/Schemio.SQL/Motley - Backup (8).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (8).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (80).SQL.csproj b/src/Schemio.SQL/Motley - Backup (80).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (80).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (81).SQL.csproj b/src/Schemio.SQL/Motley - Backup (81).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (81).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (82).SQL.csproj b/src/Schemio.SQL/Motley - Backup (82).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (82).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (83).SQL.csproj b/src/Schemio.SQL/Motley - Backup (83).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (83).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (84).SQL.csproj b/src/Schemio.SQL/Motley - Backup (84).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (84).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (85).SQL.csproj b/src/Schemio.SQL/Motley - Backup (85).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (85).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (86).SQL.csproj b/src/Schemio.SQL/Motley - Backup (86).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (86).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (87).SQL.csproj b/src/Schemio.SQL/Motley - Backup (87).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (87).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (88).SQL.csproj b/src/Schemio.SQL/Motley - Backup (88).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (88).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (89).SQL.csproj b/src/Schemio.SQL/Motley - Backup (89).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (89).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (9).SQL.csproj b/src/Schemio.SQL/Motley - Backup (9).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (9).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (90).SQL.csproj b/src/Schemio.SQL/Motley - Backup (90).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (90).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (91).SQL.csproj b/src/Schemio.SQL/Motley - Backup (91).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (91).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (92).SQL.csproj b/src/Schemio.SQL/Motley - Backup (92).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (92).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (93).SQL.csproj b/src/Schemio.SQL/Motley - Backup (93).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (93).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (94).SQL.csproj b/src/Schemio.SQL/Motley - Backup (94).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (94).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (95).SQL.csproj b/src/Schemio.SQL/Motley - Backup (95).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (95).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (96).SQL.csproj b/src/Schemio.SQL/Motley - Backup (96).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (96).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (97).SQL.csproj b/src/Schemio.SQL/Motley - Backup (97).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (97).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (98).SQL.csproj b/src/Schemio.SQL/Motley - Backup (98).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (98).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (99).SQL.csproj b/src/Schemio.SQL/Motley - Backup (99).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (99).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup.SQL.csproj b/src/Schemio.SQL/Motley - Backup.SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup.SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/QueryEngine.cs b/src/Schemio.SQL/QueryEngine.cs index ac0739a..ad5d168 100644 --- a/src/Schemio.SQL/QueryEngine.cs +++ b/src/Schemio.SQL/QueryEngine.cs @@ -1,4 +1,5 @@ using System.Data.Common; +using Schemio.Core; namespace Schemio.SQL { @@ -19,33 +20,22 @@ public QueryEngine(SQLConfiguration sqlConfiguration) public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; - public IEnumerable Execute(IEnumerable queries) + public Task Execute(IQuery query) { var factory = DbProviderFactories.GetFactory(sqlConfiguration.ConnectionSettings.ProviderName) ?? throw new InvalidOperationException($"Provider: {sqlConfiguration.ConnectionSettings.ProviderName} is not supported. Please register entry in DbProviderFactories "); - var batches = queries.Chunk(sqlConfiguration.QuerySettings?.QueryBatchSize ?? 10); + using (var connection = factory.CreateConnection()) + { + if (connection == null) + throw new Exception($"Failed to create connection with Provider: {sqlConfiguration.ConnectionSettings.ProviderName}. Please check the connection settings."); - var output = new List(); + connection.ConnectionString = sqlConfiguration.ConnectionSettings.ConnectionString; - foreach (var batch in batches) - using (var connection = factory.CreateConnection()) - { - if (connection == null) - throw new Exception($"Failed to create connection with Provider: {sqlConfiguration.ConnectionSettings.ProviderName}. Please check the connection settings."); + var result = ((ISQLQuery)query).Run(connection); - connection.ConnectionString = sqlConfiguration.ConnectionSettings.ConnectionString; - - foreach (var query in batch.Cast()) - { - var results = query.Run(connection); - - if (results != null && results.Any()) - output.AddRange(results); - } - } - - return output.ToArray(); + return result; + } } } } \ No newline at end of file diff --git a/src/Schemio.SQL/Schemio.SQL.csproj b/src/Schemio.SQL/Schemio.SQL.csproj index af22bed..7d4bcbd 100644 --- a/src/Schemio.SQL/Schemio.SQL.csproj +++ b/src/Schemio.SQL/Schemio.SQL.csproj @@ -19,6 +19,12 @@ LICENSE.md True True + snupkg + True + + + + True @@ -42,7 +48,7 @@ - + diff --git a/src/Schemio/BaseChildQuery.cs b/src/Schemio/BaseChildQuery.cs deleted file mode 100644 index 6bbb761..0000000 --- a/src/Schemio/BaseChildQuery.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Schemio -{ - /// - /// Implement this base class to create a dependent or child query. - /// - /// Parameter type of the query. - /// Result type of the query. - public abstract class BaseChildQuery : BaseQuery, IChildQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Implement to resolve query parameter using parent query's result. - /// - /// Data context passed in. - /// Parent Query's result. - public abstract void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult); - } -} \ No newline at end of file diff --git a/src/Schemio/BaseRootQuery.cs b/src/Schemio/BaseRootQuery.cs deleted file mode 100644 index 2d17301..0000000 --- a/src/Schemio/BaseRootQuery.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Schemio -{ - /// - /// Implement this base class to create a root (or level 1) query. - /// - /// Parameter type of the query. - /// Result type of the query. - public abstract class BaseRootQuery : BaseQuery, IRootQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Implement to resolve query parameter using data context. - /// - /// Data context. - public abstract void ResolveRootQueryParameter(IDataContext context); - } -} \ No newline at end of file diff --git a/src/Schemio/CollectionResult.cs b/src/Schemio/CollectionResult.cs deleted file mode 100644 index 02dba67..0000000 --- a/src/Schemio/CollectionResult.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Schemio -{ - public class CollectionResult : IQueryResult - { - private List list; - - public CollectionResult(List list) - { - this.list = list; - } - - public List Items - { get { return list; } } - } -} \ No newline at end of file diff --git a/src/Schemio/IChildQuery.cs b/src/Schemio/IChildQuery.cs deleted file mode 100644 index 0df26e9..0000000 --- a/src/Schemio/IChildQuery.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Schemio -{ - /// - /// Implement to create a child query. - /// - public interface IChildQuery : IQuery - { - /// - /// Implement to resolve query parameter using parent query's result. - /// - /// - /// - void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult); - } -} \ No newline at end of file diff --git a/src/Schemio/IQuery.cs b/src/Schemio/IQuery.cs deleted file mode 100644 index 5da4225..0000000 --- a/src/Schemio/IQuery.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Schemio -{ - /// - /// Implement IQuery to fetch data using API or database. - /// - public interface IQuery - { - List Children { get; set; } - - Type ResultType { get; } - - bool IsContextResolved(); - } -} \ No newline at end of file diff --git a/src/Schemio/IRootQuery.cs b/src/Schemio/IRootQuery.cs deleted file mode 100644 index 7ed12d2..0000000 --- a/src/Schemio/IRootQuery.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Schemio -{ - /// - /// Implement to create root query. - /// - public interface IRootQuery : IQuery - { - void ResolveRootQueryParameter(IDataContext context); - } -} \ No newline at end of file diff --git a/src/Schemio/ITransformExecutor.cs b/src/Schemio/ITransformExecutor.cs deleted file mode 100644 index c7f7adb..0000000 --- a/src/Schemio/ITransformExecutor.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Schemio -{ - public interface ITransformExecutor where TEntity : IEntity - { - TEntity Execute(IDataContext context, IList results); - } -} \ No newline at end of file diff --git a/src/Schemio/ServicesExtensions.cs b/src/Schemio/ServicesExtensions.cs deleted file mode 100644 index 9f2434e..0000000 --- a/src/Schemio/ServicesExtensions.cs +++ /dev/null @@ -1,126 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Schemio.Impl; -using Schemio.PathMatchers; - -namespace Schemio -{ - public static class ServicesExtensions - { - public static IServiceCollection UseSchemio(this IServiceCollection services, - ISchemioOption options) - where TEntity : IEntity, new() - { - services.AddTransient, QueryBuilder>(); - services.AddTransient, TransformExecutor>(); - services.AddTransient(); - - var schemioOptions = options?.SchemioOptions; - - if (schemioOptions?.EntitySchema == null) - throw new ArgumentException("Cannot find configured Entity Schema definition. Please pass in implementation of IEntitySchema where T is IEntity."); - - services.AddTransient(c => schemioOptions.EntitySchema(c)); - - services.AddTransient(typeof(ISchemaPathMatcher), c => schemioOptions?.SchemaPathMatcher != null ? schemioOptions?.SchemaPathMatcher(c) : new XPathMatcher()); - - if (schemioOptions?.QueryEngines == null || !schemioOptions.QueryEngines.Any()) - throw new ArgumentException("Cannot find configured Query Engines. Please pass in implementation of IQueryEngine."); - - foreach (var engine in schemioOptions.QueryEngines) - { - services.AddTransient(c => engine(c)); - } - - if (schemioOptions?.Logger != null) - services.AddTransient(typeof(ILogger>), c => schemioOptions.Logger(c)); - - // Register data provider with dependencies. - services.AddTransient>(c => - new DataProvider - ( - schemioOptions?.Logger != null ? c.GetService>>() : null, - c.GetService>(), - c.GetService(), - c.GetService>() - )); - - return services; - } - } - - public class SchemioOptions where TEntity : IEntity, new() - { - public SchemioOptions() - { - QueryEngines = new List>(); - } - - /// - /// Implementation of IEntitySchema for schema definition. - /// - public Func> EntitySchema { get; set; } - - /// - /// Custom ISchemaPathMatcher Implementation for schema path matching. Default is XPathMatcher if not provided. - /// - public Func SchemaPathMatcher { get; set; } - - /// - /// Supported query engines. List of type IQueryEngine implementation. - /// - public List> QueryEngines { get; set; } - - /// - /// Supported query engines. List of type IQueryEngine implementation. - /// - public Func>> Logger { get; set; } - } - - public class SchemioOptionsBuilder : ISchemioLogger, ISchemioEngine, ISchemioOption - where TEntity : IEntity, new() - { - public SchemioOptions SchemioOptions { get; set; } - - public ISchemioEngine AddEngine(Func queryEngine) - { - SchemioOptions.QueryEngines.Add(queryEngine); - return this; - } - - public ISchemioLogger LogWith(Func>> logger) - { - SchemioOptions.Logger = logger; - return this; - } - } - - public interface ISchemioLogger : ISchemioOption - where TEntity : IEntity, new() - { - ISchemioLogger LogWith(Func>> logger); - } - - public interface ISchemioEngine : ISchemioOption - where TEntity : IEntity, new() - { - ISchemioEngine AddEngine(Func queryEngine); - - ISchemioLogger LogWith(Func>> logger); - } - - public interface ISchemioOption where TEntity : IEntity, new() - { - SchemioOptions SchemioOptions { get; set; } - } - - public static class With - { - public static ISchemioEngine Schema(Func> entitySchema, Func schemaPathMatcher = null) where TEntity : IEntity, new() - { - var builder = new SchemioOptionsBuilder(); - builder.SchemioOptions = new SchemioOptions { EntitySchema = entitySchema, SchemaPathMatcher = schemaPathMatcher }; - return builder; - } - } -} \ No newline at end of file diff --git a/tests/Schemio.Tests/DataProvider.Tests/DataProviderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/DataProviderTests.cs similarity index 68% rename from tests/Schemio.Tests/DataProvider.Tests/DataProviderTests.cs rename to tests/Schemio.Core.Tests/DataProvider.Tests/DataProviderTests.cs index b0830a1..e8ce3c8 100644 --- a/tests/Schemio.Tests/DataProvider.Tests/DataProviderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/DataProviderTests.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.Logging; using Moq; -using Schemio.Impl; -using Schemio.Tests.EntitySetup; -using Schemio.Tests.EntitySetup.Entities; +using Schemio.Core.Impl; +using Schemio.Core.Tests.EntitySetup; +using Schemio.Core.Tests.EntitySetup.Entities; -namespace Schemio.Tests.DataProvider.Tests +namespace Schemio.Core.Tests.DataProvider.Tests { [TestFixture] internal class DataProviderTests @@ -13,7 +13,7 @@ internal class DataProviderTests private Mock>> _logger; private Mock> _queryBuilder; private Mock _queryExecutor; - private Mock> _transformExecutor; + private Mock> _entityBuilder; [SetUp] public void Setup() @@ -21,9 +21,9 @@ public void Setup() _logger = new Mock>>(); _queryBuilder = new Mock>(); _queryExecutor = new Mock(); - _transformExecutor = new Mock>(); + _entityBuilder = new Mock>(); - _provider = new DataProvider(_logger.Object, _queryBuilder.Object, _queryExecutor.Object, _transformExecutor.Object); + _provider = new DataProvider(_logger.Object, _queryBuilder.Object, _queryExecutor.Object, _entityBuilder.Object); } [Test] @@ -35,7 +35,7 @@ public void TestDataProvider() _queryBuilder.Verify(x => x.Build(It.IsAny()), Times.Once); _queryExecutor.Verify(x => x.Execute(It.IsAny(), It.IsAny()), Times.Once); - _transformExecutor.Verify(x => x.Execute(It.IsAny(), It.IsAny>()), Times.Once); + _entityBuilder.Verify(x => x.Build(It.IsAny(), It.IsAny>()), Times.Once); } } } \ No newline at end of file diff --git a/tests/Schemio.Tests/DataProvider.Tests/TransformExecutorTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs similarity index 88% rename from tests/Schemio.Tests/DataProvider.Tests/TransformExecutorTests.cs rename to tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs index 507397d..9c8aa10 100644 --- a/tests/Schemio.Tests/DataProvider.Tests/TransformExecutorTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs @@ -1,14 +1,13 @@ -using Schemio.Tests.EntitySetup; -using Schemio.Impl; -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; +using Schemio.Core.Impl; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Tests.DataProvider.Tests +namespace Schemio.Core.Tests.DataProvider.Tests { [TestFixture] - internal class TransformExecutorTests + internal class EntityBuilderTests { - private TransformExecutor _transformExecutor; + private EntityBuilder _entityBuilder; private IEntitySchema _entitySchema; private static List<(Type result, int InvocationCount)> TransformerInvocations; @@ -17,7 +16,7 @@ internal class TransformExecutorTests public void Setup() { _entitySchema = new MockCustomerSchema(); - _transformExecutor = new TransformExecutor(_entitySchema); + _entityBuilder = new EntityBuilder(_entitySchema); TransformerInvocations = new List<(Type result, int InvocationCount)>(); } @@ -32,7 +31,7 @@ public void TestTransformExecutorForCorrectExecutionOfConfiguredTransforms() new OrderItemCollectionResult() }; - var entity = _transformExecutor.Execute(new DataContext(new EntityContext()), queryList); + var entity = _entityBuilder.Build(new DataContext(new EntityContext()), queryList); var customerTransforms = TransformerInvocations.Where(x => x.result == typeof(CustomerResult)); Assert.That(customerTransforms.Count() == 1); diff --git a/tests/Schemio.Tests/DataProvider.Tests/QueryBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs similarity index 95% rename from tests/Schemio.Tests/DataProvider.Tests/QueryBuilderTests.cs rename to tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs index c5db662..8838c45 100644 --- a/tests/Schemio.Tests/DataProvider.Tests/QueryBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs @@ -1,11 +1,11 @@ -using Schemio.Impl; -using Schemio.PathMatchers; -using Schemio.Tests.EntitySetup; -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.EntitySchemas; -using Schemio.Tests.EntitySetup.Queries; - -namespace Schemio.Tests.DataProvider.Tests +using Schemio.Core.Impl; +using Schemio.Core.PathMatchers; +using Schemio.Core.Tests.EntitySetup; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.EntitySchemas; +using Schemio.Core.Tests.EntitySetup.Queries; + +namespace Schemio.Core.Tests.DataProvider.Tests { [TestFixture] internal class QueryBuilderTests diff --git a/tests/Schemio.Tests/DataProvider.Tests/QueryExecutorTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs similarity index 70% rename from tests/Schemio.Tests/DataProvider.Tests/QueryExecutorTests.cs rename to tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs index ede3cd3..fe87bf5 100644 --- a/tests/Schemio.Tests/DataProvider.Tests/QueryExecutorTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs @@ -1,12 +1,12 @@ using Moq; -using Schemio.Impl; -using Schemio.PathMatchers; -using Schemio.Tests.EntitySetup; -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.EntitySchemas; -using Schemio.Tests.EntitySetup.Queries; - -namespace Schemio.Tests.DataProvider.Tests +using Schemio.Core.Impl; +using Schemio.Core.PathMatchers; +using Schemio.Core.Tests.EntitySetup; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.EntitySchemas; +using Schemio.Core.Tests.EntitySetup.Queries; + +namespace Schemio.Core.Tests.DataProvider.Tests { [TestFixture] internal class QueryExecutorTests @@ -28,7 +28,7 @@ public void TestQueryExecutorToReturnWhenNoQueries() { _queryExecutor.Execute(new DataContext(new EntityContext()), new QueryList()); - _queryEngine.Verify(x => x.Execute(It.IsAny>()), Times.Never()); + _queryEngine.Verify(x => x.Execute(It.IsAny()), Times.Never()); } [Test] @@ -36,7 +36,7 @@ public void TestQueryExecutorToCallEngineWhenQueriesExistForExecution() { _queryExecutor.Execute(new DataContext(new EntityContext()), new QueryList(new[] { new CustomerQuery() }) { }); - _queryEngine.Verify(x => x.Execute(It.IsAny>()), Times.Once()); + _queryEngine.Verify(x => x.Execute(It.IsAny()), Times.Once()); } [Test] // TODO - All sequence assertions @@ -47,7 +47,7 @@ public void TestQueryExecutorToExecuteConfiguredQueriesInCorrectOrder() _queryExecutor.Execute(new DataContext(new EntityContext()), querList); - _queryEngine.Verify(x => x.Execute(It.IsAny>()), Times.Once()); + _queryEngine.Verify(x => x.Execute(It.IsAny()), Times.Once()); } } } \ No newline at end of file diff --git a/tests/Schemio.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs similarity index 79% rename from tests/Schemio.Tests/EntitySetup/CustomerContext.cs rename to tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs index 65fdaba..9a98422 100644 --- a/tests/Schemio.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup +namespace Schemio.Core.Tests.EntitySetup { internal class CustomerContext : IEntityContext { diff --git a/tests/Schemio.Tests/EntitySetup/Entities/Address.cs b/tests/Schemio.Core.Tests/EntitySetup/Entities/Address.cs similarity index 85% rename from tests/Schemio.Tests/EntitySetup/Entities/Address.cs rename to tests/Schemio.Core.Tests/EntitySetup/Entities/Address.cs index 76d5b62..db8a8c9 100644 --- a/tests/Schemio.Tests/EntitySetup/Entities/Address.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Entities/Address.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Entities +namespace Schemio.Core.Tests.EntitySetup.Entities { public class Address { diff --git a/tests/Schemio.Tests/EntitySetup/Entities/Communication.cs b/tests/Schemio.Core.Tests/EntitySetup/Entities/Communication.cs similarity index 81% rename from tests/Schemio.Tests/EntitySetup/Entities/Communication.cs rename to tests/Schemio.Core.Tests/EntitySetup/Entities/Communication.cs index 16dd320..68a39d9 100644 --- a/tests/Schemio.Tests/EntitySetup/Entities/Communication.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Entities/Communication.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Entities +namespace Schemio.Core.Tests.EntitySetup.Entities { public class Communication { diff --git a/tests/Schemio.Tests/EntitySetup/Entities/Customer.cs b/tests/Schemio.Core.Tests/EntitySetup/Entities/Customer.cs similarity index 84% rename from tests/Schemio.Tests/EntitySetup/Entities/Customer.cs rename to tests/Schemio.Core.Tests/EntitySetup/Entities/Customer.cs index 00c37b9..66b751f 100644 --- a/tests/Schemio.Tests/EntitySetup/Entities/Customer.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Entities/Customer.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Entities +namespace Schemio.Core.Tests.EntitySetup.Entities { public class Customer : IEntity { diff --git a/tests/Schemio.Tests/EntitySetup/Entities/EntityDiagram.cd b/tests/Schemio.Core.Tests/EntitySetup/Entities/EntityDiagram.cd similarity index 100% rename from tests/Schemio.Tests/EntitySetup/Entities/EntityDiagram.cd rename to tests/Schemio.Core.Tests/EntitySetup/Entities/EntityDiagram.cd diff --git a/tests/Schemio.Tests/EntitySetup/Entities/Order.cs b/tests/Schemio.Core.Tests/EntitySetup/Entities/Order.cs similarity index 80% rename from tests/Schemio.Tests/EntitySetup/Entities/Order.cs rename to tests/Schemio.Core.Tests/EntitySetup/Entities/Order.cs index 7daffaf..9f3a70e 100644 --- a/tests/Schemio.Tests/EntitySetup/Entities/Order.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Entities/Order.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Entities +namespace Schemio.Core.Tests.EntitySetup.Entities { public class Order { diff --git a/tests/Schemio.Tests/EntitySetup/Entities/OrderItem.cs b/tests/Schemio.Core.Tests/EntitySetup/Entities/OrderItem.cs similarity index 76% rename from tests/Schemio.Tests/EntitySetup/Entities/OrderItem.cs rename to tests/Schemio.Core.Tests/EntitySetup/Entities/OrderItem.cs index aaad668..99616a1 100644 --- a/tests/Schemio.Tests/EntitySetup/Entities/OrderItem.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Entities/OrderItem.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Entities +namespace Schemio.Core.Tests.EntitySetup.Entities { public class OrderItem { diff --git a/tests/Schemio.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs similarity index 81% rename from tests/Schemio.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs rename to tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 8e856d2..80e0148 100644 --- a/tests/Schemio.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -1,8 +1,8 @@ -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; -using Schemio.Tests.EntitySetup.Transforms; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Transforms; -namespace Schemio.Tests.EntitySetup.EntitySchemas +namespace Schemio.Core.Tests.EntitySetup.EntitySchemas { internal class CustomerSchema : BaseEntitySchema { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CommunicationResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs similarity index 89% rename from tests/Schemio.Tests/EntitySetup/Queries/CommunicationResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs index 9b01aed..e001516 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CommunicationResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { public class CommunicationResult : IQueryResult { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs similarity index 51% rename from tests/Schemio.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs index 8eafe6c..a478296 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs @@ -1,8 +1,8 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { - internal class CustomerCommunicationQuery : BaseChildQuery + internal class CustomerCommunicationQuery : BaseQuery { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs similarity index 54% rename from tests/Schemio.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs index d1c3f8c..1143919 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs @@ -1,8 +1,8 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { - internal class CustomerOrderItemsQuery : BaseChildQuery> + internal class CustomerOrderItemsQuery : BaseQuery> { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. var ordersResult = (OrderCollectionResult)parentQueryResult; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs new file mode 100644 index 0000000..59c5b0c --- /dev/null +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs @@ -0,0 +1,10 @@ +namespace Schemio.Core.Tests.EntitySetup.Queries +{ + internal class CustomerOrdersQuery : BaseQuery> + { + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + { + // Does not execute as child to any query. + } + } +} \ No newline at end of file diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerParameter.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs similarity index 68% rename from tests/Schemio.Tests/EntitySetup/Queries/CustomerParameter.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs index 364e1e9..89b0ec0 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerParameter.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { public class CustomerParameter : IQueryParameter { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs similarity index 54% rename from tests/Schemio.Tests/EntitySetup/Queries/CustomerQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs index dd726ed..ad35bb6 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs @@ -1,8 +1,8 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { - public class CustomerQuery : BaseRootQuery + public class CustomerQuery : BaseQuery { - public override void ResolveRootQueryParameter(IDataContext context) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs similarity index 80% rename from tests/Schemio.Tests/EntitySetup/Queries/CustomerResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs index 3a59062..83c141d 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { public class CustomerResult : IQueryResult { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/OrderCollectionResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs similarity index 87% rename from tests/Schemio.Tests/EntitySetup/Queries/OrderCollectionResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs index 11a5c45..6642402 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/OrderCollectionResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { public class OrderCollectionResult : IQueryResult { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs similarity index 85% rename from tests/Schemio.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs index 74f2c51..11fc936 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { public class OrderItemCollectionResult : IQueryResult { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/OrderItemParameter.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs similarity index 69% rename from tests/Schemio.Tests/EntitySetup/Queries/OrderItemParameter.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs index 31bf45a..cd287fe 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/OrderItemParameter.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { internal class OrderItemParameter : IQueryParameter { diff --git a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs similarity index 85% rename from tests/Schemio.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs index 8b11ff7..df2bce9 100644 --- a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs @@ -1,7 +1,7 @@ -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Transforms { public class CustomerCommunicationTransform : BaseTransformer { diff --git a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs similarity index 69% rename from tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs index d784624..7e60442 100644 --- a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs @@ -1,16 +1,16 @@ -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Transforms { public class CustomerOrderItemsTransform : BaseTransformer, Customer> { public override void Transform(CollectionResult queryResult, Customer entity) { - if (queryResult?.Items == null || entity?.Orders == null) + if (queryResult == null || entity?.Orders == null) return; - foreach (var item in queryResult.Items.Where(x => x.Items != null)) + foreach (var item in queryResult.Where(x => x.Items != null)) foreach (var order in entity.Orders) if (order.OrderId == item.OrderId) order.Items = item.Items.Select(x => new OrderItem diff --git a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs similarity index 64% rename from tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs index 0fa7f47..40fda5a 100644 --- a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs @@ -1,17 +1,17 @@ -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Transforms { public class CustomerOrdersTransform : BaseTransformer, Customer> { public override void Transform(CollectionResult queryResult, Customer entity) { - if (queryResult?.Items == null) + if (queryResult == null) return; var customer = entity ?? new Customer(); - customer.Orders = queryResult.Items.Select(x => new Order + customer.Orders = queryResult.Select(x => new Order { Date = x.Date, OrderId = x.OrderId, diff --git a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs similarity index 73% rename from tests/Schemio.Tests/EntitySetup/Transforms/CustomerTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs index 4b29529..86c8377 100644 --- a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs @@ -1,7 +1,7 @@ -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Transforms { public class CustomerTransform : BaseTransformer { diff --git a/tests/Schemio.Tests/Schemio.Tests.csproj b/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj similarity index 89% rename from tests/Schemio.Tests/Schemio.Tests.csproj rename to tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj index dcc5ad6..5e102b1 100644 --- a/tests/Schemio.Tests/Schemio.Tests.csproj +++ b/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj @@ -18,8 +18,10 @@ - + + + diff --git a/tests/Schemio.Tests/UnitTest1.cs b/tests/Schemio.Core.Tests/UnitTest1.cs similarity index 86% rename from tests/Schemio.Tests/UnitTest1.cs rename to tests/Schemio.Core.Tests/UnitTest1.cs index 8ed042a..460dce4 100644 --- a/tests/Schemio.Tests/UnitTest1.cs +++ b/tests/Schemio.Core.Tests/UnitTest1.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests +namespace Schemio.Core.Tests { public class Tests { diff --git a/tests/Schemio.Tests/Usings.cs b/tests/Schemio.Core.Tests/Usings.cs similarity index 100% rename from tests/Schemio.Tests/Usings.cs rename to tests/Schemio.Core.Tests/Usings.cs diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index 5f852bc..7c77be4 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; +using Schemio.Core; +using Schemio.Core.PathMatchers; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas; @@ -22,9 +23,9 @@ public void Setup() services.AddLogging(); - services.UseSchemio(With.Schema(c => new CustomerSchema()) - .AddEngine(c => new QueryEngine(c.GetService>())) - .LogWith(c => new Logger>(c.GetService()))); + services.UseSchemio(new XPathMatcher(), + c => new QueryEngine(c.GetService>())) + .AddEntitySchema(); // 4. Build the service provider _serviceProvider = services.BuildServiceProvider(); diff --git a/tests/Schemio.EntityFramework.Tests/Customer.db b/tests/Schemio.EntityFramework.Tests/Customer.db index 59c0139840748d01184570b908e222f5ce6518f9..1d5c292d0c3996d1828f44ae5327d6939d33cd48 100644 GIT binary patch delta 96 zcmZo@U}|V!njp<6IZ?)$QF3F#GJUpC2?Xvt_`X<=?=YGQ0; tn46iGmzk _provider; @@ -23,7 +25,7 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() }); Assert.IsNotNull(customer); - Assert.That("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@schemio.com\",\"Address\":{\"AddressId\":1,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"2021-10-22T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}", Is.EqualTo(customer.ToJson())); + Assert.That("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@gmail.com\",\"Address\":{\"AddressId\":1,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"2021-10-22T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}", Is.EqualTo(customer.ToJson())); } [Test] diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs index 00b33f5..9339619 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup { internal class CustomerContext : IEntityContext diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/Entities/Customer.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/Entities/Customer.cs index 8f3c8d7..4cce91d 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/Entities/Customer.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/Entities/Customer.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup.Entities { public class Customer : IEntity diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 5e030f2..48f4494 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -1,3 +1,4 @@ +using Schemio.Core; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs index 815f7f4..97746a9 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { [CacheResult] diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs index b7fe417..2761d62 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs @@ -1,11 +1,12 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; using Schemio.EntityFramework.Tests.Domain; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerCommunicationQuery : BaseSQLChildQuery + internal class CustomerCommunicationQuery : BaseSQLQuery { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; @@ -15,9 +16,9 @@ public override void ResolveChildQueryParameter(IDataContext context, IQueryResu }; } - public override IEnumerable Run(DbContext dbContext) + public override Task Run(DbContext dbContext) { - return dbContext.Set() + var result = dbContext.Set() .Where(p => p.Customer.Id == QueryParameter.CustomerId) .Select(c => new CommunicationResult { @@ -30,8 +31,9 @@ public override IEnumerable Run(DbContext dbContext) Region = c.Address.Region, PostalCode = c.Address.PostalCode, Country = c.Address.Country - }); - ; + }).FirstOrDefault(); + + return Task.FromResult((IQueryResult)result); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs index ed5799d..c245074 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs @@ -1,22 +1,25 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; using Schemio.EntityFramework.Tests.Domain; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrderItemsQuery : BaseSQLChildQuery + internal class CustomerOrderItemsQuery : BaseSQLQuery> { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. - var ordersResult = (CustomerOrderResult)parentQueryResult; + var ordersResults = (CollectionResult)parentQueryResult; QueryParameter ??= new OrderItemParameter(); - QueryParameter.OrderIds.Add(ordersResult.OrderId); + var orderIds = ordersResults?.Select(o => o.OrderId); + if (orderIds != null) + QueryParameter.OrderIds.AddRange(orderIds); } - public override IEnumerable Run(DbContext dbContext) + public override Task Run(DbContext dbContext) { - return dbContext.Set() + var items = dbContext.Set() .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) .Select(c => new OrderItemResult { @@ -24,8 +27,10 @@ public override IEnumerable Run(DbContext dbContext) Name = c.Name, Cost = c.Cost, OrderId = c.Order.OrderId - }); - ; + }) + .ToList(); + + return Task.FromResult((IQueryResult)new CollectionResult(items)); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs index ae22cdb..65769c5 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { public class CustomerOrderResult : IQueryResult diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs index 23383c3..e775e0f 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs @@ -1,11 +1,12 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; using Schemio.EntityFramework.Tests.Domain; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrdersQuery : BaseSQLChildQuery + internal class CustomerOrdersQuery : BaseSQLQuery> { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; @@ -15,9 +16,9 @@ public override void ResolveChildQueryParameter(IDataContext context, IQueryResu }; } - public override IEnumerable Run(DbContext dbContext) + public override Task Run(DbContext dbContext) { - return dbContext.Set() + var items = dbContext.Set() .Where(p => p.Customer.Id == QueryParameter.CustomerId) .Select(c => new CustomerOrderResult { @@ -26,7 +27,8 @@ public override IEnumerable Run(DbContext dbContext) Date = c.Date, OrderNo = c.OrderNo }); - ; + + return Task.FromResult((IQueryResult)new CollectionResult(items)); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs index a36544f..314ffec 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs @@ -1,4 +1,6 @@ -namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries +using Schemio.Core; + +namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { public class CustomerParameter : IQueryParameter { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index 2540252..0a90b2f 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -1,11 +1,12 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; using Schemio.EntityFramework.Tests.Domain; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLRootQuery + public class CustomerQuery : BaseSQLQuery { - public override void ResolveRootQueryParameter(IDataContext context) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; @@ -15,16 +16,19 @@ public override void ResolveRootQueryParameter(IDataContext context) }; } - public override IEnumerable Run(DbContext dbContext) + public override Task Run(DbContext dbContext) { - return dbContext.Set() + var result = dbContext.Set() .Where(c => c.Id == QueryParameter.CustomerId) .Select(c => new CustomerResult { Id = c.Id, Name = c.Name, Code = c.Code - }); + }) + .FirstOrDefault(); + + return Task.FromResult((IQueryResult)result); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs index 34df022..1260b75 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { public class CustomerResult : IQueryResult diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs index 76f4cbd..7150937 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs @@ -1,4 +1,5 @@ -using Schemio.Helpers; +using Schemio.Core; +using Schemio.Core.Helpers; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs index f4c2bbe..ccb1406 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { public class OrderItemResult : IQueryResult diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs index 5eae75d..fd7c1bb 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs @@ -1,3 +1,4 @@ +using Schemio.Core; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs index 091f021..1f944c1 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs @@ -1,6 +1,7 @@ +using Schemio.Core; +using Schemio.Core.Helpers; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; -using Schemio.Helpers; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs index d46456d..9996c27 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs @@ -1,6 +1,7 @@ +using Schemio.Core; +using Schemio.Core.Helpers; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; -using Schemio.Helpers; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs index e970e19..dd05b2f 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs @@ -1,3 +1,4 @@ +using Schemio.Core; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index 885502a..a6ae7f3 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -1,7 +1,8 @@ using System.Data.Common; using Microsoft.Data.Sqlite; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; +using Schemio.Core; +using Schemio.Core.PathMatchers; using Schemio.SQL; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas; @@ -26,9 +27,8 @@ public void Setup() services.AddLogging(); - services.UseSchemio(With.Schema(c => new CustomerSchema()) - .AddEngine(c => new QueryEngine(configuration)) - .LogWith(c => new Logger>(c.GetService()))); + services.UseSchemio(new XPathMatcher(), c => new QueryEngine(configuration)) + .AddEntitySchema(); // 4. Build the service provider _serviceProvider = services.BuildServiceProvider(); diff --git a/tests/Schemio.SQL.Tests/Customer.db b/tests/Schemio.SQL.Tests/Customer.db index 59c0139840748d01184570b908e222f5ce6518f9..1d5c292d0c3996d1828f44ae5327d6939d33cd48 100644 GIT binary patch delta 96 zcmZo@U}|V!njp<6IZ?)$QF3F#GJUpC2?Xvt_`X<=?=YGQ0; tn46iGmzk)_provider).GetData(context); Assert.IsNotNull(customer); - Assert.That(customer.ToJson(), Is.EqualTo("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@schemio.com\",\"Address\":{\"AddressId\":0,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"0001-01-01T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}")); + Assert.That(customer.ToJson(), Is.EqualTo("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@gmail.com\",\"Address\":{\"AddressId\":0,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"0001-01-01T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}")); Assert.That(context.Cache, Is.Not.Null); Assert.That(context.Cache.Count, Is.EqualTo(1)); diff --git a/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs index c9975bb..08db7e7 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup { internal class CustomerContext : IEntityContext diff --git a/tests/Schemio.SQL.Tests/EntitySetup/Entities/Customer.cs b/tests/Schemio.SQL.Tests/EntitySetup/Entities/Customer.cs index c46d25b..772c668 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/Entities/Customer.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/Entities/Customer.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup.Entities { public class Customer : IEntity diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 8c55751..e039c96 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -1,3 +1,4 @@ +using Schemio.Core; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms; @@ -11,10 +12,10 @@ public override IEnumerable> GetSchema() return CreateSchema.For() .Map(For.Paths("customer"), customer => customer.Dependents - .Map(For.Paths("customer/communication")) - .Map(For.Paths("customer/orders"), + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents - .Map(For.Paths("customer/orders/order/items"))) + .Map(For.Paths("customer/orders/order/items"))) ).Create(); } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs index 9080774..f19348b 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { [CacheResult] diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs index f9b9263..83ebd33 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs @@ -1,11 +1,12 @@ using System.Data; using Dapper; +using Schemio.Core; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerCommunicationQuery : BaseSQLChildQuery + internal class CustomerCommunicationQuery : BaseSQLQuery { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; @@ -15,9 +16,9 @@ public override void ResolveChildQueryParameter(IDataContext context, IQueryResu }; } - public override IEnumerable Execute(IDbConnection conn) + public override Task Run(IDbConnection conn) { - return conn.Query(new CommandDefinition + return conn.QueryFirstOrDefaultAsync(new CommandDefinition ( "select c.CommunicationId as Id, " + "c.Phone as Telephone, " + diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs index 8542c78..c2d3b98 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs @@ -1,22 +1,23 @@ using System.Data; using Dapper; +using Schemio.Core; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrderItemsQuery : BaseSQLChildQuery + internal class CustomerOrderItemsQuery : BaseSQLQuery> { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child query to order query taking OrderResult to resolve query parameter. - var ordersResult = (OrderResult)parentQueryResult; + var ordersResult = (CollectionResult)parentQueryResult; QueryParameter ??= new OrderItemParameter(); - QueryParameter.OrderIds.Add(ordersResult.OrderId); + QueryParameter.OrderIds.AddRange(ordersResult.Select(o => o.OrderId)); } - public override IEnumerable Execute(IDbConnection conn) + public override async Task> Run(IDbConnection conn) { - return conn.Query(new CommandDefinition + var items = await conn.QueryAsync(new CommandDefinition ( "select OrderId, " + "OrderItemId as ItemId, " + @@ -24,6 +25,8 @@ public override IEnumerable Execute(IDbConnection conn) "Cost " + $"from TOrderItem where OrderId in ({QueryParameter.ToCsv()})" )); + + return new CollectionResult(items); } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs index b76f4de..3e4fbf3 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs @@ -1,11 +1,12 @@ using System.Data; using Dapper; +using Schemio.Core; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrdersQuery : BaseSQLChildQuery + internal class CustomerOrdersQuery : BaseSQLQuery> { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; @@ -15,9 +16,9 @@ public override void ResolveChildQueryParameter(IDataContext context, IQueryResu }; } - public override IEnumerable Execute(IDbConnection conn) + public override async Task> Run(IDbConnection conn) { - return conn.Query(new CommandDefinition + var items = await conn.QueryAsync(new CommandDefinition ( "select OrderId, " + "OrderNo, " + @@ -25,6 +26,8 @@ public override IEnumerable Execute(IDbConnection conn) "from TOrder " + $"where customerId={QueryParameter.CustomerId}" )); + + return new CollectionResult(items); } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs index 94c68e8..1a0c34d 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs @@ -1,4 +1,6 @@ -namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries +using Schemio.Core; + +namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { public class CustomerParameter : IQueryParameter { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index 3b7d18a..ddefdbc 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -1,11 +1,12 @@ using System.Data; using Dapper; +using Schemio.Core; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLRootQuery + public class CustomerQuery : BaseSQLQuery { - public override void ResolveRootQueryParameter(IDataContext context) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; @@ -15,9 +16,9 @@ public override void ResolveRootQueryParameter(IDataContext context) }; } - public override IEnumerable Execute(IDbConnection conn) + public override Task Run(IDbConnection conn) { - return conn.Query(new CommandDefinition + return conn.QueryFirstOrDefaultAsync(new CommandDefinition ( "select CustomerId as Id, " + "Customer_Name as Name," + diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs index 34e9064..78891f1 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { public class CustomerResult : IQueryResult diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs index 5dc9249..4a07efb 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs @@ -1,4 +1,5 @@ -using Schemio.Helpers; +using Schemio.Core; +using Schemio.Core.Helpers; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs index e4605c6..58baec3 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { public class OrderItemResult : IQueryResult diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs index d04050e..5cba520 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { public class OrderResult : IQueryResult diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs similarity index 89% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs index 94c5beb..40a8f30 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs @@ -1,9 +1,10 @@ +using Schemio.Core; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms { - public class CustomerCommunicationTransform : BaseTransformer + public class CommunicationTransform : BaseTransformer { public override void Transform(CommunicationResult queryResult, Customer entity) { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs deleted file mode 100644 index 99098fe..0000000 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Schemio.Helpers; -using Schemio.SQL.Tests.EntitySetup.Entities; -using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; - -namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms -{ - public class CustomerOrderItemsTransform : BaseTransformer - { - public override void Transform(OrderItemResult queryResult, Customer entity) - { - if (queryResult == null || entity?.Orders == null) - return; - - foreach (var order in entity.Orders) - if (order.OrderId == queryResult.OrderId) - { - order.Items = ArrayUtil.EnsureAndResizeArray(order.Items, out var index); - order.Items[index] = new OrderItem - { - ItemId = queryResult.ItemId, - Name = queryResult.Name, - Cost = queryResult.Cost - }; - } - } - } -} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs deleted file mode 100644 index c88c789..0000000 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Schemio.Helpers; -using Schemio.SQL.Tests.EntitySetup.Entities; -using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; - -namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms -{ - public class CustomerOrdersTransform : BaseTransformer - { - public override void Transform(OrderResult queryResult, Customer entity) - { - if (queryResult == null) - return; - - var customer = entity ?? new Customer(); - - customer.Orders = ArrayUtil.EnsureAndResizeArray(customer.Orders, out var index); - - customer.Orders[index] = new Order - { - Date = queryResult.Date, - OrderId = queryResult.OrderId, - OrderNo = queryResult.OrderNo - }; - } - } -} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs index 10758db..5866926 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs @@ -1,3 +1,4 @@ +using Schemio.Core; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs new file mode 100644 index 0000000..8d06010 --- /dev/null +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs @@ -0,0 +1,31 @@ +using Schemio.Core; +using Schemio.Core.Helpers; +using Schemio.SQL.Tests.EntitySetup.Entities; +using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; + +namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms +{ + public class OrderItemsTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer customer) + { + if (collectionResult == null || !collectionResult.Any() || customer.Orders == null) + return; + + foreach (var result in collectionResult) + { + var order = customer.Orders.FirstOrDefault(o => o.OrderId == result.OrderId); + if (order == null) + continue; + + order.Items = ArrayUtil.EnsureAndResizeArray(order.Items, out var index); + order.Items[index] = new OrderItem + { + ItemId = result.ItemId, + Name = result.Name, + Cost = result.Cost + }; + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs new file mode 100644 index 0000000..4452dea --- /dev/null +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -0,0 +1,30 @@ +using Schemio.Core; +using Schemio.Core.Helpers; +using Schemio.SQL.Tests.EntitySetup.Entities; +using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; + +namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms +{ + public class OrdersTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer contract) + { + if (collectionResult == null || !collectionResult.Any()) + return; + + var customer = contract ?? new Customer(); + + customer.Orders = new Order[collectionResult.Count]; + + for (var index = 0; index < collectionResult.Count; index++) + { + customer.Orders[index] = new Order + { + Date = collectionResult[index].Date, + OrderId = collectionResult[index].OrderId, + OrderNo = collectionResult[index].OrderNo + }; + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs b/tests/Schemio.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs deleted file mode 100644 index 9f40565..0000000 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Schemio.Tests.EntitySetup.Queries -{ - internal class CustomerOrdersQuery : BaseChildQuery> - { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) - { - // Does not execute as child to any query. - } - } -} \ No newline at end of file From 7c7b4d4e946f3a12b9b784fb6b5186571cd8be75 Mon Sep 17 00:00:00 2001 From: Ninja Date: Sat, 9 Nov 2024 15:36:04 +0000 Subject: [PATCH 02/64] - Update ReadMe --- README.md | 535 +++--------------------------------------------------- 1 file changed, 28 insertions(+), 507 deletions(-) diff --git a/README.md b/README.md index 449adf7..35bbb60 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ -# ninja Schemio v1.0 -[![NuGet version](https://badge.fury.io/nu/Schemio.Core.svg)](https://badge.fury.io/nu/Schemio.Core) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/CodeShayk/Schemio/blob/master/LICENSE.md) +# ninja Schemio v2.0 +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/CodeShayk/Schemio/blob/master/LICENSE.md) [![Master-Build](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml) [![GitHub Release](https://img.shields.io/github/v/release/CodeShayk/Schemio?logo=github&sort=semver)](https://github.com/CodeShayk/Schemio/releases/latest) [![Master-CodeQL](https://github.com/CodeShayk/Schemio/actions/workflows/Master-CodeQL.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Master-CodeQL.yml) [![.Net 8.0](https://img.shields.io/badge/.Net-8.0-blue)](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) -- -> #### Nuget Packages ->i. `Schemio.Core` - Provides `core` functionality to configure nested queries and transformers. With ability to map schema paths (XPath/JSONPath) to entity's object graph. `No QueryEngine` provided and requires implementing IQueryEngine to execute IQuery instances. -> ->ii. `Schemio.SQL` - Provides schemio with query engine using `Dapper` to execute SQL queries. -> ->iii. `Schemio.EntityFramework` - Provides schemio with `Entity Framework` query engine to execute queries using DbContext. + #### Nuget Packages +| Latest | Details | +| -------- | --------| +| ![NuGet Version](https://img.shields.io/nuget/v/Schemio.Core?style=for-the-badge&label=Schemio.Core&labelColor=green) | Provides `core` functionality to configure nested queries and transformers. With ability to map schema paths (XPath/JSONPath) to entity's object graph. `No QueryEngine` provided and requires implementing IQueryEngine to execute IQuery instances. | +| ![NuGet Version](https://img.shields.io/nuget/v/Schemio.SQL?style=for-the-badge&label=Schemio.SQL&labelColor=green) | Provides schemio with query engine using Dapper to execute SQL queries. | +|![NuGet Version](https://img.shields.io/nuget/v/Schemio.EntityFramework?style=for-the-badge&label=Schemio.EntityFramework&labelColor=green) | Provides schemio with `Entity Framework` query engine to execute queries using DbContext. | ## Concept ### What is Schemio? @@ -26,519 +26,40 @@ Few example schemio use cases that require the service tier to dynamically fetch > - Content Management Systems > - Many more -## How to use Schemio? -To use schemio you need to -> Step 1 - Setup the entity to be fetched. -> -> Step 2 - Construct the `DataProvider` with required dependencies. +## Getting Started? +### i. Installation +Install the latest nuget package as appropriate for Core, SQL using Dapper or EntityFramework using commands below. -### Step 1. Entity Setup -Setting up an entity includes the following. -* Define the `entity` to be fetched using `DataProvider` - which is basically a class with entire object graph (with nested typed properties). -* Define the `entity schema` which is schema path mapping of the entire entity object graph. Each mapping consists of a `query` and `transformer` pair mapped to a sections of object graph (using XPaths or JsonPath for schema paths) - -#### 1.1 Entity -To mark the class as Entity, implement the class from `IEntity` interface. -Bear in mind this is the root entity to be fetched. - ->Below is an example `Customer` entity. -> -> ``` -> public class Customer : IEntity -> { -> public int CustomerId { get; set; } -> public string CustomerCode { get; set; } -> public string CustomerName { get; set; } -> public Communication Communication { get; set; } -> public Order[] Orders { get; set; } -> } -> ``` - -For the customer class, we can see there are three levels of nesting in the object graph. -- Level 1 with paths: `Customer` -- Level 2 with paths: `Customer.Communication` and `Customer.Orders` -- Level 3 with paths: `Customer.Orders.Items` - -If we choose XML Schema Definition (XSD) for the object schema of the above Customer class fo mapping with XPATHs -then below is the Customer XSD and XPaths for different nesting levels. - -> Customer XSD is -> ``` -> Coming soon... -> ``` - -> Schema mappings using XPaths are -> ``` -> - Level 1 with XPath: Customer -> - Level 2 with XPaths: Customer/Communication and Customer/Orders -> - Level 3 with XPath: Customer/Orders/Order/Items/Item - -#### 1.2 Entity Schema Definition -Define entity schema definition for the entity in context. - -* `Entity schema definition` is basically a configuration with hierarchy of `query/transformer` pairs mapped to the schema paths pointing to different levels of the entity's object graph. -* `Query` is an implementation to fetch data for a certain section of object graph from an underlying data storage. -* `Transformer` is an implementation to map the data fetched by the linked query to the relevant sections of the entity's object graph. - -To define Entity schema, implement `BaseEntitySchema` interface where T is entity in context. - -> -Example Entity Schema Definition (using XPaths) -> The `Customer` entity with `three` levels of `nesting` is configured below in `CustomerSchema` definition to show `query/transformer` pairs nested accordingly mapping to object graph using the XPath definitions. -> -> ``` -> internal class CustomerSchema : BaseEntitySchema -> { -> public override IEnumerable> GetSchema() -> { -> return CreateSchema.For() -> .Map(For.Paths("customer"), -> customer => customer.Dependents -> .Map(For.Paths("customer/communication")) -> .Map(For.Paths("customer/orders"), -> customerOrders => customerOrders.Dependents -> .Map(For.Paths("customer/orders/order/items"))) -> ).Create(); -> } -> } ->``` - -##### i. Query/Transformer Mapping -Every `Query` type in the `EntitySchema` definition should have a complementing `Transformer` type. -You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. - ->Below is the snippet from `CustomerSchema` definition. ->``` -> .Map(For.Paths("customer", "customer/code", "customer/name")) ->``` - -##### ii. Nested Query/Transformer Mappings -* You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query paramter. -* The query/transformer mappings can be `nested` to `5` levels down. -* When certain `schema paths` are included in the DataProvider `request` to fetch the Entity, the relevant query and transformer pairs get executed in the order of their nesting to hydrate the entity. - ->Example nesting of Communication query under Customer query. ->``` -> .Map(For.Paths("customer"), -- Parent -> customer => customer.Dependents -> .Map(For.Paths("customer/communication")) -- Child ->``` - - -Please see the execution sequence below for queries and transformers nested in CustomerSchema implemented above. - -image - - -`Please Note:` If you need to support custom schema language for mapping the object graph, then see extending schemio section below. - - -#### 1.2.1 Query Class -The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. - -QueryEngine is an implementation of `IQueryEngine` to execute queries against a supported data storage to return a collection of query results (ie. of type IQueryResult). - -As explained above, You can configure a query in `Parent` or `Child` (nested) mode in nested hierarchies. - -i. Parent Query - -To define a `parent` or `root` query which is usually configured at level 1 to query the root entity, derive from `BaseQuery` -* `TQueryParameter` is basically the class that holds the `inputs` required by the root query for execution. It is an implementation of `IQueryParameter` type. -* `TQueryResult` is the result that will be returned from executing the root query. It is an implementation of `IQueryResult` type. - -The query parameter needs to be resolved before executing the query with QueryEngine. - -In `parent` mode, the query parameter is resolved using the `IDataContext` parameter passed to data provider class. - - -> See example `CustomerQuery` implemented to be configured and run in parent mode below. -> ``` ->internal class CustomerQuery : BaseQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Executes as Parent or Level 1 query. -> // The query parameter is resolved using IDataContext parameter of data provider class. Parent query result will be null. -> -> var customer = (CustomerContext)context; -> QueryParameter = new CustomerParameter -> { -> CustomerId = customer.CustomerId -> }; -> } -> } ->``` - -ii. Child Query - -To define a `child` or `dependant` query which is usually configured as child at level below the root query to query, derive from `BaseQuery` -* `TQueryParameter` is basically the class that holds the `inputs` required by the child query for execution. It is an implementation of `IQueryParameter` type. -* `TQueryResult` is the result that will be returned by executing the child query. It is an implementation of `IQueryResult` type. - -Similar to Root query, the query parameter of child query needs to be resolved before executing with QueryEngine. - -In `child` mode, the query parameter is resolved using the `query result` of the `parent` query. You can have a maximum of `5` levels of query nestings. - -> See example `CustomerCommunicationQuery` implemented to be configured and run as child or nested query to customer query below. Please see `CustomerSchema` definition above for parent/child configuration setup. ->``` -> internal class CustomerCommunicationQuery : BaseQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child to customer query. -> // The result from parent customer query is used to resolve the query parameter of the nested communication query. -> -> var customer = (CustomerResult)parentQueryResult; -> QueryParameter = new CustomerParameter -> { -> CustomerId = customer.Id -> }; -> } -> } ->``` - -#### Query Engines - -`Please Note:` The above query implementation examples are with respect to parent/child configuration. The actual storage specific query definition should vary with specific implementation of the QueryEngine. -> Please see supported Query engine implementations below. -- `Schemio.SQL` - provides the implementation of IQueryEngine to execute SQL queries. Uses `Dapper` for SQL data acess. -- `Schemio.EntityFramework` - provides implementation of IQueryEngine to execute `Entity Framework` queries. - -`Query using Schemio.SQL` -The SQL query needs to implement `BaseSQLQuery`. -And, requires implementing `public abstract CommandDefinition GetCommandDefinition()` method to return `command definition` for query to be executed with `Dapper` supported QueryEngine. - -See below example `CustomerQuery` implemented as Root SQL query ->``` -> internal class CustomerQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Executes as root or level 1 query. parent QueryResult should be null. -> var customer = (CustomerContext)context.Entity; -> QueryParameter = new CustomerParameter -> { -> CustomerId = (int)customer.CustomerId -> }; -> } -> -> public override IEnumerable Execute(IDbConnection conn) -> { -> return conn.Query(new CommandDefinition -> ( -> "select CustomerId as Id, " + -> "Customer_Name as Name," + -> "Customer_Code as Code " + -> $"from TCustomer where customerId={QueryParameter.CustomerId}" -> )); -> } -> } ->``` -> -See below example `CustomerOrderItemsQuery` implemented as child SQL query. ->``` ->internal class CustomerOrderItemsQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child query to order query taking OrderResult to resolve query parameter. -> var ordersResult = (OrderResult)parentQueryResult; -> -> QueryParameter ??= new OrderItemParameter(); -> QueryParameter.OrderIds.Add(ordersResult.OrderId); -> } -> -> public override IEnumerable Execute(IDbConnection conn) -> { -> return conn.Query(new CommandDefinition -> ( -> "select OrderId, " + -> "OrderItemId as ItemId, " + -> "Name, " + -> "Cost " + -> $"from TOrderItem where OrderId in ({QueryParameter.ToCsv()})" -> )); -> } -> } ->``` - -`Query using Schemio.EntityFramework` -The SQL query needs to implement `BaseSQLQuery`. -And, requires implementing `public abstract IEnumerable Run(DbContext dbContext)` method to implement query using `DbContext` using entity framework. - -See below example `CustomerQuery` implemented as Root Entity framework query ->``` -> internal class CustomerQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Executes as root or level 1 query. parent QueryResult shuld be null. -> var customer = (CustomerContext)context.Entity; -> QueryParameter = new CustomerParameter -> { -> CustomerId = (int)customer.CustomerId -> }; -> } -> -> public override IEnumerable Run(DbContext dbContext) -> { -> return dbContext.Set() -> .Where(c => c.Id == QueryParameter.CustomerId) -> .Select(c => new CustomerResult -> { -> Id = c.Id, -> Name = c.Name, -> Code = c.Code -> }); -> } -> } ->``` -> -See below example `CustomerOrderItemsQuery` implemented as child Entity framework query. ->``` ->internal class CustomerOrderItemsQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child query to order query taking OrderResult to resolve query parameter. -> var ordersResult = (CustomerOrderResult)parentQueryResult; -> -> QueryParameter ??= new OrderItemParameter(); -> QueryParameter.OrderIds.Add(ordersResult.OrderId); -> } -> -> public override IEnumerable Run(DbContext dbContext) -> { -> return dbContext.Set() -> .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) -> .Select(c => new OrderItemResult -> { -> ItemId = c.ItemId, -> Name = c.Name, -> Cost = c.Cost, -> OrderId = c.Order.OrderId -> }); -> ; -> } -> } ->``` - - -#### 2.2 Tranformer Class -The purpose of the transformer class is to transform the data fetched by the linked query class and mapp to the configured object graph of the entity. - -To define a transformer class, you need to implement `BaseTransformer` -- where TEntity is Entity implementing `IEntity`. eg. Customer. -- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. - -Note: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. - -For the example query/transformer mapping ->``` -> .Map(For.Paths("customer")) ->``` - -The customer transformer maps data only to the `customer` xpath mapped object graph of customer class. -ie. - `customer/id`, `customer/customercode`, `customer/customername` - -In below transformer example, `CustomerTransformer` is implemented to transform entity `Customer` with `CustomerResult` query result obtained from `CustomerQuery` execution. - -> ->``` ->internal class CustomerTransform : BaseTransformer -> { -> public override Customer Transform(CustomerResult queryResult, Customer entity) -> { -> var customer = entity ?? new Customer(); -> customer.CustomerId = queryResult.Id; -> customer.CustomerName = queryResult.CustomerName; -> customer.CustomerCode = queryResult.CustomerCode; -> return customer; -> } -> } ->``` - -### DataProvider Setup -Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. - -- `ILogger>` - logger implementation. default no logger. -- `IEntitySchema` - mandatory entity schema definition for entity's object graph. -- `IQueryEngine` - implementation of query engine to execute queries (of type IQuery) with supported data storage. -- `ISchemaPathMatcher` - implementation of schema path matcher to use custom schema paths with entity schema definition. - -Example constructors: - -i. With `EntitySchema` and `QueryEngine` implementations. - -``` - public DataProvider(IEntitySchema entitySchema, params IQueryEngine[] queryEngines) -``` -ii. With `Logger`, `EntitySchema`, `QueryEngine`, and `SchemaPathmMatcher` for custom schema paths mapping in entity schema definition. -``` - public DataProvider(ILogger> logger, IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) - -``` -#### Schemio.SQL -Construct DataProvider using `Schemio.SQL.QueryEngine` query engine. - -``` -var provider = new DataProvider(new CustomerSchema(), new Schemio.SQL.QueryEngine(new SQLConfiguration())); -``` - -#### Schemio.EntityFramework -Construct DataProvider using `Schemio.EntityFramework.QueryEngine` query engine. - -``` -var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.QueryEngine()); -``` - -### Using IOC for registrations - -#### Registrations - -With ServiceCollection, you need to register the below dependencies. +`Scemio.Core` - for installing schemio for `bespoke` implementation of query engine. ``` - // Register core services - services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); - services.AddTransient(typeof(ITransformExecutor<>), typeof(TransformExecutor<>)); - services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); - services.AddTransient(); - - // Register instance of ISchemaPathMatcher - Json, XPath or Custom. - services.AddTransient(c => new XPathMatcher()); - - // Enable logging - services.AddLogging(); - - //For Dapper SQL engine. - services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { - Providername = "System.Data.SqlClient", - ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" - }}); - - // For entity framework engine. - services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); - services.AddTransient(c => new QueryEngine(c.GetService>()); - - - // Register schema definitions. eg CustomerSchema - services.AddTransient, CustomerSchema>(); +NuGet\Install-Package Schemio.Core ``` - -`Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. - -#### Data Provider (DI) -To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` - -## Extend Schemio -### Custom Query Engine -To provide custom query engine and query implementations, you need to extend the base interfaces as depicted below -- IQueryEngine interface to implement the custom query engine to be used with schemio. +`Schemio.SQL` - for installing schemio for SQL with `Dapper` engine. ``` -public interface IQueryEngine - { - /// - /// Detrmines whether an instance of query can be executed with this engine. - /// - /// instance of IQuery. - /// Boolean; True when supported. - bool CanExecute(IQuery query); - - /// - /// Executes a list of queries returning a list of aggregated results. - /// - /// List of IQuery instances. - /// List of query results. Instances of IQueryResult. - IEnumerable Execute(IEnumerable queries); - } +NuGet\Install-Package Schemio.SQL ``` -Example Entity Framework implementation is below +`Schemio.EntityFramework` - for installing schemio for SQL with `EntityFramework` engine. ``` -public class QueryEngine : IQueryEngine where T : DbContext - { - private readonly IDbContextFactory _dbContextFactory; - - public QueryEngine(IDbContextFactory _dbContextFactory) - { - this._dbContextFactory = _dbContextFactory; - } - - public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; - - public IEnumerable Execute(IEnumerable queries) - { - var output = new List(); - - using (var dbcontext = _dbContextFactory.CreateDbContext()) - { - foreach (var query in queries) - { - var results = ((ISQLQuery)query).Run(dbcontext); - - if (results == null) - continue; - - output.AddRange(results); - } - - return output.ToArray(); - } - } - } +NuGet\Install-Package Schemio.EntityFramework ``` -- Provide base implementation supporting IQuery, IRootQuery & IChildQuery interfaces. -- You can implement the parent and child base class implementations to construct for queries to be executed with custom engine implementation above. -For Parent Query base implementation, see example below. -``` -public abstract class BaseSQLQuery - : BaseQuery, ISQLQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// Func> - public abstract IEnumerable Run(DbContext dbContext); - } -``` +### ii. Developer Guide -### Custom Schema Language -You can provide your own schema language support for use in entity schema definition to map sections of object graph. +Please see [wiki](https://github.com/CodeShayk/Schemio/wiki) for details on how to implement schemio in your project. -To do this you need to follow the below steps -* Provide entity schema definition with query/transformer pairs using custom schema language paths -* Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. This matcher is used by query builder to pick queries for matched paths against the configured p in Entity schema definition. -``` -public interface ISchemaPathMatcher - { - bool IsMatch(string inputPath, ISchemaPaths configuredPaths); - } -``` -Example implementation of XPath matcher is below. -``` -public class XPathMatcher : ISchemaPathMatcher - { - private static readonly Regex ancestorRegex = new Regex(@"=ancestor::(?'path'.*?)(/@|\[.*\]/@)", RegexOptions.Compiled); +## Support - public bool IsMatch(string inputXPath, ISchemaPaths configuredXPaths) - { - if (inputXPath == null) - return false; +If you are having problems, please let me know by [raising a new issue](https://github.com/CodeShayk/Schemio/issues/new/choose). - if (configuredXPaths.Paths.Any(x => inputXPath.ToLower().Contains(x.ToLower()))) - return true; +## License - if (configuredXPaths.Paths.Any(x => inputXPath.Contains("ancestor::") - && ancestorRegex.Matches(inputXPath).Select(match => match.Groups["path"].Value).Distinct().Any(match => x.EndsWith(match)))) - return true; +This project is licensed with the [MIT license](LICENSE). - return false; - } - } -``` +## Version History +The main branch is now on .NET 8.0. The following previous versions are available: +| Version | Release Notes | +| -------- | --------| +| [`v1.0.0`](https://github.com/CodeShayk/Schemio/tree/v1.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v1.0.0) | ## Credits Thank you for reading. Please fork, explore, contribute and report. Happy Coding !! :) From 27dbc93f48c0582da9f9ca6694112026ffb45b84 Mon Sep 17 00:00:00 2001 From: Ninja Date: Sat, 9 Nov 2024 15:46:19 +0000 Subject: [PATCH 03/64] - Update Readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 35bbb60..842ccd1 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ NuGet\Install-Package Schemio.EntityFramework ### ii. Developer Guide -Please see [wiki](https://github.com/CodeShayk/Schemio/wiki) for details on how to implement schemio in your project. +Please see [Developer Guide](https://github.com/CodeShayk/Schemio/blob/master/DeveloperGuide.md) for details on how to implement schemio in your project. ## Support From 4bb3079867bd3cc6bc7f835c4fa91bf7b1a8dd2b Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Sat, 9 Nov 2024 15:50:27 +0000 Subject: [PATCH 04/64] Add files via upload --- DeveloperGuide.md | 537 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 537 insertions(+) create mode 100644 DeveloperGuide.md diff --git a/DeveloperGuide.md b/DeveloperGuide.md new file mode 100644 index 0000000..aeb661e --- /dev/null +++ b/DeveloperGuide.md @@ -0,0 +1,537 @@ +# Developer Guide +## i. Installation +Install the latest nuget package as appropriate. + +`Scemio.Core` - for installing schemio for `bespoke` implementation of query engine. +``` +NuGet\Install-Package Schemio.Core +``` +`Schemio.SQL` - for installing schemio for SQL with `Dapper` engine. +``` +NuGet\Install-Package Schemio.SQL +``` +`Schemio.EntityFramework` - for installing schemio for SQL with `EntityFramework` engine. +``` +NuGet\Install-Package Schemio.EntityFramework +``` +## ii. Implementation: Usingse Schemio + +To use schemio you need to +> Step 1 - Setup the entity to be fetched. +> +> Step 2 - Construct the `DataProvider` with required dependencies. + +### Step 1. Entity Setup +Setting up an entity includes the following. +* Define the `entity` to be fetched using `DataProvider` - which is basically a class with entire object graph (with nested typed properties). +* Define the `entity schema` which is schema path mapping of the entire entity object graph. Each mapping consists of a `query` and `transformer` pair mapped to a sections of object graph (using XPaths or JsonPath for schema paths) + +#### 1.1 Entity +To mark the class as Entity, implement the class from `IEntity` interface. +Bear in mind this is the root entity to be fetched. + +>Below is an example `Customer` entity. +> +> ``` +> public class Customer : IEntity +> { +> public int CustomerId { get; set; } +> public string CustomerCode { get; set; } +> public string CustomerName { get; set; } +> public Communication Communication { get; set; } +> public Order[] Orders { get; set; } +> } +> ``` + +For the customer class, we can see there are three levels of nesting in the object graph. +- Level 1 with paths: `Customer` +- Level 2 with paths: `Customer.Communication` and `Customer.Orders` +- Level 3 with paths: `Customer.Orders.Items` + +If we choose XML Schema Definition (XSD) for the object schema of the above Customer class fo mapping with XPATHs +then below is the Customer XSD and XPaths for different nesting levels. + +> Customer XSD is +> ``` +> Coming soon... +> ``` + +> Schema mappings using XPaths are +> ``` +> - Level 1 with XPath: Customer +> - Level 2 with XPaths: Customer/Communication and Customer/Orders +> - Level 3 with XPath: Customer/Orders/Order/Items/Item + +#### 1.2 Entity Schema Definition +Define entity schema definition for the entity in context. + +* `Entity schema definition` is basically a configuration with hierarchy of `query/transformer` pairs mapped to the schema paths pointing to different levels of the entity's object graph. +* `Query` is an implementation to fetch data for a certain section of object graph from an underlying data storage. +* `Transformer` is an implementation to map the data fetched by the linked query to the relevant sections of the entity's object graph. + +To define Entity schema, implement `BaseEntitySchema` interface where T is entity in context. + +> +Example Entity Schema Definition (using XPaths) +> The `Customer` entity with `three` levels of `nesting` is configured below in `CustomerSchema` definition to show `query/transformer` pairs nested accordingly mapping to object graph using the XPath definitions. +> +> ``` +> internal class CustomerSchema : BaseEntitySchema +> { +> public override IEnumerable> GetSchema() +> { +> return CreateSchema.For() +> .Map(For.Paths("customer"), +> customer => customer.Dependents +> .Map(For.Paths("customer/communication")) +> .Map(For.Paths("customer/orders"), +> customerOrders => customerOrders.Dependents +> .Map(For.Paths("customer/orders/order/items"))) +> ).Create(); +> } +> } +>``` + +##### i. Query/Transformer Mapping +Every `Query` type in the `EntitySchema` definition should have a complementing `Transformer` type. +You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. + +>Below is the snippet from `CustomerSchema` definition. +>``` +> .Map(For.Paths("customer", "customer/code", "customer/name")) +>``` + +##### ii. Nested Query/Transformer Mappings +* You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query paramter. +* The query/transformer mappings can be `nested` to `5` levels down. +* When certain `schema paths` are included in the DataProvider `request` to fetch the Entity, the relevant query and transformer pairs get executed in the order of their nesting to hydrate the entity. + +>Example nesting of Communication query under Customer query. +>``` +> .Map(For.Paths("customer"), -- Parent +> customer => customer.Dependents +> .Map(For.Paths("customer/communication")) -- Child +>``` + + +Please see the execution sequence below for queries and transformers nested in CustomerSchema implemented above. + +image + + +`Please Note:` If you need to support custom schema language for mapping the object graph, then see extending schemio section below. + + +#### 1.2.1 Query Class +The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. + +QueryEngine is an implementation of `IQueryEngine` to execute queries against a supported data storage to return a collection of query results (ie. of type IQueryResult). + +As explained above, You can configure a query in `Parent` or `Child` (nested) mode in nested hierarchies. + +i. Parent Query + +To define a `parent` or `root` query which is usually configured at level 1 to query the root entity, derive from `aseRootQuery` +* `TQueryParameter` is basically the class that holds the `inputs` required by the root query for execution. It is an implementation of `IQueryParameter` type. +* `TQueryResult` is the result that will be returned from executing the root query. It is an implementation of `IQueryResult` type. + +The query parameter needs to be resolved before executing the query with QueryEngine. + +In `parent` mode, the query parameter is resolved using the `IDataContext` parameter passed to data provider class. + + +> See example `CustomerQuery` implemented to be configured and run in parent mode below. +> ``` +>internal class CustomerQuery : BaseRootQuery +> { +> public override void ResolveRootQueryParameter(IDataContext context) +> { +> // Executes as Parent or Level 1 query. +> // The query parameter is resolved using IDataContext parameter of data provider class. +> +> var customer = (CustomerContext)context; +> QueryParameter = new CustomerParameter +> { +> CustomerId = customer.CustomerId +> }; +> } +> } +>``` + +ii. Child Query + +To define a `child` or `dependant` query which is usually configured as child at level below the root query to query, derive from `BaseChildQuery` +* `TQueryParameter` is basically the class that holds the `inputs` required by the child query for execution. It is an implementation of `IQueryParameter` type. +* `TQueryResult` is the result that will be returned by executing the child query. It is an implementation of `IQueryResult` type. + +Similar to Root query, the query parameter of child query needs to be resolved before executing with QueryEngine. + +In `child` mode, the query parameter is resolved using the `query result` of the `parent` query. You can have a maximum of `5` levels of query nestings. + +> See example `CustomerCommunicationQuery` implemented to be configured and run as child or nested query to customer query below. Please see `CustomerSchema` definition above for parent/child configuration setup. +>``` +> internal class CustomerCommunicationQuery : BaseChildQuery +> { +> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Execute as child to customer query. +> // The result from parent customer query is used to resolve the query parameter of the nested communication query. +> +> var customer = (CustomerResult)parentQueryResult; +> QueryParameter = new CustomerParameter +> { +> CustomerId = customer.Id +> }; +> } +> } +>``` + +#### Query Engines + +`Please Note:` The above query implementation examples are with respect to parent/child configuration. The actual storage specific query definition should vary with specific implementation of the QueryEngine. +> Please see supported Query engine implementations below. +- `Schemio.SQL` - provides the implementation of IQueryEngine to execute SQL queries. Uses `Dapper` for SQL data acess. +- `Schemio.EntityFramework` - provides implementation of IQueryEngine to execute `Entity Framework` queries. + +`Query using Schemio.SQL` +The SQL query needs to implement `BaseSQLRootQuery` or `BaseSQLChildQuery` based on parent or child implementation. +And, requires implementing `public abstract CommandDefinition GetCommandDefinition()` method to return `command definition` for query to be executed with `Dapper` supported QueryEngine. + +See below example `CustomerQuery` implemented as Root SQL query +>``` +> internal class CustomerQuery : BaseSQLRootQuery +> { +> public override void ResolveRootQueryParameter(IDataContext context) +> { +> // Executes as root or level 1 query. +> var customer = (CustomerContext)context.Entity; +> QueryParameter = new CustomerParameter +> { +> CustomerId = (int)customer.CustomerId +> }; +> } +> +> public override IEnumerable Execute(IDbConnection conn) +> { +> return conn.Query(new CommandDefinition +> ( +> "select CustomerId as Id, " + +> "Customer_Name as Name," + +> "Customer_Code as Code " + +> $"from TCustomer where customerId={QueryParameter.CustomerId}" +> )); +> } +> } +>``` +> +See below example `CustomerOrderItemsQuery` implemented as child SQL query. +>``` +>internal class CustomerOrderItemsQuery : BaseSQLChildQuery +> { +> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Execute as child query to order query taking OrderResult to resolve query parameter. +> var ordersResult = (OrderResult)parentQueryResult; +> +> QueryParameter ??= new OrderItemParameter(); +> QueryParameter.OrderIds.Add(ordersResult.OrderId); +> } +> +> public override IEnumerable Execute(IDbConnection conn) +> { +> return conn.Query(new CommandDefinition +> ( +> "select OrderId, " + +> "OrderItemId as ItemId, " + +> "Name, " + +> "Cost " + +> $"from TOrderItem where OrderId in ({QueryParameter.ToCsv()})" +> )); +> } +> } +>``` + +`Query using Schemio.EntityFramework` +The SQL query needs to implement `BaseSQLRootQuery` or `BaseSQLChildQuery` based on parent or child implementation. +And, requires implementing `public abstract IEnumerable Run(DbContext dbContext)` method to implement query using `DbContext` using entity framework. + +See below example `CustomerQuery` implemented as Root Entity framework query +>``` +> internal class CustomerQuery : BaseSQLRootQuery +> { +> public override void ResolveRootQueryParameter(IDataContext context) +> { +> // Executes as root or level 1 query. +> var customer = (CustomerContext)context.Entity; +> QueryParameter = new CustomerParameter +> { +> CustomerId = (int)customer.CustomerId +> }; +> } +> +> public override IEnumerable Run(DbContext dbContext) +> { +> return dbContext.Set() +> .Where(c => c.Id == QueryParameter.CustomerId) +> .Select(c => new CustomerResult +> { +> Id = c.Id, +> Name = c.Name, +> Code = c.Code +> }); +> } +> } +>``` +> +See below example `CustomerOrderItemsQuery` implemented as child Entity framework query. +>``` +>internal class CustomerOrderItemsQuery : BaseSQLChildQuery +> { +> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Execute as child query to order query taking OrderResult to resolve query parameter. +> var ordersResult = (CustomerOrderResult)parentQueryResult; +> +> QueryParameter ??= new OrderItemParameter(); +> QueryParameter.OrderIds.Add(ordersResult.OrderId); +> } +> +> public override IEnumerable Run(DbContext dbContext) +> { +> return dbContext.Set() +> .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) +> .Select(c => new OrderItemResult +> { +> ItemId = c.ItemId, +> Name = c.Name, +> Cost = c.Cost, +> OrderId = c.Order.OrderId +> }); +> ; +> } +> } +>``` + + +#### 2.2 Tranformer Class +The purpose of the transformer class is to transform the data fetched by the linked query class and mapp to the configured object graph of the entity. + +To define a transformer class, you need to implement `BaseTransformer` +- where TEntity is Entity implementing `IEntity`. eg. Customer. +- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. + +Note: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. + +For the example query/transformer mapping +>``` +> .Map(For.Paths("customer")) +>``` + +The customer transformer maps data only to the `customer` xpath mapped object graph of customer class. +ie. - `customer/id`, `customer/customercode`, `customer/customername` + +In below transformer example, `CustomerTransformer` is implemented to transform entity `Customer` with `CustomerResult` query result obtained from `CustomerQuery` execution. + +> +>``` +>internal class CustomerTransform : BaseTransformer +> { +> public override Customer Transform(CustomerResult queryResult, Customer entity) +> { +> var customer = entity ?? new Customer(); +> customer.CustomerId = queryResult.Id; +> customer.CustomerName = queryResult.CustomerName; +> customer.CustomerCode = queryResult.CustomerCode; +> return customer; +> } +> } +>``` + +### DataProvider Setup +Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. + +- `ILogger>` - logger implementation. default no logger. +- `IEntitySchema` - mandatory entity schema definition for entity's object graph. +- `IQueryEngine` - implementation of query engine to execute queries (of type IQuery) with supported data storage. +- `ISchemaPathMatcher` - implementation of schema path matcher to use custom schema paths with entity schema definition. + +Example constructors: + +i. With `EntitySchema` and `QueryEngine` implementations. + +``` + public DataProvider(IEntitySchema entitySchema, params IQueryEngine[] queryEngines) +``` +ii. With `Logger`, `EntitySchema`, `QueryEngine`, and `SchemaPathmMatcher` for custom schema paths mapping in entity schema definition. +``` + public DataProvider(ILogger> logger, IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) + +``` +#### Schemio.SQL +Construct DataProvider using `Schemio.SQL.QueryEngine` query engine. + +``` +var provider = new DataProvider(new CustomerSchema(), new Schemio.SQL.QueryEngine(new SQLConfiguration())); +``` + +#### Schemio.EntityFramework +Construct DataProvider using `Schemio.EntityFramework.QueryEngine` query engine. + +``` +var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.QueryEngine()); +``` + +### Using IOC for registrations + +With ServiceCollection, you should call the `services.UseSchemio()` method for IoC registration. + +To configure Data provider with SQL Query engine, use fluent registration apis as shown below - + ``` + services.UseSchemio(With.Schema(c => new CustomerSchema()) + .AddEngine(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { + Providername = "System.Data.SqlClient", + ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" + }})) + .LogWith(c => new Logger>(c.GetService()))); +``` + +To configure Data provider with Entity Framework Query engine, use fluent registration apis shown as below - + ``` + services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); + + services.AddLogging(); + + services.UseSchemio(With.Schema(c => new CustomerSchema()) + .AddEngine(c => new QueryEngine(c.GetService>())) + .LogWith(c => new Logger>(c.GetService()))); + +``` + +`Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. + +To use Data provider, Inject IDataProvider using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider<>))` + +## Extend Schemio +### Custom Query Engine +To provide custom query engine and query implementations, you need to extend the base interfaces as depicted below +- IQueryEngine interface to implement the custom query engine to be used with schemio. +``` +public interface IQueryEngine + { + /// + /// Detrmines whether an instance of query can be executed with this engine. + /// + /// instance of IQuery. + /// Boolean; True when supported. + bool CanExecute(IQuery query); + + /// + /// Executes a list of queries returning a list of aggregated results. + /// + /// List of IQuery instances. + /// List of query results. Instances of IQueryResult. + IEnumerable Execute(IEnumerable queries); + } +``` +Example Entity Framework implementation is below +``` +public class QueryEngine : IQueryEngine where T : DbContext + { + private readonly IDbContextFactory _dbContextFactory; + + public QueryEngine(IDbContextFactory _dbContextFactory) + { + this._dbContextFactory = _dbContextFactory; + } + + public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; + + public IEnumerable Execute(IEnumerable queries) + { + var output = new List(); + + using (var dbcontext = _dbContextFactory.CreateDbContext()) + { + foreach (var query in queries) + { + var results = ((ISQLQuery)query).Run(dbcontext); + + if (results == null) + continue; + + output.AddRange(results); + } + + return output.ToArray(); + } + } + } +``` +- Provide base implementation supporting IQuery, IRootQuery & IChildQuery interfaces. +- You can implement the parent and child base class implementations to construct for queries to be executed with custom engine implementation above. + +For Parent Query base implementation, see example below. +``` +public abstract class BaseSQLRootQuery + : BaseRootQuery, ISQLQuery + where TQueryParameter : IQueryParameter + where TQueryResult : IQueryResult + { + /// + /// Get query delegate with implementation to return query result. + /// Delegate returns a collection from db. + /// + /// Func> + public abstract IEnumerable Run(DbContext dbContext); + } +``` +For Child Query implementation, see example below. +``` +public abstract class BaseSQLChildQuery + : BaseChildQuery, ISQLQuery + where TQueryParameter : IQueryParameter + where TQueryResult : IQueryResult + { + /// + /// Get query delegate with implementation to return query result. + /// Delegate returns a collection from db. + /// + /// Func> + public abstract IEnumerable Run(DbContext dbContext); + } +``` +### Custom Schema Language +You can provide your own schema language support for use in entity schema definition to map sections of object graph. + +To do this you need to follow the below steps +* Provide entity schema definition with query/transformer pairs using custom schema language paths +* Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. This matcher is used by query builder to pick queries for matched paths against the configured p in Entity schema definition. +``` +public interface ISchemaPathMatcher + { + bool IsMatch(string inputPath, ISchemaPaths configuredPaths); + } +``` +Example implementation of XPath matcher is below. +``` +public class XPathMatcher : ISchemaPathMatcher + { + private static readonly Regex ancestorRegex = new Regex(@"=ancestor::(?'path'.*?)(/@|\[.*\]/@)", RegexOptions.Compiled); + + public bool IsMatch(string inputXPath, ISchemaPaths configuredXPaths) + { + if (inputXPath == null) + return false; + + if (configuredXPaths.Paths.Any(x => inputXPath.ToLower().Contains(x.ToLower()))) + return true; + + if (configuredXPaths.Paths.Any(x => inputXPath.Contains("ancestor::") + && ancestorRegex.Matches(inputXPath).Select(match => match.Groups["path"].Value).Distinct().Any(match => x.EndsWith(match)))) + return true; + + return false; + } + } +``` + From ab09bb95e2d594e1f77416bde1f75c16a59dc8e5 Mon Sep 17 00:00:00 2001 From: Ninja Date: Sat, 9 Nov 2024 16:07:45 +0000 Subject: [PATCH 05/64] - Update Developer Guide --- DeveloperGuide.md | 111 ++++++++++++++++++++++------------------------ Schemio.sln | 1 + 2 files changed, 53 insertions(+), 59 deletions(-) diff --git a/DeveloperGuide.md b/DeveloperGuide.md index aeb661e..7cb4a12 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -14,7 +14,7 @@ NuGet\Install-Package Schemio.SQL ``` NuGet\Install-Package Schemio.EntityFramework ``` -## ii. Implementation: Usingse Schemio +## ii. Implementation: Using Schemio To use schemio you need to > Step 1 - Setup the entity to be fetched. @@ -131,7 +131,7 @@ As explained above, You can configure a query in `Parent` or `Child` (nested) mo i. Parent Query -To define a `parent` or `root` query which is usually configured at level 1 to query the root entity, derive from `aseRootQuery` +To define a `parent` or `root` query which is usually configured at level 1 to query the root entity, derive from `BaseQuery` * `TQueryParameter` is basically the class that holds the `inputs` required by the root query for execution. It is an implementation of `IQueryParameter` type. * `TQueryResult` is the result that will be returned from executing the root query. It is an implementation of `IQueryResult` type. @@ -142,12 +142,12 @@ In `parent` mode, the query parameter is resolved using the `IDataContext` param > See example `CustomerQuery` implemented to be configured and run in parent mode below. > ``` ->internal class CustomerQuery : BaseRootQuery +>internal class CustomerQuery : BaseQuery > { -> public override void ResolveRootQueryParameter(IDataContext context) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { > // Executes as Parent or Level 1 query. -> // The query parameter is resolved using IDataContext parameter of data provider class. +> // The query parameter is resolved using IDataContext parameter of data provider class. Parent query result will be null. > > var customer = (CustomerContext)context; > QueryParameter = new CustomerParameter @@ -160,7 +160,7 @@ In `parent` mode, the query parameter is resolved using the `IDataContext` param ii. Child Query -To define a `child` or `dependant` query which is usually configured as child at level below the root query to query, derive from `BaseChildQuery` +To define a `child` or `dependant` query which is usually configured as child at level below the root query to query, derive from `BaseQuery` * `TQueryParameter` is basically the class that holds the `inputs` required by the child query for execution. It is an implementation of `IQueryParameter` type. * `TQueryResult` is the result that will be returned by executing the child query. It is an implementation of `IQueryResult` type. @@ -170,9 +170,9 @@ In `child` mode, the query parameter is resolved using the `query result` of the > See example `CustomerCommunicationQuery` implemented to be configured and run as child or nested query to customer query below. Please see `CustomerSchema` definition above for parent/child configuration setup. >``` -> internal class CustomerCommunicationQuery : BaseChildQuery +> internal class CustomerCommunicationQuery : BaseQuery > { -> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { > // Execute as child to customer query. > // The result from parent customer query is used to resolve the query parameter of the nested communication query. @@ -194,16 +194,16 @@ In `child` mode, the query parameter is resolved using the `query result` of the - `Schemio.EntityFramework` - provides implementation of IQueryEngine to execute `Entity Framework` queries. `Query using Schemio.SQL` -The SQL query needs to implement `BaseSQLRootQuery` or `BaseSQLChildQuery` based on parent or child implementation. +The SQL query needs to implement `BaseSQLQuery`. And, requires implementing `public abstract CommandDefinition GetCommandDefinition()` method to return `command definition` for query to be executed with `Dapper` supported QueryEngine. See below example `CustomerQuery` implemented as Root SQL query >``` -> internal class CustomerQuery : BaseSQLRootQuery +> internal class CustomerQuery : BaseSQLQuery > { -> public override void ResolveRootQueryParameter(IDataContext context) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { -> // Executes as root or level 1 query. +> // Executes as root or level 1 query. parent QueryResult should be null. > var customer = (CustomerContext)context.Entity; > QueryParameter = new CustomerParameter > { @@ -226,9 +226,9 @@ See below example `CustomerQuery` implemented as Root SQL query > See below example `CustomerOrderItemsQuery` implemented as child SQL query. >``` ->internal class CustomerOrderItemsQuery : BaseSQLChildQuery +>internal class CustomerOrderItemsQuery : BaseSQLQuery > { -> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { > // Execute as child query to order query taking OrderResult to resolve query parameter. > var ordersResult = (OrderResult)parentQueryResult; @@ -252,16 +252,16 @@ See below example `CustomerOrderItemsQuery` implemented as child SQL query. >``` `Query using Schemio.EntityFramework` -The SQL query needs to implement `BaseSQLRootQuery` or `BaseSQLChildQuery` based on parent or child implementation. +The SQL query needs to implement `BaseSQLQuery`. And, requires implementing `public abstract IEnumerable Run(DbContext dbContext)` method to implement query using `DbContext` using entity framework. See below example `CustomerQuery` implemented as Root Entity framework query >``` -> internal class CustomerQuery : BaseSQLRootQuery +> internal class CustomerQuery : BaseSQLQuery > { -> public override void ResolveRootQueryParameter(IDataContext context) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { -> // Executes as root or level 1 query. +> // Executes as root or level 1 query. parent QueryResult shuld be null. > var customer = (CustomerContext)context.Entity; > QueryParameter = new CustomerParameter > { @@ -285,9 +285,9 @@ See below example `CustomerQuery` implemented as Root Entity framework query > See below example `CustomerOrderItemsQuery` implemented as child Entity framework query. >``` ->internal class CustomerOrderItemsQuery : BaseSQLChildQuery +>internal class CustomerOrderItemsQuery : BaseSQLQuery > { -> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { > // Execute as child query to order query taking OrderResult to resolve query parameter. > var ordersResult = (CustomerOrderResult)parentQueryResult; @@ -383,33 +383,41 @@ var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.Qu ### Using IOC for registrations -With ServiceCollection, you should call the `services.UseSchemio()` method for IoC registration. +#### Registrations -To configure Data provider with SQL Query engine, use fluent registration apis as shown below - - ``` - services.UseSchemio(With.Schema(c => new CustomerSchema()) - .AddEngine(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { - Providername = "System.Data.SqlClient", - ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" - }})) - .LogWith(c => new Logger>(c.GetService()))); +With ServiceCollection, you need to register the below dependencies. ``` - -To configure Data provider with Entity Framework Query engine, use fluent registration apis shown as below - - ``` - services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); - - services.AddLogging(); - - services.UseSchemio(With.Schema(c => new CustomerSchema()) - .AddEngine(c => new QueryEngine(c.GetService>())) - .LogWith(c => new Logger>(c.GetService()))); - + // Register core services + services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); + services.AddTransient(typeof(ITransformExecutor<>), typeof(TransformExecutor<>)); + services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); + services.AddTransient(); + + // Register instance of ISchemaPathMatcher - Json, XPath or Custom. + services.AddTransient(c => new XPathMatcher()); + + // Enable logging + services.AddLogging(); + + //For Dapper SQL engine. + services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { + Providername = "System.Data.SqlClient", + ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" + }}); + + // For entity framework engine. + services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); + services.AddTransient(c => new QueryEngine(c.GetService>()); + + + // Register schema definitions. eg CustomerSchema + services.AddTransient, CustomerSchema>(); ``` `Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. -To use Data provider, Inject IDataProvider using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider<>))` +#### Data Provider (DI) +To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` ## Extend Schemio ### Custom Query Engine @@ -472,23 +480,8 @@ public class QueryEngine : IQueryEngine where T : DbContext For Parent Query base implementation, see example below. ``` -public abstract class BaseSQLRootQuery - : BaseRootQuery, ISQLQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// Func> - public abstract IEnumerable Run(DbContext dbContext); - } -``` -For Child Query implementation, see example below. -``` -public abstract class BaseSQLChildQuery - : BaseChildQuery, ISQLQuery +public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery where TQueryParameter : IQueryParameter where TQueryResult : IQueryResult { @@ -500,6 +493,7 @@ public abstract class BaseSQLChildQuery public abstract IEnumerable Run(DbContext dbContext); } ``` + ### Custom Schema Language You can provide your own schema language support for use in entity schema definition to map sections of object graph. @@ -534,4 +528,3 @@ public class XPathMatcher : ISchemaPathMatcher } } ``` - diff --git a/Schemio.sln b/Schemio.sln index dc87320..79f1429 100644 --- a/Schemio.sln +++ b/Schemio.sln @@ -10,6 +10,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{AF995FEF-BB94-48D0-B02B-6671DA73056B}" ProjectSection(SolutionItems) = preProject .gitignore = .gitignore + DeveloperGuide.md = DeveloperGuide.md LICENSE.md = LICENSE.md README.md = README.md EndProjectSection From 4caedcdec675a3d59ceaedea60efe8df7f862832 Mon Sep 17 00:00:00 2001 From: Ninja Date: Sat, 9 Nov 2024 16:26:09 +0000 Subject: [PATCH 06/64] - Update Developer Guide --- DeveloperGuide.md | 18 ++++++------------ README.md | 2 +- src/Schemio.Core/IEntitySchema.cs | 2 +- src/Schemio.Core/IEntitySchema1.cs | 6 ------ 4 files changed, 8 insertions(+), 20 deletions(-) delete mode 100644 src/Schemio.Core/IEntitySchema1.cs diff --git a/DeveloperGuide.md b/DeveloperGuide.md index 7cb4a12..5610659 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -129,15 +129,14 @@ QueryEngine is an implementation of `IQueryEngine` to execute queries against a As explained above, You can configure a query in `Parent` or `Child` (nested) mode in nested hierarchies. -i. Parent Query - -To define a `parent` or `root` query which is usually configured at level 1 to query the root entity, derive from `BaseQuery` +To define a `parent` or `child` query, derive from `BaseQuery` * `TQueryParameter` is basically the class that holds the `inputs` required by the root query for execution. It is an implementation of `IQueryParameter` type. * `TQueryResult` is the result that will be returned from executing the root query. It is an implementation of `IQueryResult` type. The query parameter needs to be resolved before executing the query with QueryEngine. +To resolve the query parameter you need to override `ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult)` method -In `parent` mode, the query parameter is resolved using the `IDataContext` parameter passed to data provider class. +i. Parent Query - In `parent` mode, which is usually configured at level 1 to query the root entity, the query parameter is resolved using the `IDataContext` parameter passed to data provider class. `IQueryResult` parameter in ResolveQueryParameter() will be `null`. > See example `CustomerQuery` implemented to be configured and run in parent mode below. @@ -158,15 +157,10 @@ In `parent` mode, the query parameter is resolved using the `IDataContext` param > } >``` -ii. Child Query - -To define a `child` or `dependant` query which is usually configured as child at level below the root query to query, derive from `BaseQuery` -* `TQueryParameter` is basically the class that holds the `inputs` required by the child query for execution. It is an implementation of `IQueryParameter` type. -* `TQueryResult` is the result that will be returned by executing the child query. It is an implementation of `IQueryResult` type. - -Similar to Root query, the query parameter of child query needs to be resolved before executing with QueryEngine. +ii. Child Query - In `child` mode, which is a query configured usually at level below any parent query, the query parameter can be resolved using the `IQueryResult` query result of the `parent` query. +IDataContext parameter passed to data provider class is also available. -In `child` mode, the query parameter is resolved using the `query result` of the `parent` query. You can have a maximum of `5` levels of query nestings. +Note: You can have a maximum of `5` levels of query nestings. > See example `CustomerCommunicationQuery` implemented to be configured and run as child or nested query to customer query below. Please see `CustomerSchema` definition above for parent/child configuration setup. >``` diff --git a/README.md b/README.md index 842ccd1..f60891a 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ NuGet\Install-Package Schemio.EntityFramework ### ii. Developer Guide -Please see [Developer Guide](https://github.com/CodeShayk/Schemio/blob/master/DeveloperGuide.md) for details on how to implement schemio in your project. +Please see [Developer Guide](/DeveloperGuide.md) for details on how to implement schemio in your project. ## Support diff --git a/src/Schemio.Core/IEntitySchema.cs b/src/Schemio.Core/IEntitySchema.cs index 11de773..061b3f5 100644 --- a/src/Schemio.Core/IEntitySchema.cs +++ b/src/Schemio.Core/IEntitySchema.cs @@ -4,7 +4,7 @@ namespace Schemio.Core /// Implement to configure schema path mappings for an Entity. /// /// Entity type - public interface IEntitySchema : IEntitySchema where TEntity : IEntity + public interface IEntitySchema where TEntity : IEntity { /// /// Entity schema mappings. diff --git a/src/Schemio.Core/IEntitySchema1.cs b/src/Schemio.Core/IEntitySchema1.cs deleted file mode 100644 index 6bd2ed7..0000000 --- a/src/Schemio.Core/IEntitySchema1.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Schemio.Core -{ - public interface IEntitySchema - { - } -} \ No newline at end of file From de76225f6effc287518f60ab1cb5148a64620c1b Mon Sep 17 00:00:00 2001 From: Ninja Date: Wed, 13 Nov 2024 21:53:05 +0000 Subject: [PATCH 07/64] - Checkpoint - Fix Tests --- README.md | 4 +- src/Schemio.Core/Impl/EntityBuilder.cs | 7 +- src/Schemio.Core/Impl/QueryExecutor.cs | 2 +- src/Schemio.EntityFramework/BaseSQLQuery.cs | 9 +- .../Schemio.EntityFramework.Tests/BaseTest.cs | 14 +++ .../E2E.Tests.cs | 106 ++++++++++++++++- .../EntitySchemas/CustomerSchema.cs | 6 +- ...nicationQuery.cs => CommunicationQuery.cs} | 11 +- .../EntitySchemas/Queries/CustomerQuery.cs | 8 +- ...rOrderItemsQuery.cs => OrderItemsQuery.cs} | 12 +- ...{CustomerOrderResult.cs => OrderResult.cs} | 2 +- ...{CustomerOrdersQuery.cs => OrdersQuery.cs} | 13 ++- ...Transform.cs => CommunicationTransform.cs} | 2 +- .../Transforms/CustomerOrderItemsTransform.cs | 28 ----- .../Transforms/CustomerOrdersTransform.cs | 30 ----- .../Transforms/OrderItemsTransform.cs | 31 +++++ .../Transforms/OrdersTransform.cs | 31 +++++ tests/Schemio.SQL.Tests/BaseTest.cs | 15 +++ tests/Schemio.SQL.Tests/E2E.Tests.cs | 109 ++++++++++++++++-- .../EntitySchemas/CustomerSchema.cs | 6 +- ...nicationQuery.cs => CommunicationQuery.cs} | 4 +- .../Queries/CommunicationResult.cs | 3 +- ...rOrderItemsQuery.cs => OrderItemsQuery.cs} | 2 +- .../EntitySchemas/Queries/OrderResult.cs | 2 +- ...{CustomerOrdersQuery.cs => OrdersQuery.cs} | 4 +- .../Transforms/CommunicationTransform.cs | 3 +- .../Transforms/OrdersTransform.cs | 2 +- 27 files changed, 349 insertions(+), 117 deletions(-) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CustomerCommunicationQuery.cs => CommunicationQuery.cs} (77%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CustomerOrderItemsQuery.cs => OrderItemsQuery.cs} (67%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CustomerOrderResult.cs => OrderResult.cs} (84%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CustomerOrdersQuery.cs => OrdersQuery.cs} (67%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/{CustomerCommunicationTransform.cs => CommunicationTransform.cs} (91%) delete mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs delete mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs create mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs create mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs rename tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/{CustomerCommunicationQuery.cs => CommunicationQuery.cs} (88%) rename tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/{CustomerOrderItemsQuery.cs => OrderItemsQuery.cs} (90%) rename tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/{CustomerOrdersQuery.cs => OrdersQuery.cs} (85%) diff --git a/README.md b/README.md index 3314072..76ebe4a 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@ ## Concept ### What is Schemio? `Schemio` is a data aggregation framework that -- allows fetching `aggregated data` from `heterogeneous` data storages. You could combine queries targetting different data platforms (example. SQL, API, Cache) to return an aggregated data entity. -- allows `conditionally` fetching only `parts` of the data entity. You could retrieve an aggregated data entity with selective sections of its `object graph` populated depending on the context passed with the request. +- allows fetching `aggregated` data from `heterogeneous` data storages. You could combine queries targetting different data platforms (example. `SQL`, `API`, `Cache`) to return an aggregated data `entity`. +- allows `selectively` fetching only `parts` of the aggregated data entity. You could retrieve an aggregated data entity with only `sections` of its `object graph` `populated` with data depending upon the `context` passed with the request. ### When to use Schemio? Schemio is perfect fit for many use cases. Few examples that require the service tier to dynamically fetch aggregated data with high performance, availability and scalability are diff --git a/src/Schemio.Core/Impl/EntityBuilder.cs b/src/Schemio.Core/Impl/EntityBuilder.cs index b799dd0..7c232d1 100644 --- a/src/Schemio.Core/Impl/EntityBuilder.cs +++ b/src/Schemio.Core/Impl/EntityBuilder.cs @@ -39,11 +39,16 @@ public T Build(IDataContext context, IList queryResults) .ToList(); foreach (var queryResult in queryResults) - transformers.Where(transformer => (transformer as ITransformerQueryResult)?.SupportedQueryResult == queryResult.GetType()).ToList() + transformers.Where(transformer => IsMatch(((ITransformerQueryResult)transformer).SupportedQueryResult, queryResult.GetType())).ToList() .ForEach(supportedtransformer => supportedtransformer?.Transform(queryResult, entity)); } return entity; + + static bool IsMatch(Type transformer, Type queryResult) + { + return transformer == queryResult; + } } } } \ No newline at end of file diff --git a/src/Schemio.Core/Impl/QueryExecutor.cs b/src/Schemio.Core/Impl/QueryExecutor.cs index 87c92e0..4991f17 100644 --- a/src/Schemio.Core/Impl/QueryExecutor.cs +++ b/src/Schemio.Core/Impl/QueryExecutor.cs @@ -42,7 +42,7 @@ private static void CacheResults(IDataContext context, List result if (context.Cache == null) return; - foreach (var cacheResult in results.Where(result => result.GetType() + foreach (var cacheResult in results.Where(result => result != null && result.GetType() .GetCustomAttributes(typeof(CacheResultAttribute), false) .Any())) if (!context.Cache.ContainsKey(cacheResult.GetType().Name)) diff --git a/src/Schemio.EntityFramework/BaseSQLQuery.cs b/src/Schemio.EntityFramework/BaseSQLQuery.cs index 029b8a1..7501bf7 100644 --- a/src/Schemio.EntityFramework/BaseSQLQuery.cs +++ b/src/Schemio.EntityFramework/BaseSQLQuery.cs @@ -12,7 +12,12 @@ public abstract class BaseSQLQuery /// Get query delegate with implementation to return query result. /// Delegate returns a collection from db. /// - /// Func> - public abstract Task Run(DbContext dbContext); + /// IQueryResult + public abstract Task Run(DbContext dbContext); + + async Task ISQLQuery.Run(DbContext dbContext) + { + return await Run(dbContext); + } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index 7c77be4..a9dcc68 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -11,6 +11,20 @@ public class BaseTest { protected ServiceProvider _serviceProvider; + protected void AssertAreEqual(Customer expected, Customer actual) + { + var actualCustomer = actual.ToJson(); + var expectedCustomer = expected.ToJson(); + + Console.WriteLine("expected:"); + Console.WriteLine(expectedCustomer); + + Console.WriteLine("actual:"); + Console.WriteLine(actualCustomer); + + Assert.That(actualCustomer, Is.EqualTo(expectedCustomer)); + } + [OneTimeSetUp] public void Setup() { diff --git a/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs b/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs index 5e611c0..48d4f96 100644 --- a/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs +++ b/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs @@ -5,7 +5,7 @@ namespace Schemio.EntityFramework.Tests { - [TestFixture, Ignore("To-Fix-Shortly")] + [TestFixture] public class E2ETests : BaseTest { private IDataProvider _provider; @@ -24,12 +24,83 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() CustomerId = 1 }); - Assert.IsNotNull(customer); - Assert.That("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@gmail.com\",\"Address\":{\"AddressId\":1,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"2021-10-22T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}", Is.EqualTo(customer.ToJson())); + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Communication = new Communication + { + ContactId = 1, + Phone = "0123456789", + Email = "jack.sparrow@gmail.com", + Address = new Address + { + AddressId = 1, + HouseNo = "77", + City = "Wansted", + Region = "Belfast", + PostalCode = "BL34Y56", + Country = "United Kingdom", + } + }, + Orders = [ new Order { + OrderId = 1, + OrderNo = "ZX123VH", + Date = DateTime.Parse("2021-10-22T00:00:00"), + Items = + [ + new OrderItem + { + ItemId = 1, Name = "12 inch Cake", Cost = 30m + }, + new OrderItem + { + ItemId = 2, Name = "20 Cake Candles", Cost = 5m + } + ] + }] + }; + + AssertAreEqual(expected, customer); } [Test] - public void TestDataProviderToFetchEntityWhenPathsNotNull() + public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() + { + var customer = _provider.GetData(new CustomerContext + { + CustomerId = 1, + SchemaPaths = new[] { "Customer/Communication" } + }); + + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Communication = new Communication + { + ContactId = 1, + Phone = "0123456789", + Email = "jack.sparrow@gmail.com", + Address = new Address + { + AddressId = 1, + HouseNo = "77", + City = "Wansted", + Region = "Belfast", + PostalCode = "BL34Y56", + Country = "United Kingdom", + } + } + }; + + AssertAreEqual(expected, customer); + } + + [Test] + public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() { var customer = _provider.GetData(new CustomerContext { @@ -37,8 +108,31 @@ public void TestDataProviderToFetchEntityWhenPathsNotNull() SchemaPaths = new[] { "Customer/orders/order/items/item" } }); - Assert.IsNotNull(customer); - Assert.AreEqual(customer.ToJson(), "{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":null,\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"2021-10-22T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}"); + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Orders = [ new Order + { + OrderId = 1, + OrderNo = "ZX123VH", + Date = DateTime.Parse("2021-10-22T00:00:00"), + Items = + [ + new OrderItem + { + ItemId = 1, Name = "12 inch Cake", Cost = 30m + }, + new OrderItem + { + ItemId = 2, Name = "20 Cake Candles", Cost = 5m + } + ] + }] + }; + + AssertAreEqual(expected, customer); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 48f4494..6ef1d5a 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -12,10 +12,10 @@ public override IEnumerable> GetSchema() return CreateSchema.For() .Map(For.Paths("customer"), customer => customer.Dependents - .Map(For.Paths("customer/communication")) - .Map(For.Paths("customer/orders"), + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents - .Map(For.Paths("customer/orders/order/items"))) + .Map(For.Paths("customer/orders/order/items"))) ).Create(); } } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs similarity index 77% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index 2761d62..bbbbab7 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerCommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { @@ -16,9 +16,9 @@ public override void ResolveQueryParameter(IDataContext context, IQueryResult pa }; } - public override Task Run(DbContext dbContext) + public override async Task Run(DbContext dbContext) { - var result = dbContext.Set() + var result = await dbContext.Set() .Where(p => p.Customer.Id == QueryParameter.CustomerId) .Select(c => new CommunicationResult { @@ -31,9 +31,10 @@ public override Task Run(DbContext dbContext) Region = c.Address.Region, PostalCode = c.Address.PostalCode, Country = c.Address.Country - }).FirstOrDefault(); + }) + .FirstOrDefaultAsync(); - return Task.FromResult((IQueryResult)result); + return result; } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index 0a90b2f..e12f6f4 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -16,9 +16,9 @@ public override void ResolveQueryParameter(IDataContext context, IQueryResult pa }; } - public override Task Run(DbContext dbContext) + public override async Task Run(DbContext dbContext) { - var result = dbContext.Set() + var result = await dbContext.Set() .Where(c => c.Id == QueryParameter.CustomerId) .Select(c => new CustomerResult { @@ -26,9 +26,9 @@ public override Task Run(DbContext dbContext) Name = c.Name, Code = c.Code }) - .FirstOrDefault(); + .FirstOrDefaultAsync(); - return Task.FromResult((IQueryResult)result); + return result; } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs similarity index 67% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index c245074..edadba6 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -4,12 +4,12 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. - var ordersResults = (CollectionResult)parentQueryResult; + var ordersResults = (CollectionResult)parentQueryResult; QueryParameter ??= new OrderItemParameter(); var orderIds = ordersResults?.Select(o => o.OrderId); @@ -17,9 +17,9 @@ public override void ResolveQueryParameter(IDataContext context, IQueryResult pa QueryParameter.OrderIds.AddRange(orderIds); } - public override Task Run(DbContext dbContext) + public override async Task> Run(DbContext dbContext) { - var items = dbContext.Set() + var items = await dbContext.Set() .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) .Select(c => new OrderItemResult { @@ -28,9 +28,9 @@ public override Task Run(DbContext dbContext) Cost = c.Cost, OrderId = c.Order.OrderId }) - .ToList(); + .ToListAsync(); - return Task.FromResult((IQueryResult)new CollectionResult(items)); + return new CollectionResult(items); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs similarity index 84% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs index 65769c5..06ecfec 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs @@ -2,7 +2,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerOrderResult : IQueryResult + public class OrderResult : IQueryResult { public int CustomerId { get; set; } public int OrderId { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs similarity index 67% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index e775e0f..cbbb692 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { @@ -16,19 +16,20 @@ public override void ResolveQueryParameter(IDataContext context, IQueryResult pa }; } - public override Task Run(DbContext dbContext) + public override async Task> Run(DbContext dbContext) { - var items = dbContext.Set() + var items = await dbContext.Set() .Where(p => p.Customer.Id == QueryParameter.CustomerId) - .Select(c => new CustomerOrderResult + .Select(c => new OrderResult { CustomerId = c.CustomerId, OrderId = c.OrderId, Date = c.Date, OrderNo = c.OrderNo - }); + }) + .ToListAsync(); - return Task.FromResult((IQueryResult)new CollectionResult(items)); + return new CollectionResult(items); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs similarity index 91% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs index fd7c1bb..0930475 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { - public class CustomerCommunicationTransform : BaseTransformer + public class CommunicationTransform : BaseTransformer { public override void Transform(CommunicationResult queryResult, Customer entity) { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs deleted file mode 100644 index 1f944c1..0000000 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Schemio.Core; -using Schemio.Core.Helpers; -using Schemio.EntityFramework.Tests.EntitySetup.Entities; -using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; - -namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms -{ - public class CustomerOrderItemsTransform : BaseTransformer - { - public override void Transform(OrderItemResult queryResult, Customer entity) - { - if (queryResult == null || entity?.Orders == null) - return; - - foreach (var order in entity.Orders) - if (order.OrderId == queryResult.OrderId) - { - order.Items = ArrayUtil.EnsureAndResizeArray(order.Items, out var index); - order.Items[index] = new OrderItem - { - ItemId = queryResult.ItemId, - Name = queryResult.Name, - Cost = queryResult.Cost - }; - } - } - } -} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs deleted file mode 100644 index 9996c27..0000000 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Schemio.Core; -using Schemio.Core.Helpers; -using Schemio.EntityFramework.Tests.EntitySetup.Entities; -using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; - -namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms -{ - public class CustomerOrdersTransform : BaseTransformer - { - public override void Transform(CustomerOrderResult queryResult, Customer entity) - { - if (queryResult == null) - return; - - var customer = entity ?? new Customer(); - - if (customer.Id != queryResult.CustomerId) - return; - - customer.Orders = ArrayUtil.EnsureAndResizeArray(customer.Orders, out var index); - - customer.Orders[index] = new Order - { - Date = queryResult.Date, - OrderId = queryResult.OrderId, - OrderNo = queryResult.OrderNo - }; - } - } -} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs new file mode 100644 index 0000000..6e585ef --- /dev/null +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs @@ -0,0 +1,31 @@ +using Schemio.Core; +using Schemio.Core.Helpers; +using Schemio.EntityFramework.Tests.EntitySetup.Entities; +using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; + +namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms +{ + public class OrderItemsTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer customer) + { + if (collectionResult == null || !collectionResult.Any() || customer.Orders == null) + return; + + foreach (var result in collectionResult) + { + var order = customer.Orders.FirstOrDefault(o => o.OrderId == result.OrderId); + if (order == null) + continue; + + order.Items = ArrayUtil.EnsureAndResizeArray(order.Items, out var index); + order.Items[index] = new OrderItem + { + ItemId = result.ItemId, + Name = result.Name, + Cost = result.Cost + }; + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs new file mode 100644 index 0000000..445576b --- /dev/null +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -0,0 +1,31 @@ +using System.Diagnostics.Contracts; +using Schemio.Core; +using Schemio.Core.Helpers; +using Schemio.EntityFramework.Tests.EntitySetup.Entities; +using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; + +namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms +{ + public class OrdersTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer entity) + { + if (collectionResult == null || !collectionResult.Any()) + return; + + var customer = entity ?? new Customer(); + + customer.Orders = new Order[collectionResult.Count]; + + for (var index = 0; index < collectionResult.Count; index++) + { + customer.Orders[index] = new Order + { + Date = collectionResult[index].Date, + OrderId = collectionResult[index].OrderId, + OrderNo = collectionResult[index].OrderNo + }; + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index a6ae7f3..c62d17a 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -4,6 +4,7 @@ using Schemio.Core; using Schemio.Core.PathMatchers; using Schemio.SQL; +using Schemio.SQL.Tests; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas; @@ -14,6 +15,20 @@ public class BaseTest protected ServiceProvider _serviceProvider; private const string DbProviderName = "System.Data.SQLite"; + protected void AssertAreEqual(Customer expected, Customer actual) + { + var actualCustomer = actual.ToJson(); + var expectedCustomer = expected.ToJson(); + + Console.WriteLine("expected:"); + Console.WriteLine(expectedCustomer); + + Console.WriteLine("actual:"); + Console.WriteLine(actualCustomer); + + Assert.That(actualCustomer, Is.EqualTo(expectedCustomer)); + } + [OneTimeSetUp] public void Setup() { diff --git a/tests/Schemio.SQL.Tests/E2E.Tests.cs b/tests/Schemio.SQL.Tests/E2E.Tests.cs index a73051e..bdf8c1d 100644 --- a/tests/Schemio.SQL.Tests/E2E.Tests.cs +++ b/tests/Schemio.SQL.Tests/E2E.Tests.cs @@ -25,12 +25,49 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() CustomerId = 1 }); - Assert.IsNotNull(customer); - Assert.That(customer.ToJson(), Is.EqualTo("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@gmail.com\",\"Address\":{\"AddressId\":0,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"0001-01-01T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}")); + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Communication = new Communication + { + ContactId = 1, + Phone = "0123456789", + Email = "jack.sparrow@gmail.com", + Address = new Address + { + AddressId = 1, + HouseNo = "77", + City = "Wansted", + Region = "Belfast", + PostalCode = "BL34Y56", + Country = "United Kingdom", + } + }, + Orders = [ new Order { + OrderId = 1, + OrderNo = "ZX123VH", + Date = DateTime.Parse("2021-10-22T00:00:00"), + Items = + [ + new OrderItem + { + ItemId = 1, Name = "12 inch Cake", Cost = 30m + }, + new OrderItem + { + ItemId = 2, Name = "20 Cake Candles", Cost = 5m + } + ] + }] + }; + + AssertAreEqual(expected, customer); } [Test] - public void TestDataProviderToFetchEntityWhenPathsNotNull() + public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() { var customer = _provider.GetData(new CustomerContext { @@ -38,8 +75,65 @@ public void TestDataProviderToFetchEntityWhenPathsNotNull() SchemaPaths = new[] { "Customer/orders/order/items/item" } }); - Assert.IsNotNull(customer); - Assert.That(customer.ToJson(), Is.EqualTo("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":null,\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"0001-01-01T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}")); + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Orders = [ new Order + { + OrderId = 1, + OrderNo = "ZX123VH", + Date = DateTime.Parse("2021-10-22T00:00:00"), + Items = + [ + new OrderItem + { + ItemId = 1, Name = "12 inch Cake", Cost = 30m + }, + new OrderItem + { + ItemId = 2, Name = "20 Cake Candles", Cost = 5m + } + ] + }] + }; + + AssertAreEqual(expected, customer); + } + + [Test] + public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() + { + var customer = _provider.GetData(new CustomerContext + { + CustomerId = 1, + SchemaPaths = new[] { "Customer/Communication" } + }); + + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Communication = new Communication + { + ContactId = 1, + Phone = "0123456789", + Email = "jack.sparrow@gmail.com", + Address = new Address + { + AddressId = 1, + HouseNo = "77", + City = "Wansted", + Region = "Belfast", + PostalCode = "BL34Y56", + Country = "United Kingdom", + } + } + }; + + AssertAreEqual(expected, customer); } [Test] @@ -50,10 +144,7 @@ public void TestDataProviderToCacheResultForResultsWithAttributeApplied() CustomerId = 1 }); - var customer = ((DataProvider)_provider).GetData(context); - - Assert.IsNotNull(customer); - Assert.That(customer.ToJson(), Is.EqualTo("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@gmail.com\",\"Address\":{\"AddressId\":0,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"0001-01-01T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}")); + ((DataProvider)_provider).GetData(context); Assert.That(context.Cache, Is.Not.Null); Assert.That(context.Cache.Count, Is.EqualTo(1)); diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index e039c96..553d556 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -12,10 +12,10 @@ public override IEnumerable> GetSchema() return CreateSchema.For() .Map(For.Paths("customer"), customer => customer.Dependents - .Map(For.Paths("customer/communication")) - .Map(For.Paths("customer/orders"), + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents - .Map(For.Paths("customer/orders/order/items"))) + .Map(For.Paths("customer/orders/order/items"))) ).Create(); } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs similarity index 88% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index 83ebd33..85ac9f1 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerCommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { @@ -20,7 +20,7 @@ public override Task Run(IDbConnection conn) { return conn.QueryFirstOrDefaultAsync(new CommandDefinition ( - "select c.CommunicationId as Id, " + + "select c.CommunicationId as ContactId, " + "c.Phone as Telephone, " + "c.Email, " + "a.AddressId, " + diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs index f19348b..e89da6f 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs @@ -5,9 +5,10 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries [CacheResult] public class CommunicationResult : IQueryResult { - public int Id { get; set; } + public int ContactId { get; set; } public string Telephone { get; set; } public string Email { get; set; } + public int AddressId { get; set; } public string HouseNo { get; set; } public string City { get; set; } public string Region { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs similarity index 90% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index c2d3b98..a37e4ee 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs index 5cba520..3176222 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs @@ -6,6 +6,6 @@ public class OrderResult : IQueryResult { public int OrderId { get; set; } public string OrderNo { get; set; } - public DateTime Date { get; set; } + public string OrderDate { get; set; } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs similarity index 85% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index 3e4fbf3..bfe1853 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { @@ -22,7 +22,7 @@ public override async Task> Run(IDbConnection conn ( "select OrderId, " + "OrderNo, " + - "Date(OrderDate) as Date " + + "OrderDate " + "from TOrder " + $"where customerId={QueryParameter.CustomerId}" )); diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs index 40a8f30..9cd5dca 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs @@ -11,7 +11,7 @@ public override void Transform(CommunicationResult queryResult, Customer entity) var customer = entity ?? new Customer(); customer.Communication = new Communication { - ContactId = queryResult.Id, + ContactId = queryResult.ContactId, Email = queryResult.Email, Phone = queryResult.Telephone }; @@ -19,6 +19,7 @@ public override void Transform(CommunicationResult queryResult, Customer entity) if (queryResult.HouseNo != null) customer.Communication.Address = new Address { + AddressId = queryResult.AddressId, HouseNo = queryResult.HouseNo, City = queryResult.City, Country = queryResult.Country, diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs index 4452dea..fa033d6 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -20,7 +20,7 @@ public override void Transform(CollectionResult collectionResult, C { customer.Orders[index] = new Order { - Date = collectionResult[index].Date, + Date = DateTime.Parse(collectionResult[index].OrderDate), OrderId = collectionResult[index].OrderId, OrderNo = collectionResult[index].OrderNo }; From ddf9605cf87bffbbba2afc61a9d18f9720882320 Mon Sep 17 00:00:00 2001 From: Ninja Date: Wed, 13 Nov 2024 23:23:45 +0000 Subject: [PATCH 08/64] - Checkpoint : Refactor BaseQuery class. --- src/Schemio.Core/BaseQuery.cs | 19 +++------- src/Schemio.Core/IQuery.cs | 2 +- src/Schemio.Core/Impl/EventSubscriber.cs | 4 +- src/Schemio.Core/Impl/QueryBuilder.cs | 2 +- src/Schemio.EntityFramework/BaseSQLQuery.cs | 29 ++++++++++----- src/Schemio.SQL/BaseSQLQuery.cs | 24 +++++++++--- .../Queries/CustomerCommunicationQuery.cs | 8 +++- .../Queries/CustomerOrderItemsQuery.cs | 8 +++- .../Queries/CustomerOrdersQuery.cs | 13 ++++++- .../EntitySetup/Queries/CustomerQuery.cs | 8 +++- .../Queries/CommunicationQuery.cs | 18 ++------- .../EntitySchemas/Queries/CustomerQuery.cs | 22 +++++------ .../EntitySchemas/Queries/OrderItemsQuery.cs | 37 ++++++++----------- .../EntitySchemas/Queries/OrdersQuery.cs | 20 ++++------ .../Queries/CommunicationQuery.cs | 15 ++------ .../EntitySchemas/Queries/CustomerQuery.cs | 15 ++------ .../EntitySchemas/Queries/OrderItemsQuery.cs | 32 ++++++++-------- .../EntitySchemas/Queries/OrdersQuery.cs | 32 +++++++--------- 18 files changed, 151 insertions(+), 157 deletions(-) diff --git a/src/Schemio.Core/BaseQuery.cs b/src/Schemio.Core/BaseQuery.cs index 4cd8fb3..11fb055 100644 --- a/src/Schemio.Core/BaseQuery.cs +++ b/src/Schemio.Core/BaseQuery.cs @@ -3,17 +3,10 @@ namespace Schemio.Core /// /// Implement this base class to create a data provider query. /// - /// /// - public abstract class BaseQuery : IQuery - where TQueryParameter : IQueryParameter + public abstract class BaseQuery : IQuery where TQueryResult : IQueryResult { - /// - /// Parameter values for query to execute. - /// - protected TQueryParameter QueryParameter; - /// /// Children queries dependent on this query. /// @@ -28,17 +21,17 @@ public Type ResultType } /// - /// Determines whether the parameter for query is resolved. + /// Implement to determine whether the query context is resolved and ready to execute with supported engine. /// - /// - public bool IsContextResolved() => QueryParameter != null; + /// Boolean + public abstract bool IsContextResolved(); /// - /// Implement to resolve query parameter. + /// Implement to resolve query context for execution with supporting query engine. /// /// data context passed to the data provider. /// query result from parent query (when configured as nested query). Can be null. - public abstract void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult); + public abstract void ResolveQuery(IDataContext context, IQueryResult parentQueryResult); /// /// Run query with supporting IQueryEngine instance. diff --git a/src/Schemio.Core/IQuery.cs b/src/Schemio.Core/IQuery.cs index bd6478c..11e548f 100644 --- a/src/Schemio.Core/IQuery.cs +++ b/src/Schemio.Core/IQuery.cs @@ -11,7 +11,7 @@ public interface IQuery : IQueryRunner bool IsContextResolved(); - void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult = null); + void ResolveQuery(IDataContext context, IQueryResult parentQueryResult = null); } public interface IQueryRunner diff --git a/src/Schemio.Core/Impl/EventSubscriber.cs b/src/Schemio.Core/Impl/EventSubscriber.cs index 9390e0a..34a2668 100644 --- a/src/Schemio.Core/Impl/EventSubscriber.cs +++ b/src/Schemio.Core/Impl/EventSubscriber.cs @@ -29,7 +29,7 @@ public void OnEventHandler(IDataContext context, ExecutorResultArgs args) continue; foreach (var query in unresolved.Queries) - query.ResolveQueryParameter(context, queryResult); + query.ResolveQuery(context, queryResult); } } @@ -49,7 +49,7 @@ public void OnEventHandler(IDataContext context, ExecutorResultArgs args) continue; foreach (var query in unresolved.Queries) - query.ResolveQueryParameter(context, queryResult); + query.ResolveQuery(context, queryResult); } } } diff --git a/src/Schemio.Core/Impl/QueryBuilder.cs b/src/Schemio.Core/Impl/QueryBuilder.cs index 90f56f0..1b455ef 100644 --- a/src/Schemio.Core/Impl/QueryBuilder.cs +++ b/src/Schemio.Core/Impl/QueryBuilder.cs @@ -23,7 +23,7 @@ public IQueryList Build(IDataContext context) var queries = GetMappedQueries(mappings, context); foreach (var query in queries.Queries) - query.ResolveQueryParameter(context); + query.ResolveQuery(context); return new QueryList(queries.Queries); } diff --git a/src/Schemio.EntityFramework/BaseSQLQuery.cs b/src/Schemio.EntityFramework/BaseSQLQuery.cs index 7501bf7..eeca8c8 100644 --- a/src/Schemio.EntityFramework/BaseSQLQuery.cs +++ b/src/Schemio.EntityFramework/BaseSQLQuery.cs @@ -3,21 +3,30 @@ namespace Schemio.EntityFramework { - public abstract class BaseSQLQuery - : BaseQuery, ISQLQuery - where TQueryParameter : IQueryParameter + public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery where TQueryResult : IQueryResult { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// IQueryResult - public abstract Task Run(DbContext dbContext); + private Func> QueryDelegate = null; + + public override bool IsContextResolved() => QueryDelegate != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + QueryDelegate = GetQuery(context, parentQueryResult); + } async Task ISQLQuery.Run(DbContext dbContext) { - return await Run(dbContext); + return await QueryDelegate(dbContext); } + + /// + /// Get query delegate to return query result. + /// + /// + /// + /// + protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); } } \ No newline at end of file diff --git a/src/Schemio.SQL/BaseSQLQuery.cs b/src/Schemio.SQL/BaseSQLQuery.cs index 96c29d5..b85111c 100644 --- a/src/Schemio.SQL/BaseSQLQuery.cs +++ b/src/Schemio.SQL/BaseSQLQuery.cs @@ -3,15 +3,29 @@ namespace Schemio.SQL { - public abstract class BaseSQLQuery : BaseQuery, ISQLQuery - where TQueryParameter : IQueryParameter + public abstract class BaseSQLQuery : BaseQuery, ISQLQuery where TQueryResult : IQueryResult { - public abstract Task Run(IDbConnection conn); - async Task ISQLQuery.Run(IDbConnection conn) { - return await Run(conn); + return await QueryDelegate(conn); } + + private Func> QueryDelegate = null; + + public override bool IsContextResolved() => QueryDelegate != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + QueryDelegate = GetQuery(context, parentQueryResult); + } + + /// + /// Get query delegate to return query result. + /// + /// + /// + /// + protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); } } \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs index a478296..2a9c08f 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs @@ -1,8 +1,12 @@ namespace Schemio.Core.Tests.EntitySetup.Queries { - internal class CustomerCommunicationQuery : BaseQuery + internal class CustomerCommunicationQuery : BaseQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + private CustomerParameter QueryParameter; + + public override bool IsContextResolved() => QueryParameter != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs index 1143919..eb49793 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs @@ -1,8 +1,12 @@ namespace Schemio.Core.Tests.EntitySetup.Queries { - internal class CustomerOrderItemsQuery : BaseQuery> + internal class CustomerOrderItemsQuery : BaseQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + private OrderItemParameter QueryParameter; + + public override bool IsContextResolved() => QueryParameter != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. var ordersResult = (OrderCollectionResult)parentQueryResult; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs index 59c5b0c..2c7d9f2 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs @@ -1,10 +1,19 @@ namespace Schemio.Core.Tests.EntitySetup.Queries { - internal class CustomerOrdersQuery : BaseQuery> + internal class CustomerOrdersQuery : BaseQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + private CustomerParameter QueryParameter; + + public override bool IsContextResolved() => QueryParameter != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Does not execute as child to any query. + var customer = (CustomerResult)parentQueryResult; + QueryParameter = new CustomerParameter + { + CustomerId = customer.Id + }; } } } \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs index ad35bb6..743844c 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs @@ -1,8 +1,12 @@ namespace Schemio.Core.Tests.EntitySetup.Queries { - public class CustomerQuery : BaseQuery + public class CustomerQuery : BaseQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + private CustomerParameter QueryParameter; + + public override bool IsContextResolved() => QueryParameter != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index bbbbab7..6f5c92e 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,22 +4,14 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { - // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter - { - CustomerId = customer.Id - }; - } - public override async Task Run(DbContext dbContext) - { - var result = await dbContext.Set() - .Where(p => p.Customer.Id == QueryParameter.CustomerId) + return async dbContext => await dbContext.Set() + .Where(p => p.Customer.Id == customer.Id) .Select(c => new CommunicationResult { Id = c.CommunicationId, @@ -33,8 +25,6 @@ public override async Task Run(DbContext dbContext) Country = c.Address.Country }) .FirstOrDefaultAsync(); - - return result; } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index e12f6f4..65fd283 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -4,22 +4,17 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : BaseSQLQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { - // Executes as root or level 1 query. + // Executes as root or level 1 query. parentQueryResult will be null. var customer = (CustomerContext)context.Entity; - QueryParameter = new CustomerParameter - { - CustomerId = customer.CustomerId - }; - } - public override async Task Run(DbContext dbContext) - { - var result = await dbContext.Set() - .Where(c => c.Id == QueryParameter.CustomerId) + return async dbContext => + { + var result = await dbContext.Set() + .Where(c => c.Id == customer.CustomerId) .Select(c => new CustomerResult { Id = c.Id, @@ -28,7 +23,8 @@ public override async Task Run(DbContext dbContext) }) .FirstOrDefaultAsync(); - return result; + return result; + }; } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index edadba6..8cbf59c 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -4,33 +4,28 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. var ordersResults = (CollectionResult)parentQueryResult; - QueryParameter ??= new OrderItemParameter(); - var orderIds = ordersResults?.Select(o => o.OrderId); - if (orderIds != null) - QueryParameter.OrderIds.AddRange(orderIds); - } - - public override async Task> Run(DbContext dbContext) - { - var items = await dbContext.Set() - .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) - .Select(c => new OrderItemResult - { - ItemId = c.ItemId, - Name = c.Name, - Cost = c.Cost, - OrderId = c.Order.OrderId - }) - .ToListAsync(); + return async dbContext => + { + var items = await dbContext.Set() + .Where(p => ordersResults.Select(o => o.OrderId).Contains(p.Order.OrderId)) + .Select(c => new OrderItemResult + { + ItemId = c.ItemId, + Name = c.Name, + Cost = c.Cost, + OrderId = c.Order.OrderId + }) + .ToListAsync(); - return new CollectionResult(items); + return new CollectionResult(items); + }; } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index cbbb692..96fe6f0 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,22 +4,17 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter - { - CustomerId = customer.Id - }; - } - public override async Task> Run(DbContext dbContext) - { - var items = await dbContext.Set() - .Where(p => p.Customer.Id == QueryParameter.CustomerId) + return async dbContext => + { + var items = await dbContext.Set() + .Where(p => p.Customer.Id == customer.Id) .Select(c => new OrderResult { CustomerId = c.CustomerId, @@ -29,7 +24,8 @@ public override async Task> Run(DbContext dbContex }) .ToListAsync(); - return new CollectionResult(items); + return new CollectionResult(items); + }; } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index 85ac9f1..b5d23c8 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,21 +4,14 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter - { - CustomerId = customer.Id - }; - } - public override Task Run(IDbConnection conn) - { - return conn.QueryFirstOrDefaultAsync(new CommandDefinition + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( "select c.CommunicationId as ContactId, " + "c.Phone as Telephone, " + @@ -31,7 +24,7 @@ public override Task Run(IDbConnection conn) "a.Country " + "from TCommunication c " + "left join TAddress a on a.CommunicationId = c.CommunicationId " + - $"where customerId={QueryParameter.CustomerId}" + $"where customerId={customer.Id}" )); } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index ddefdbc..ba8bdca 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -4,26 +4,19 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : BaseSQLQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; - QueryParameter = new CustomerParameter - { - CustomerId = (int)customer.CustomerId - }; - } - public override Task Run(IDbConnection conn) - { - return conn.QueryFirstOrDefaultAsync(new CommandDefinition + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( "select CustomerId as Id, " + "Customer_Name as Name," + "Customer_Code as Code " + - $"from TCustomer where customerId={QueryParameter.CustomerId}" + $"from TCustomer where customerId={customer.CustomerId}" )); } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index a37e4ee..2ab58a7 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -1,32 +1,30 @@ using System.Data; using Dapper; using Schemio.Core; +using Schemio.Core.Helpers; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child query to order query taking OrderResult to resolve query parameter. var ordersResult = (CollectionResult)parentQueryResult; - QueryParameter ??= new OrderItemParameter(); - QueryParameter.OrderIds.AddRange(ordersResult.Select(o => o.OrderId)); - } - - public override async Task> Run(IDbConnection conn) - { - var items = await conn.QueryAsync(new CommandDefinition - ( - "select OrderId, " + - "OrderItemId as ItemId, " + - "Name, " + - "Cost " + - $"from TOrderItem where OrderId in ({QueryParameter.ToCsv()})" - )); + return async connection => + { + var items = await connection.QueryAsync(new CommandDefinition + ( + "select OrderId, " + + "OrderItemId as ItemId, " + + "Name, " + + "Cost " + + $"from TOrderItem where OrderId in ({ordersResult.Select(o => o.OrderId).ToCSV()})" + )); - return new CollectionResult(items); + return new CollectionResult(items); + }; } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index bfe1853..eec0892 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,30 +4,26 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter - { - CustomerId = customer.Id - }; - } - public override async Task> Run(IDbConnection conn) - { - var items = await conn.QueryAsync(new CommandDefinition - ( - "select OrderId, " + - "OrderNo, " + - "OrderDate " + - "from TOrder " + - $"where customerId={QueryParameter.CustomerId}" - )); + return async connection => + { + var items = await connection.QueryAsync(new CommandDefinition + ( + "select OrderId, " + + "OrderNo, " + + "OrderDate " + + "from TOrder " + + $"where customerId={customer.Id}" + )); - return new CollectionResult(items); + return new CollectionResult(items); + }; } } } \ No newline at end of file From 0b9907e8e54e5a16e2d5f54dea2b0663a940b15a Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 14 Nov 2024 00:09:02 +0000 Subject: [PATCH 09/64] - Checkpoint: Add Schemio.API --- Schemio.sln | 7 + src/Schemio.API/BaseWebQuery.cs | 171 ++++++++++++++++++ src/Schemio.API/IWebQuery.cs | 10 + src/Schemio.API/IWebResponse.cs | 9 + src/Schemio.API/QueryEngine.cs | 30 +++ src/Schemio.API/Schemio.API.csproj | 17 ++ src/Schemio.Core/CreateSchema.cs | 4 +- src/Schemio.Core/Helpers/Constraints.cs | 11 ++ src/Schemio.Core/Helpers/JsonExtensions.cs | 11 ++ .../DataProvider.Tests/EntityBuilderTests.cs | 2 +- .../EntitySchemas/CustomerSchema.cs | 2 +- .../Schemio.EntityFramework.Tests/BaseTest.cs | 1 + .../EntitySchemas/CustomerSchema.cs | 2 +- .../Transforms/OrdersTransform.cs | 2 - .../JsonExtensions.cs | 15 -- tests/Schemio.SQL.Tests/BaseTest.cs | 2 +- .../EntitySchemas/CustomerSchema.cs | 2 +- .../Transforms/OrdersTransform.cs | 1 - tests/Schemio.SQL.Tests/JsonExtensions.cs | 15 -- 19 files changed, 274 insertions(+), 40 deletions(-) create mode 100644 src/Schemio.API/BaseWebQuery.cs create mode 100644 src/Schemio.API/IWebQuery.cs create mode 100644 src/Schemio.API/IWebResponse.cs create mode 100644 src/Schemio.API/QueryEngine.cs create mode 100644 src/Schemio.API/Schemio.API.csproj create mode 100644 src/Schemio.Core/Helpers/Constraints.cs create mode 100644 src/Schemio.Core/Helpers/JsonExtensions.cs delete mode 100644 tests/Schemio.EntityFramework.Tests/JsonExtensions.cs delete mode 100644 tests/Schemio.SQL.Tests/JsonExtensions.cs diff --git a/Schemio.sln b/Schemio.sln index 79f1429..cb33b57 100644 --- a/Schemio.sln +++ b/Schemio.sln @@ -36,6 +36,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL", "src\Schemio.SQL\Schemio.SQL.csproj", "{52986844-698F-486B-AEC9-846AAF50CF46}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Schemio.API", "src\Schemio.API\Schemio.API.csproj", "{0C1A05D2-653D-4F88-B397-BA53E0BA7281}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -66,6 +68,10 @@ Global {52986844-698F-486B-AEC9-846AAF50CF46}.Debug|Any CPU.Build.0 = Debug|Any CPU {52986844-698F-486B-AEC9-846AAF50CF46}.Release|Any CPU.ActiveCfg = Release|Any CPU {52986844-698F-486B-AEC9-846AAF50CF46}.Release|Any CPU.Build.0 = Release|Any CPU + {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -78,6 +84,7 @@ Global {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} {52986844-698F-486B-AEC9-846AAF50CF46} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} + {0C1A05D2-653D-4F88-B397-BA53E0BA7281} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C0FF62D6-1374-4939-A546-432862338528} diff --git a/src/Schemio.API/BaseWebQuery.cs b/src/Schemio.API/BaseWebQuery.cs new file mode 100644 index 0000000..797d3d3 --- /dev/null +++ b/src/Schemio.API/BaseWebQuery.cs @@ -0,0 +1,171 @@ +using Microsoft.Extensions.Logging; +using Schemio.Core; +using Schemio.Core.Helpers; + +namespace Schemio.API +{ + public abstract class BaseWebQuery : BaseQuery, IWebQuery + where TQueryResult : IWebResponse + { + protected Uri BaseAddress; + + protected BaseWebQuery() : this(string.Empty) + { + } + + protected BaseWebQuery(string baseAddress) + { + if (!string.IsNullOrEmpty(baseAddress)) + BaseAddress = new Uri(baseAddress); + } + + private Func UriDelegate = null; + + public override bool IsContextResolved() => UriDelegate != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + UriDelegate = GetUri(context, parentQueryResult); + } + + /// + /// Override to pass custom outgoing headers with the api request. + /// + /// + protected virtual IDictionary GetRequestHeaders() + { + return new Dictionary(); + } + + /// + /// Override to get custom incoming headers with the api response. + /// The headers collection will be present on `IApiResult.Headers` when api response includes any of the headers defined in this method. + /// + /// + protected virtual IEnumerable GetResponseHeaders() + { return []; } + + /// + /// Implement to construct the api web query. + /// + /// Request Context. Always available. + /// Result from parent Query. Only available when configured as nested web query. Else will be null. + /// + protected abstract Func GetUri(IDataContext context, IQueryResult parentApiResult = null); + + async Task IWebQuery.Run(IHttpClientFactory httpClientFactory, ILogger logger) + { + Constraints.NotNull(httpClientFactory); + + logger?.LogInformation($"Run api: {GetType().Name}"); + + var Uri = UriDelegate(); + + if (Uri == null) + return null; + + using (var client = httpClientFactory.CreateClient()) + { + logger?.LogInformation($"Executing web api on thread {Thread.CurrentThread.ManagedThreadId} (task {Task.CurrentId})"); + + try + { + HttpResponseMessage result; + + try + { + if (BaseAddress != null) + client.BaseAddress = BaseAddress; + + var requestHeaders = GetRequestHeaders(); + + if (requestHeaders != null && requestHeaders.Any()) + foreach (var header in requestHeaders) + client.DefaultRequestHeaders.Add(header.Key, header.Value); + + result = await client.GetAsync(Uri); + + var raw = result.Content.ReadAsStringAsync().Result; + + if (!string.IsNullOrWhiteSpace(raw)) + logger?.LogInformation($"Result.Content of executing web api: {Uri.AbsolutePath} is {raw}"); + + if (!result.IsSuccessStatusCode) + { + logger?.LogInformation($"Result of executing web api {Uri.AbsolutePath} is not success status code"); + return null; + } + + if (typeof(TQueryResult).UnderlyingSystemType != null && typeof(TQueryResult).UnderlyingSystemType.Name.Equals(typeof(CollectionResult<>).Name)) + { + var typeArgs = typeof(TQueryResult).GetGenericArguments(); + var arrType = typeArgs[0].MakeArrayType(); + var arrObject = raw.ToObject(arrType); + if (arrObject != null) + { + var resultType = typeof(CollectionResult<>); + var collectionType = resultType.MakeGenericType(typeArgs); + var collectionResult = (TQueryResult)Activator.CreateInstance(collectionType, arrObject); + + SetResponseHeaders(result, collectionResult); + + return collectionResult; + } + } + else + { + var obj = raw.ToObject(typeof(TQueryResult)); + if (obj != null) + { + var resObj = (TQueryResult)obj; + SetResponseHeaders(result, resObj); + return resObj; + } + } + } + catch (TaskCanceledException ex) + { + logger?.LogWarning(ex, $"An error occurred while sending the request. Query URL: {Uri.AbsolutePath}"); + } + catch (HttpRequestException ex) + { + logger?.LogWarning(ex, $"An error occurred while sending the request. Query URL: {Uri.AbsolutePath}"); + } + } + catch (AggregateException ex) + { + logger?.LogInformation($"Web api {GetType().Name} failed"); + foreach (var e in ex.InnerExceptions) + logger?.LogError(e, ""); + } + } + + return null; + } + + private void SetResponseHeaders(HttpResponseMessage response, TQueryResult? result) + { + if (response.Headers == null || result == null) + return; + + var headers = GetResponseHeaders(); + + if (headers != null && headers.Any()) + foreach (var header in headers) + { + if (!response.Headers.Any(r => r.Key == header)) + continue; + + var responseHeader = response.Headers.First(r => r.Key == header); + + var value = responseHeader.Value != null && responseHeader.Value.Any() + ? responseHeader.Value.ElementAt(0) + : string.Empty; + + result.Headers ??= new Dictionary(); + + result.Headers.Add(responseHeader.Key, value); + } + } + } +} \ No newline at end of file diff --git a/src/Schemio.API/IWebQuery.cs b/src/Schemio.API/IWebQuery.cs new file mode 100644 index 0000000..1c50a43 --- /dev/null +++ b/src/Schemio.API/IWebQuery.cs @@ -0,0 +1,10 @@ +using Microsoft.Extensions.Logging; +using Schemio.Core; + +namespace Schemio.API +{ + public interface IWebQuery : IQuery + { + Task Run(IHttpClientFactory httpClientFactory, ILogger logger = null); + } +} \ No newline at end of file diff --git a/src/Schemio.API/IWebResponse.cs b/src/Schemio.API/IWebResponse.cs new file mode 100644 index 0000000..51e9325 --- /dev/null +++ b/src/Schemio.API/IWebResponse.cs @@ -0,0 +1,9 @@ +using Schemio.Core; + +namespace Schemio.API +{ + public interface IWebResponse : IQueryResult + { + IDictionary Headers { get; internal set; } + } +} \ No newline at end of file diff --git a/src/Schemio.API/QueryEngine.cs b/src/Schemio.API/QueryEngine.cs new file mode 100644 index 0000000..2ea14c9 --- /dev/null +++ b/src/Schemio.API/QueryEngine.cs @@ -0,0 +1,30 @@ +using Microsoft.Extensions.Logging; +using Schemio.Core; +using Schemio.Core.Helpers; + +namespace Schemio.API +{ + public class QueryEngine : IQueryEngine + { + private readonly ILogger logger; + private readonly IHttpClientFactory httpClientFactory; + + public QueryEngine(IHttpClientFactory httpClientFactory, ILogger logger = null) + { + this.httpClientFactory = httpClientFactory; + this.logger = logger; + + Constraints.NotNull(httpClientFactory); + } + + public bool CanExecute(IQuery query) => query != null && query is IWebQuery; + + public async Task Execute(IQuery query) + { + if (query == null || !(query is IWebQuery q)) + return null; + + return await q.Run(httpClientFactory, logger); + } + } +} \ No newline at end of file diff --git a/src/Schemio.API/Schemio.API.csproj b/src/Schemio.API/Schemio.API.csproj new file mode 100644 index 0000000..d51b5fc --- /dev/null +++ b/src/Schemio.API/Schemio.API.csproj @@ -0,0 +1,17 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + diff --git a/src/Schemio.Core/CreateSchema.cs b/src/Schemio.Core/CreateSchema.cs index 43e9ff0..8b0b7bc 100644 --- a/src/Schemio.Core/CreateSchema.cs +++ b/src/Schemio.Core/CreateSchema.cs @@ -76,7 +76,7 @@ public IMapOrComplete Map(ISchemaPa public Mappings GetMappings => this; - public IEnumerable> Create() => this; + public IEnumerable> End() => this; } public class Mapping : @@ -125,7 +125,7 @@ public interface IMapOrComplete : IMap> Create(); + IEnumerable> End(); } public interface IWithDependents diff --git a/src/Schemio.Core/Helpers/Constraints.cs b/src/Schemio.Core/Helpers/Constraints.cs new file mode 100644 index 0000000..a6351a1 --- /dev/null +++ b/src/Schemio.Core/Helpers/Constraints.cs @@ -0,0 +1,11 @@ +namespace Schemio.Core.Helpers +{ + public static class Constraints + { + public static void NotNull(this T value) + { + if (value == null) + throw new ArgumentNullException(typeof(T).Name); + } + } +} \ No newline at end of file diff --git a/src/Schemio.Core/Helpers/JsonExtensions.cs b/src/Schemio.Core/Helpers/JsonExtensions.cs new file mode 100644 index 0000000..d841e5e --- /dev/null +++ b/src/Schemio.Core/Helpers/JsonExtensions.cs @@ -0,0 +1,11 @@ +using System.Text.Json; + +namespace Schemio.Core.Helpers +{ + public static class JsonExtensions + { + public static string? ToJson(this object value) => value != null ? JsonSerializer.Serialize(value) : null; + + public static object? ToObject(this string value, Type type) => !string.IsNullOrEmpty(value) ? JsonSerializer.Deserialize(value, type) : null; + } +} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs index 9c8aa10..2a8238d 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs @@ -73,7 +73,7 @@ public override IEnumerable> GetSchema() .Map>(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents .Map>(For.Paths("customer/orders/order/items"))) - ).Create(); + ).End(); } } } diff --git a/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 80e0148..a094b45 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -15,7 +15,7 @@ public override IEnumerable> GetSchema() .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents .Map(For.Paths("customer/orders/order/items"))) - ).Create(); + ).End(); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index a9dcc68..b5f1dd2 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Schemio.Core; +using Schemio.Core.Helpers; using Schemio.Core.PathMatchers; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 6ef1d5a..067e327 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -16,7 +16,7 @@ public override IEnumerable> GetSchema() .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents .Map(For.Paths("customer/orders/order/items"))) - ).Create(); + ).End(); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs index 445576b..cb4df27 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -1,6 +1,4 @@ -using System.Diagnostics.Contracts; using Schemio.Core; -using Schemio.Core.Helpers; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; diff --git a/tests/Schemio.EntityFramework.Tests/JsonExtensions.cs b/tests/Schemio.EntityFramework.Tests/JsonExtensions.cs deleted file mode 100644 index c255245..0000000 --- a/tests/Schemio.EntityFramework.Tests/JsonExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Text.Json; - -namespace Schemio.EntityFramework.Tests -{ - public static class JsonExtensions - { - public static string ToJson(this T obj) - { - if (obj == null) - throw new ArgumentNullException(nameof(obj)); - - return JsonSerializer.Serialize(obj); - } - } -} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index c62d17a..470a766 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -2,9 +2,9 @@ using Microsoft.Data.Sqlite; using Microsoft.Extensions.DependencyInjection; using Schemio.Core; +using Schemio.Core.Helpers; using Schemio.Core.PathMatchers; using Schemio.SQL; -using Schemio.SQL.Tests; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas; diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 553d556..85fa6e5 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -16,7 +16,7 @@ public override IEnumerable> GetSchema() .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents .Map(For.Paths("customer/orders/order/items"))) - ).Create(); + ).End(); } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs index fa033d6..c9a2615 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -1,5 +1,4 @@ using Schemio.Core; -using Schemio.Core.Helpers; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; diff --git a/tests/Schemio.SQL.Tests/JsonExtensions.cs b/tests/Schemio.SQL.Tests/JsonExtensions.cs deleted file mode 100644 index 656f17e..0000000 --- a/tests/Schemio.SQL.Tests/JsonExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Text.Json; - -namespace Schemio.SQL.Tests -{ - public static class JsonExtensions - { - public static string ToJson(this T obj) - { - if (obj == null) - throw new ArgumentNullException(nameof(obj)); - - return JsonSerializer.Serialize(obj); - } - } -} \ No newline at end of file From b6972fb4405bc60b2710b1ef1c7ad00e40577e8e Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Thu, 14 Nov 2024 11:46:37 +0000 Subject: [PATCH 10/64] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 76ebe4a..1cbb00a 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ | Schemio.Core|[![NuGet version](https://badge.fury.io/nu/Schemio.Core.svg)](https://badge.fury.io/nu/Schemio.Core) | Provides `core` functionality to configure nested queries and transformers. With ability to map schema paths (XPath/JSONPath) to entity's object graph. `No QueryEngine` provided and requires implementing IQueryEngine to execute IQuery instances. | | Schemio.SQL|[![NuGet version](https://badge.fury.io/nu/Schemio.SQL.svg)](https://badge.fury.io/nu/Schemio.SQL)| Provides schemio with query engine using `Dapper` to execute SQL queries. | | Schemio.EntityFramework|[![NuGet version](https://badge.fury.io/nu/Schemio.EntityFramework.svg)](https://badge.fury.io/nu/Schemio.EntityFramework)| Provides schemio with `Entity Framework` query engine to execute queries using DbContext. | +| Schemio.Api|[![NuGet version](https://badge.fury.io/nu/Schemio.Api.svg)](https://badge.fury.io/nu/Schemio.Api)| Provides schemio with `Web Api` query engine to execute apis using HttpClient. | ## Concept ### What is Schemio? From 32f134839618be84161ce025b539a43fbe63e1cd Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 14 Nov 2024 21:19:27 +0000 Subject: [PATCH 11/64] - Checkpoint: Readme Partial Update --- Developer Guide.md | 480 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 480 insertions(+) create mode 100644 Developer Guide.md diff --git a/Developer Guide.md b/Developer Guide.md new file mode 100644 index 0000000..65ef710 --- /dev/null +++ b/Developer Guide.md @@ -0,0 +1,480 @@ +# Developer Guide + +## i. Installation + +`Schemio` allows you to aggregate data from heterogeneous data stores offering `SQL` & `API` packages out of the box below. SQL queries are supported by `Dapper` and `EntityFramework` engines. You could also `extend` Schemio to provide your own implementation(s) of `Query` and supporting `Query Engine` to retrieve data from `custom` data store(s). + +Below are the Nuget packages available. + +`Scemio.Core` - Install to extend schemio to implement `custom` querying engine. +``` +NuGet\Install-Package Schemio.Core +``` +`Schemio.SQL` - Install when you would like to include SQL `Dapper` queries to access SQL database. +``` +NuGet\Install-Package Schemio.SQL +``` +`Schemio.EntityFramework` - Install when you would like to include SQL `EntityFramework` queries to access SQL database. +``` +NuGet\Install-Package Schemio.EntityFramework +``` +`Schemio.Api` - Install when you would like to include web api queries with `HttpClient` query engine. +``` +NuGet\Install-Package Schemio.Api +``` +## ii. Implementation: Using Schemio + +To use **Schemio** you need to do the below steps +- **Step 1**: Define the aggregated `Entity`. +- **Step 2**: Setup the aggregate `Configuration` comprising of `Query`/`Transformer` hierarchical nested mappings. +- **Step 3**: Construct the `DataProvider` with required dependencies. + +### Step 1. Define Aggregate Entity. +To create an aggregate `Entity`, implement the class from `IEntity` interface. This is the entity that will be returned as aggregated result from multiple queries assembled to execute against homogeneous or heterogeneous data storage's. + +Below is an example `Customer` entity. + +``` +public class Customer : IEntity +{ + public int CustomerId { get; set; } + public string CustomerCode { get; set; } + public string CustomerName { get; set; } + public Communication Communication { get; set; } + public Order[] Orders { get; set; } +} +``` + +For the customer class, we can see there are three levels of nesting in the object graph. +- Level 1 with paths: `Customer` +- Level 2 with paths: `Customer.Communication` and `Customer.Orders` +- Level 3 with paths: `Customer.Orders.Items` + +If we choose XML Schema Definition (XSD) for the Customer entity then XPaths for nesting levels should be. +``` +- Level 1 with XPath: Customer +- Level 2 with XPaths: Customer/Communication and Customer/Orders +- Level 3 with XPath: Customer/Orders/Order/Items/Item +``` +### Step 2: Setup Entity Aggregate Configuration +To define `Entity Aggregate`, derive from `EntityAggregate` class where `TEntity` is aggregate entity in context (ie. `IEntity`). + +The `Entity Aggregate` is basically a configuration with `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. +* `Query` is an implementation to `fetch` data for mapped sections of object graph. +* `Transformer` is an implementation to `map` data fetched by the associated query to the relevant sections of the entity's object graph. + +Below is an example Entity Aggregate Configuration for the Customer Entity. + +``` +internal class CustomerAggregate : EntityAggregate +{ + public override IEnumerable> GetSchema() + { + return CreateSchema.For() + .Map(For.Paths("customer"), + customer => customer.Dependents + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), + customerOrders => customerOrders.Dependents + .Map(For.Paths("customer/orders/order/items")))) + .End(); + } +} +``` +`CustomerAggregate` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. +`XPaths` are used to identify the schema paths in the object graph. Alternately, you could use your own representation to name the pairs or map the object graph. However, you would need to provide the `ISchemaPathmatcher` implementation to managing path matching. + +#### i. Query/Transformer Mapping +Every `Query` type in the `EntityAggregate` definition should have a complementing `Transformer` type. +You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. + +Below is the snippet from `CustomerAggregate` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. +``` + .Map(For.Paths("customer")) +``` + +#### ii. Nested Query/Transformer Mappings +You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query context. + +The query/transformer mappings can be `nested` to `5` levels down. + +Below is snippet to show nesting of `CommunicationQuery` as child to `CustomerQuery`. +``` +.Map(For.Paths("customer"), -- Parent + customer => customer.Dependents + .Map(For.Paths("customer/communication")) -- Child +``` + +Execution Flow +* In parent/child hierarchy, the first parent query executes first, followed by its immediate children. The execution flows in sequence to the last child query in order of its nesting. +* While executing the output of the parent is passed in to the child query to resolve query context and get it ready for execution. +* Transformers are also executed in the same sequence to map data to the Aggregate Entity. +* When a query path for nested query is included for execution, all the parent queries involved in that object graph get included for execution in order of its nesting. + +Please see the execution sequence below for queries and transformers nested in `CustomerAggregate` implemented above. + +image + +#### iii. Query Class +`Query` - The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. + +`QueryEngine` is an implementation of `IQueryEngine` to execute queries with supported data storage to return query result (ie. Result instance of `IQueryResult`). + +Depending on the Nuget package(s) installed, you could implement `SQL` and `API` queries. +* `SQL` queries execute to get data from SQL database using `Dapper` or `EntityFramework` engines. +* `API` query executes web api to call an `endpoint` using `HTTPClient` supported engine to get data. + +**Important**: You can combine heterogeneous queries in the Entity Aggregate configuration to target various data stores. + +Example of SQL & API queries are below. +You need to override the `GetQuery(IDataContext context, IQueryResult parentQueryResult)` method to return query delegate (package specific implementation). +* `IDataContext` is the context parameter passed to DataProvider to get aggregated results (. Aggregated Entity). This parameter is always available for both parent and child queries. +* `IQueryResult` parameter is only available when query is configured in child mode, else will be null. + +##### `Schemio.SQL` - with `Dapper` Query implementation. + +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseSQLQuery +{ + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. + var customer = (CustomerContext)context.Entity; + + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition + ( + "select CustomerId as Id, " + + "Customer_Name as Name," + + "Customer_Code as Code " + + $"from TCustomer where customerId={customer.CustomerId}" + )); + } +} +``` +2. Example Child Query - OrdersQuery +``` +internal class OrdersQuery : BaseSQLQuery> +{ + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer query. + var customer = (CustomerResult)parentQueryResult; + + return async connection => + { + var items = await connection.QueryAsync(new CommandDefinition + ( + "select OrderId, " + + "OrderNo, " + + "OrderDate " + + "from TOrder " + + $"where customerId={customer.Id}" + )); + + return new CollectionResult(items); + }; + } +} +``` + +##### `Schemio.EntityFramework` - with `EntityFramework` Query implementation + +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseSQLQuery +{ + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. parentQueryResult will be null. + var customer = (CustomerContext)context.Entity; + + return async dbContext => + { + var result = await dbContext.Set() + .Where(c => c.Id == customer.CustomerId) + .Select(c => new CustomerResult + { + Id = c.Id, + Name = c.Name, + Code = c.Code + }) + .FirstOrDefaultAsync(); + + return result; + }; + } +} +``` +2. Example Child Query - OrdersQuery +``` + internal class OrdersQuery : BaseSQLQuery> + { + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer query. + var customer = (CustomerResult)parentQueryResult; + + return async dbContext => + { + var items = await dbContext.Set() + .Where(p => p.Customer.Id == customer.Id) + .Select(c => new OrderResult + { + CustomerId = c.CustomerId, + OrderId = c.OrderId, + Date = c.Date, + OrderNo = c.OrderNo + }) + .ToListAsync(); + + return new CollectionResult(items); + }; + } + } +``` +##### `Schemio.Api` - with `HttpClient` Query implementation +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseApiQuery +{ + public CustomerQuery() : base(Endpoints.BaseAddress) + { + } + protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. + var customer = (CustomerContext)context.Entity; + + return ()=> new Uri(string.Format($"v2/customers/{customer.CustomerId}); + } +} +``` +2. Example Child Query - OrdersQuery +``` +internal class OrdersQuery : BaseApiQuery> +{ + public OrdersQuery() : base(Endpoints.BaseAddress) + { + } + protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer api. + var customer = (CustomerResult)parentApiResult; + + return ()=> new Uri(string.Format($"v2/customers/{customer.Id}/orders); + } +} +``` + +#### iv. Transformer Class +The purpose of the transformer class is to transform the data fetched by the linked query class and map to the configured object graph of the entity. + +To define a transformer class, you need to implement `BaseTransformer` +- where TEntity is Aggregate Entity implementing `IEntity`. eg. Customer. +- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. + +Example transformer - Customer Transformer +``` +internal class CustomerTransform : BaseTransformer +{ + public override Customer Transform(CustomerResult queryResult, Customer entity) + { + var customer = entity ?? new Customer(); + customer.CustomerId = queryResult.Id; + customer.CustomerName = queryResult.CustomerName; + customer.CustomerCode = queryResult.CustomerCode; + return customer; + } +} +``` + +**Note**: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. + +For the example query/transformer mapping +``` +.Map(For.Paths("customer/communication")) +``` +The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. + +### Step 3. DataProvider Setup +Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. + +- `ILogger>` - logger implementation. default no logger. +- `IEntityAggrgate` - mandatory entity schema definition for entity's object graph. +- `IQueryEngine` - implementation of query engines to execute queries (of type IQuery) with supported data storage's. Can configure multiples. +- `ISchemaPathMatcher` - implementation of schema path matcher. Provide custom implementation when required to use custom schema paths with entity aggregate configuration. + +Example constructors: + +i. With `EntitySchema` and `QueryEngine` implementations. + +``` + public DataProvider(IEntitySchema entitySchema, params IQueryEngine[] queryEngines) +``` +ii. With `Logger`, `EntitySchema`, `QueryEngine`, and `SchemaPathmMatcher` for custom schema paths mapping in entity schema definition. +``` + public DataProvider(ILogger> logger, IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) + +``` +#### Schemio.SQL +Construct DataProvider using `Schemio.SQL.QueryEngine` query engine. + +``` +var provider = new DataProvider(new CustomerSchema(), new Schemio.SQL.QueryEngine(new SQLConfiguration())); +``` + +#### Schemio.EntityFramework +Construct DataProvider using `Schemio.EntityFramework.QueryEngine` query engine. + +``` +var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.QueryEngine()); +``` + +### Using IOC for registrations + +#### Registrations + +With ServiceCollection, you need to register the below dependencies. +``` + // Register core services + services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); + services.AddTransient(typeof(ITransformExecutor<>), typeof(TransformExecutor<>)); + services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); + services.AddTransient(); + + // Register instance of ISchemaPathMatcher - Json, XPath or Custom. + services.AddTransient(c => new XPathMatcher()); + + // Enable logging + services.AddLogging(); + + //For Dapper SQL engine. + services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { + Providername = "System.Data.SqlClient", + ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" + }}); + + // For entity framework engine. + services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); + services.AddTransient(c => new QueryEngine(c.GetService>()); + + + // Register schema definitions. eg CustomerSchema + services.AddTransient, CustomerSchema>(); +``` + +`Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. + +#### Data Provider (DI) +To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` + +## Extend Schemio +### Custom Query Engine +To provide custom query engine and query implementations, you need to extend the base interfaces as depicted below +- IQueryEngine interface to implement the custom query engine to be used with schemio. +``` +public interface IQueryEngine +{ + /// + /// Detrmines whether an instance of query can be executed with this engine. + /// + /// instance of IQuery. + /// Boolean; True when supported. + bool CanExecute(IQuery query); + + /// + /// Executes a list of queries returning a list of aggregated results. + /// + /// List of IQuery instances. + /// List of query results. Instances of IQueryResult. + IEnumerable Execute(IEnumerable queries); +} +``` +Example Entity Framework implementation is below +``` +public class QueryEngine : IQueryEngine where T : DbContext + { + private readonly IDbContextFactory _dbContextFactory; + + public QueryEngine(IDbContextFactory _dbContextFactory) + { + this._dbContextFactory = _dbContextFactory; + } + + public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; + + public IEnumerable Execute(IEnumerable queries) + { + var output = new List(); + + using (var dbcontext = _dbContextFactory.CreateDbContext()) + { + foreach (var query in queries) + { + var results = ((ISQLQuery)query).Run(dbcontext); + + if (results == null) + continue; + + output.AddRange(results); + } + + return output.ToArray(); + } + } + } +``` +- Provide base implementation supporting IQuery, IRootQuery & IChildQuery interfaces. +- You can implement the parent and child base class implementations to construct for queries to be executed with custom engine implementation above. + +For Parent Query base implementation, see example below. +``` +public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery + where TQueryParameter : IQueryParameter + where TQueryResult : IQueryResult + { + /// + /// Get query delegate with implementation to return query result. + /// Delegate returns a collection from db. + /// + /// Func> + public abstract IEnumerable Run(DbContext dbContext); + } +``` + +### Custom Schema Language +You can provide your own schema language support for use in entity schema definition to map sections of object graph. + +To do this you need to follow the below steps +* Provide entity schema definition with query/transformer pairs using custom schema language paths +* Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. This matcher is used by query builder to pick queries for matched paths against the configured p in Entity schema definition. +``` +public interface ISchemaPathMatcher + { + bool IsMatch(string inputPath, ISchemaPaths configuredPaths); + } +``` +Example implementation of XPath matcher is below. +``` +public class XPathMatcher : ISchemaPathMatcher + { + private static readonly Regex ancestorRegex = new Regex(@"=ancestor::(?'path'.*?)(/@|\[.*\]/@)", RegexOptions.Compiled); + + public bool IsMatch(string inputXPath, ISchemaPaths configuredXPaths) + { + if (inputXPath == null) + return false; + + if (configuredXPaths.Paths.Any(x => inputXPath.ToLower().Contains(x.ToLower()))) + return true; + + if (configuredXPaths.Paths.Any(x => inputXPath.Contains("ancestor::") + && ancestorRegex.Matches(inputXPath).Select(match => match.Groups["path"].Value).Distinct().Any(match => x.EndsWith(match)))) + return true; + + return false; + } + } +``` \ No newline at end of file From 3826b567904fba6c135cbba83d9e819099356142 Mon Sep 17 00:00:00 2001 From: Ninja Date: Mon, 18 Nov 2024 22:59:18 +0000 Subject: [PATCH 12/64] - Checkpoint: Periodic code checkin --- Developer Guide.md | 267 +++++++++++------- src/Schemio.API/BaseWebQuery.cs | 4 +- src/Schemio.Core/CollectionResult.cs | 4 + ...EntitySchema.cs => EntityConfiguration.cs} | 4 +- ...ntitySchema.cs => IEntityConfiguration.cs} | 2 +- src/Schemio.Core/IQuery.cs | 5 - src/Schemio.Core/IQueryRunner.cs | 7 + src/Schemio.Core/Impl/DataProvider.cs | 4 +- src/Schemio.Core/Impl/EntityBuilder.cs | 4 +- src/Schemio.Core/Impl/QueryBuilder.cs | 4 +- src/Schemio.Core/ServicesExtensions.cs | 82 +++++- .../DataProvider.Tests/EntityBuilderTests.cs | 30 +- .../DataProvider.Tests/QueryBuilderTests.cs | 20 +- .../DataProvider.Tests/QueryExecutorTests.cs | 6 +- .../Configuration/CustomerConfiguration.cs | 21 ++ .../Queries/CommunicationQuery.cs} | 10 +- .../Queries/CommunicationRecord.cs} | 4 +- .../Queries/CustomerQuery.cs | 10 +- .../Queries/CustomerRecord.cs} | 4 +- .../Configuration/Queries/OrderItemRecord.cs | 8 + .../Configuration/Queries/OrderItemsQuery.cs | 19 ++ .../Configuration/Queries/OrderRecord.cs | 9 + .../Queries/OrdersQuery.cs} | 10 +- .../Transforms/CommunicationTransform.cs} | 8 +- .../Transforms/CustomerTransform.cs | 8 +- .../Transforms/OrderItemsTransform.cs} | 8 +- .../Transforms/OrdersTransform.cs} | 8 +- .../EntitySchemas/CustomerSchema.cs | 21 -- .../Queries/CustomerOrderItemsQuery.cs | 19 -- .../EntitySetup/Queries/CustomerParameter.cs | 7 - .../Queries/OrderCollectionResult.cs | 15 - .../Queries/OrderItemCollectionResult.cs | 13 - .../EntitySetup/Queries/OrderItemParameter.cs | 7 - tests/Schemio.Core.Tests/UnitTest1.cs | 16 -- .../Schemio.EntityFramework.Tests/BaseTest.cs | 11 +- ...omerSchema.cs => CustomerConfiguration.cs} | 2 +- .../Queries/CommunicationQuery.cs | 8 +- ...cationResult.cs => CommunicationRecord.cs} | 2 +- .../Queries/CustomerParameter.cs | 9 - .../EntitySchemas/Queries/CustomerQuery.cs | 6 +- .../{CustomerResult.cs => CustomerRecord.cs} | 2 +- .../Queries/OrderItemParameter.cs | 20 -- ...{OrderItemResult.cs => OrderItemRecord.cs} | 2 +- .../EntitySchemas/Queries/OrderItemsQuery.cs | 10 +- .../{OrderResult.cs => OrderRecord.cs} | 2 +- .../EntitySchemas/Queries/OrdersQuery.cs | 10 +- .../Transforms/CommunicationTransform.cs | 4 +- .../Transforms/CustomerTransform.cs | 4 +- .../Transforms/OrderItemsTransform.cs | 4 +- .../Transforms/OrdersTransform.cs | 4 +- tests/Schemio.SQL.Tests/BaseTest.cs | 10 +- .../CustomerConfiguration.cs} | 2 +- .../Queries/CommunicationQuery.cs | 8 +- .../Queries/CommunicationRecord.cs} | 2 +- .../Queries/CustomerQuery.cs | 6 +- .../Queries/CustomerRecord.cs} | 2 +- .../Queries/OrderItemRecord.cs} | 2 +- .../Queries/OrderItemsQuery.cs | 10 +- .../Queries/OrderRecord.cs} | 2 +- .../Queries/OrdersQuery.cs | 10 +- .../Transforms/CommunicationTransform.cs | 4 +- .../Transforms/CustomerTransform.cs | 4 +- .../Transforms/OrderItemsTransform.cs | 4 +- .../Transforms/OrdersTransform.cs | 4 +- .../Queries/CustomerParameter.cs | 9 - .../Queries/OrderItemParameter.cs | 20 -- 66 files changed, 467 insertions(+), 400 deletions(-) rename src/Schemio.Core/{BaseEntitySchema.cs => EntityConfiguration.cs} (80%) rename src/Schemio.Core/{IEntitySchema.cs => IEntityConfiguration.cs} (82%) create mode 100644 src/Schemio.Core/IQueryRunner.cs create mode 100644 tests/Schemio.Core.Tests/EntitySetup/Configuration/CustomerConfiguration.cs rename tests/Schemio.Core.Tests/EntitySetup/{Queries/CustomerCommunicationQuery.cs => Configuration/Queries/CommunicationQuery.cs} (53%) rename tests/Schemio.Core.Tests/EntitySetup/{Queries/CommunicationResult.cs => Configuration/Queries/CommunicationRecord.cs} (75%) rename tests/Schemio.Core.Tests/EntitySetup/{ => Configuration}/Queries/CustomerQuery.cs (57%) rename tests/Schemio.Core.Tests/EntitySetup/{Queries/CustomerResult.cs => Configuration/Queries/CustomerRecord.cs} (57%) create mode 100644 tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemRecord.cs create mode 100644 tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemsQuery.cs create mode 100644 tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderRecord.cs rename tests/Schemio.Core.Tests/EntitySetup/{Queries/CustomerOrdersQuery.cs => Configuration/Queries/OrdersQuery.cs} (53%) rename tests/Schemio.Core.Tests/EntitySetup/{Transforms/CustomerCommunicationTransform.cs => Configuration/Transforms/CommunicationTransform.cs} (73%) rename tests/Schemio.Core.Tests/EntitySetup/{ => Configuration}/Transforms/CustomerTransform.cs (53%) rename tests/Schemio.Core.Tests/EntitySetup/{Transforms/CustomerOrderItemsTransform.cs => Configuration/Transforms/OrderItemsTransform.cs} (72%) rename tests/Schemio.Core.Tests/EntitySetup/{Transforms/CustomerOrdersTransform.cs => Configuration/Transforms/OrdersTransform.cs} (56%) delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs delete mode 100644 tests/Schemio.Core.Tests/UnitTest1.cs rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/{CustomerSchema.cs => CustomerConfiguration.cs} (93%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CommunicationResult.cs => CommunicationRecord.cs} (90%) delete mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CustomerResult.cs => CustomerRecord.cs} (82%) delete mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{OrderItemResult.cs => OrderItemRecord.cs} (85%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{OrderResult.cs => OrderRecord.cs} (86%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas/CustomerSchema.cs => EntityConfiguration/CustomerConfiguration.cs} (92%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Queries/CommunicationQuery.cs (84%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas/Queries/CommunicationResult.cs => EntityConfiguration/Queries/CommunicationRecord.cs} (90%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Queries/CustomerQuery.cs (71%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas/Queries/CustomerResult.cs => EntityConfiguration/Queries/CustomerRecord.cs} (82%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas/Queries/OrderItemResult.cs => EntityConfiguration/Queries/OrderItemRecord.cs} (84%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Queries/OrderItemsQuery.cs (79%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas/Queries/OrderResult.cs => EntityConfiguration/Queries/OrderRecord.cs} (83%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Queries/OrdersQuery.cs (69%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Transforms/CommunicationTransform.cs (92%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Transforms/CustomerTransform.cs (75%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Transforms/OrderItemsTransform.cs (92%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Transforms/OrdersTransform.cs (87%) delete mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs delete mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs diff --git a/Developer Guide.md b/Developer Guide.md index 65ef710..db3535a 100644 --- a/Developer Guide.md +++ b/Developer Guide.md @@ -57,16 +57,16 @@ If we choose XML Schema Definition (XSD) for the Customer entity then XPaths for - Level 3 with XPath: Customer/Orders/Order/Items/Item ``` ### Step 2: Setup Entity Aggregate Configuration -To define `Entity Aggregate`, derive from `EntityAggregate` class where `TEntity` is aggregate entity in context (ie. `IEntity`). +To define `Entity Configuration`, derive from `EntityConfiguration` class where `TEntity` is aggregate entity in context (ie. `IEntity`). -The `Entity Aggregate` is basically a configuration with `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. +The `Entity Configuration` is basically `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. * `Query` is an implementation to `fetch` data for mapped sections of object graph. * `Transformer` is an implementation to `map` data fetched by the associated query to the relevant sections of the entity's object graph. -Below is an example Entity Aggregate Configuration for the Customer Entity. +Below is an example Entity Configuration for the Customer Entity. ``` -internal class CustomerAggregate : EntityAggregate +internal class CustomerConfiguration : EntityConfiguration { public override IEnumerable> GetSchema() { @@ -81,14 +81,14 @@ internal class CustomerAggregate : EntityAggregate } } ``` -`CustomerAggregate` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. +`CustomerConfiguration` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. `XPaths` are used to identify the schema paths in the object graph. Alternately, you could use your own representation to name the pairs or map the object graph. However, you would need to provide the `ISchemaPathmatcher` implementation to managing path matching. #### i. Query/Transformer Mapping -Every `Query` type in the `EntityAggregate` definition should have a complementing `Transformer` type. +Every `Query` type in the Entity `Configuration` definition should have a complementing `Transformer` type. You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. -Below is the snippet from `CustomerAggregate` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. +Below is the snippet from `CustomerConfiguration` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. ``` .Map(For.Paths("customer")) ``` @@ -111,7 +111,7 @@ Execution Flow * Transformers are also executed in the same sequence to map data to the Aggregate Entity. * When a query path for nested query is included for execution, all the parent queries involved in that object graph get included for execution in order of its nesting. -Please see the execution sequence below for queries and transformers nested in `CustomerAggregate` implemented above. +Please see the execution sequence below for queries and transformers nested in `CustomerConfiguration` implemented above. image @@ -124,7 +124,7 @@ Depending on the Nuget package(s) installed, you could implement `SQL` and `API` * `SQL` queries execute to get data from SQL database using `Dapper` or `EntityFramework` engines. * `API` query executes web api to call an `endpoint` using `HTTPClient` supported engine to get data. -**Important**: You can combine heterogeneous queries in the Entity Aggregate configuration to target various data stores. +**Important**: You can combine heterogeneous queries in the Entity configuration to target different data stores. Example of SQL & API queries are below. You need to override the `GetQuery(IDataContext context, IQueryResult parentQueryResult)` method to return query delegate (package specific implementation). @@ -300,46 +300,14 @@ The Communication transformer should map data only to the `customer/communicatio ### Step 3. DataProvider Setup Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. -- `ILogger>` - logger implementation. default no logger. -- `IEntityAggrgate` - mandatory entity schema definition for entity's object graph. -- `IQueryEngine` - implementation of query engines to execute queries (of type IQuery) with supported data storage's. Can configure multiples. -- `ISchemaPathMatcher` - implementation of schema path matcher. Provide custom implementation when required to use custom schema paths with entity aggregate configuration. - -Example constructors: - -i. With `EntitySchema` and `QueryEngine` implementations. - -``` - public DataProvider(IEntitySchema entitySchema, params IQueryEngine[] queryEngines) -``` -ii. With `Logger`, `EntitySchema`, `QueryEngine`, and `SchemaPathmMatcher` for custom schema paths mapping in entity schema definition. -``` - public DataProvider(ILogger> logger, IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) - -``` -#### Schemio.SQL -Construct DataProvider using `Schemio.SQL.QueryEngine` query engine. - -``` -var provider = new DataProvider(new CustomerSchema(), new Schemio.SQL.QueryEngine(new SQLConfiguration())); -``` - -#### Schemio.EntityFramework -Construct DataProvider using `Schemio.EntityFramework.QueryEngine` query engine. - -``` -var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.QueryEngine()); -``` - -### Using IOC for registrations - -#### Registrations +#### Container Registrations With ServiceCollection, you need to register the below dependencies. + ``` // Register core services services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); - services.AddTransient(typeof(ITransformExecutor<>), typeof(TransformExecutor<>)); + services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); services.AddTransient(); @@ -360,19 +328,104 @@ With ServiceCollection, you need to register the below dependencies. services.AddTransient(c => new QueryEngine(c.GetService>()); - // Register schema definitions. eg CustomerSchema - services.AddTransient, CustomerSchema>(); + // Register each entity configuration. eg CustomerConfiguration + services.AddTransient, CustomerConfiguration>(); + + ``` + +`Please Note:` You can combine multiple query engines and implement supporting types of queries to execute on target data platforms. + + +#### Using Fluent interface for registrations + +i. Example registration: Schemio.SQL + +``` +// Enable DbProviderFactory. + DbProviderFactories.RegisterFactory(DbProviderName, SqliteFactory.Instance); + + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + + var configuration = new SQLConfiguration { ConnectionSettings = new ConnectionSettings { ConnectionString = connectionString, ProviderName = DbProviderName } }; + +// Enable logging + services.AddLogging(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(configuration)) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); ``` -`Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. +ii. Example registration: Schemio.EntityFramework + +``` + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + +// Enable DBContext Factory + services.AddDbContextFactory(options => + options.UseSqlite(connectionString)); + +// Enable logging + services.AddLogging(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + +``` +iii. Example registration: Schemio.API +``` + // Enable logging + services.AddLogging(); + + // Enable HttpClient + services.AddHttpClient(); + + services.UseSchemio() + .WithEngine() + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + +``` +iv. Example registration: Multiple Engines +``` + // Enable logging + services.AddLogging(); + + // Enable HttpClient + services.AddHttpClient(); + + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + +// Enable DBContext Factory + services.AddDbContextFactory(options => + options.UseSqlite(connectionString)); + + services.UseSchemio() + .WithEngine() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); +``` + +#### Data Provider + +##### i. Dependency Inject - IDataProvider -#### Data Provider (DI) To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` -## Extend Schemio -### Custom Query Engine -To provide custom query engine and query implementations, you need to extend the base interfaces as depicted below -- IQueryEngine interface to implement the custom query engine to be used with schemio. +##### ii. Call DataProvider.GetData(IDataContext) method. +TBC + +## Extending Schemio + +You could extend Schemio by providing your own custom implementation of the query engine (`IQueryEngine`) and query (`IQuery`) to execute queries on custom target data platform. + +To do this, you need to extend the base interfaces as depicted below. +### i. IQueryEngine +Implement `IQueryEngine` interface to provide the custom query engine to be used with schemio. ``` public interface IQueryEngine { @@ -384,79 +437,97 @@ public interface IQueryEngine bool CanExecute(IQuery query); /// - /// Executes a list of queries returning a list of aggregated results. + /// Executes a given query returning query result. /// - /// List of IQuery instances. - /// List of query results. Instances of IQueryResult. - IEnumerable Execute(IEnumerable queries); + /// Custom instance of IQuery. + /// Task of IQueryResult. + Task Execute(IQuery> query); } ``` Example Entity Framework implementation is below ``` public class QueryEngine : IQueryEngine where T : DbContext +{ + private readonly IDbContextFactory _dbContextFactory; + + public QueryEngine(IDbContextFactory _dbContextFactory) { - private readonly IDbContextFactory _dbContextFactory; + this._dbContextFactory = _dbContextFactory; + } + + public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; - public QueryEngine(IDbContextFactory _dbContextFactory) + public Task Execute(IQuery query) + { + using (var dbcontext = _dbContextFactory.CreateDbContext()) { - this._dbContextFactory = _dbContextFactory; + var result = ((ISQLQuery)query).Run(dbcontext); + return result; } + } +} +``` +### ii. IQuery +With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query custom query engine. - public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; +To do this, you need to extend `BaseQuery` where TQueryResult is `IQueryResult`. And, provide overrides for below methods. +- `bool IsContextResolved()` +Engine calls this method to confirm whether the query is ready for execution. Return true when query context is resolved. +- `void ResolveQuery(IDataContext context, IQueryResult parentQueryResult)` +This method is invoked by schemio to resolve the query context required for execution ith supporting query engine. `IQueryResult` parameter is only available when the custom query is configured in nested or child mode. - public IEnumerable Execute(IEnumerable queries) - { - var output = new List(); - using (var dbcontext = _dbContextFactory.CreateDbContext()) - { - foreach (var query in queries) - { - var results = ((ISQLQuery)query).Run(dbcontext); +Example - EntityFramework Supported query implementation is shown below. +``` + public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery + where TQueryResult : IQueryResult + { + private Func> QueryDelegate = null; - if (results == null) - continue; + public override bool IsContextResolved() => QueryDelegate != null; - output.AddRange(results); - } + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + QueryDelegate = GetQuery(context, parentQueryResult); + } - return output.ToArray(); - } - } - } -``` -- Provide base implementation supporting IQuery, IRootQuery & IChildQuery interfaces. -- You can implement the parent and child base class implementations to construct for queries to be executed with custom engine implementation above. + async Task ISQLQuery.Run(DbContext dbContext) + { + return await QueryDelegate(dbContext); + } -For Parent Query base implementation, see example below. -``` -public abstract class BaseSQLQuery - : BaseQuery, ISQLQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// Func> - public abstract IEnumerable Run(DbContext dbContext); - } + /// + /// Get query delegate to return query result. + /// + /// + /// + /// + protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); + } ``` -### Custom Schema Language -You can provide your own schema language support for use in entity schema definition to map sections of object graph. +### iii. Custom Schema Paths + +Additionally, You can provide your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. To do this you need to follow the below steps -* Provide entity schema definition with query/transformer pairs using custom schema language paths -* Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. This matcher is used by query builder to pick queries for matched paths against the configured p in Entity schema definition. +i. Provide entity schema definition with query/transformer pairs using custom schema language paths. + +Example - with Dummy schema mapping +``` +.Map(For.Paths("customer$orders")) +``` + +ii. Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. +`Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. ``` public interface ISchemaPathMatcher { bool IsMatch(string inputPath, ISchemaPaths configuredPaths); } ``` -Example implementation of XPath matcher is below. +Example implementation of XPathMatcher is below. ``` public class XPathMatcher : ISchemaPathMatcher { diff --git a/src/Schemio.API/BaseWebQuery.cs b/src/Schemio.API/BaseWebQuery.cs index 797d3d3..e8f4027 100644 --- a/src/Schemio.API/BaseWebQuery.cs +++ b/src/Schemio.API/BaseWebQuery.cs @@ -25,7 +25,7 @@ protected BaseWebQuery(string baseAddress) public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { - UriDelegate = GetUri(context, parentQueryResult); + UriDelegate = GetQuery(context, parentQueryResult); } /// @@ -51,7 +51,7 @@ protected virtual IEnumerable GetResponseHeaders() /// Request Context. Always available. /// Result from parent Query. Only available when configured as nested web query. Else will be null. /// - protected abstract Func GetUri(IDataContext context, IQueryResult parentApiResult = null); + protected abstract Func GetQuery(IDataContext context, IQueryResult parentApiResult = null); async Task IWebQuery.Run(IHttpClientFactory httpClientFactory, ILogger logger) { diff --git a/src/Schemio.Core/CollectionResult.cs b/src/Schemio.Core/CollectionResult.cs index bd7c28d..d5600b1 100644 --- a/src/Schemio.Core/CollectionResult.cs +++ b/src/Schemio.Core/CollectionResult.cs @@ -5,5 +5,9 @@ public class CollectionResult : List, IQueryResult public CollectionResult(IEnumerable list) : base(list) { } + + public CollectionResult() + { + } } } \ No newline at end of file diff --git a/src/Schemio.Core/BaseEntitySchema.cs b/src/Schemio.Core/EntityConfiguration.cs similarity index 80% rename from src/Schemio.Core/BaseEntitySchema.cs rename to src/Schemio.Core/EntityConfiguration.cs index e013e9a..4e2c3d0 100644 --- a/src/Schemio.Core/BaseEntitySchema.cs +++ b/src/Schemio.Core/EntityConfiguration.cs @@ -4,11 +4,11 @@ namespace Schemio.Core /// Implement to configure schema path mappings for an Entity. /// /// Entity type - public abstract class BaseEntitySchema : IEntitySchema where TEntity : IEntity + public abstract class EntityConfiguration : IEntityConfiguration where TEntity : IEntity { public IEnumerable> Mappings { get; } - public BaseEntitySchema() + public EntityConfiguration() { Mappings = GetSchema(); } diff --git a/src/Schemio.Core/IEntitySchema.cs b/src/Schemio.Core/IEntityConfiguration.cs similarity index 82% rename from src/Schemio.Core/IEntitySchema.cs rename to src/Schemio.Core/IEntityConfiguration.cs index 061b3f5..a7e34c1 100644 --- a/src/Schemio.Core/IEntitySchema.cs +++ b/src/Schemio.Core/IEntityConfiguration.cs @@ -4,7 +4,7 @@ namespace Schemio.Core /// Implement to configure schema path mappings for an Entity. /// /// Entity type - public interface IEntitySchema where TEntity : IEntity + public interface IEntityConfiguration where TEntity : IEntity { /// /// Entity schema mappings. diff --git a/src/Schemio.Core/IQuery.cs b/src/Schemio.Core/IQuery.cs index 11e548f..9fe0b58 100644 --- a/src/Schemio.Core/IQuery.cs +++ b/src/Schemio.Core/IQuery.cs @@ -13,9 +13,4 @@ public interface IQuery : IQueryRunner void ResolveQuery(IDataContext context, IQueryResult parentQueryResult = null); } - - public interface IQueryRunner - { - Task Run(IQueryEngine engine); - } } \ No newline at end of file diff --git a/src/Schemio.Core/IQueryRunner.cs b/src/Schemio.Core/IQueryRunner.cs new file mode 100644 index 0000000..13abbbb --- /dev/null +++ b/src/Schemio.Core/IQueryRunner.cs @@ -0,0 +1,7 @@ +namespace Schemio.Core +{ + public interface IQueryRunner + { + Task Run(IQueryEngine engine); + } +} \ No newline at end of file diff --git a/src/Schemio.Core/Impl/DataProvider.cs b/src/Schemio.Core/Impl/DataProvider.cs index c23555f..0c4b8df 100644 --- a/src/Schemio.Core/Impl/DataProvider.cs +++ b/src/Schemio.Core/Impl/DataProvider.cs @@ -12,7 +12,7 @@ public class DataProvider : IDataProvider private readonly IEntityBuilder entityBuilder; public DataProvider( - IEntitySchema entitySchema, + IEntityConfiguration entitySchema, params IQueryEngine[] queryEngines) : this(null, new QueryBuilder(entitySchema, new XPathMatcher()), new QueryExecutor(queryEngines), new EntityBuilder(entitySchema)) @@ -21,7 +21,7 @@ public DataProvider( public DataProvider( ILogger> logger, - IEntitySchema entitySchema, + IEntityConfiguration entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) : this(logger, new QueryBuilder(entitySchema, schemaPathMatcher), diff --git a/src/Schemio.Core/Impl/EntityBuilder.cs b/src/Schemio.Core/Impl/EntityBuilder.cs index 7c232d1..48e6427 100644 --- a/src/Schemio.Core/Impl/EntityBuilder.cs +++ b/src/Schemio.Core/Impl/EntityBuilder.cs @@ -2,9 +2,9 @@ namespace Schemio.Core.Impl { public class EntityBuilder : IEntityBuilder where T : IEntity, new() { - private readonly IEntitySchema entitySchema; + private readonly IEntityConfiguration entitySchema; - public EntityBuilder(IEntitySchema entitySchema) + public EntityBuilder(IEntityConfiguration entitySchema) { this.entitySchema = entitySchema; } diff --git a/src/Schemio.Core/Impl/QueryBuilder.cs b/src/Schemio.Core/Impl/QueryBuilder.cs index 1b455ef..5de3cea 100644 --- a/src/Schemio.Core/Impl/QueryBuilder.cs +++ b/src/Schemio.Core/Impl/QueryBuilder.cs @@ -2,10 +2,10 @@ namespace Schemio.Core.Impl { public class QueryBuilder : IQueryBuilder where T : IEntity { - private readonly IEntitySchema entitySchema; + private readonly IEntityConfiguration entitySchema; private readonly ISchemaPathMatcher schemaPathMatcher; - public QueryBuilder(IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher) + public QueryBuilder(IEntityConfiguration entitySchema, ISchemaPathMatcher schemaPathMatcher) { this.entitySchema = entitySchema; this.schemaPathMatcher = schemaPathMatcher; diff --git a/src/Schemio.Core/ServicesExtensions.cs b/src/Schemio.Core/ServicesExtensions.cs index bdf3ce8..9094514 100644 --- a/src/Schemio.Core/ServicesExtensions.cs +++ b/src/Schemio.Core/ServicesExtensions.cs @@ -27,11 +27,89 @@ params Func[] queryEngines public static IServiceCollection AddEntitySchema(this IServiceCollection services) where TEntity : IEntity - where TSchema : IEntitySchema + where TSchema : IEntityConfiguration { - services.AddTransient(typeof(IEntitySchema), typeof(TSchema)); + services.AddTransient(typeof(IEntityConfiguration), typeof(TSchema)); return services; } + + public static SchemioOptionsBuilder UseSchemio(this IServiceCollection services) + { + services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); + services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); + services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); + services.AddTransient(); + + return new SchemioOptionsBuilder(services); + } + } + + public class SchemioOptionsBuilder : ISchemioOptions + { + public SchemioOptionsBuilder(IServiceCollection services) + { + Services = services; + } + + public IServiceCollection Services { get; } + + public ISchemioOptions WithEngine(Func queryEngines) + { + if (queryEngines != null) + { + Services.AddTransient(c => queryEngines(c)); + } + + return this; + } + + public ISchemioOptions WithEngine() where TEngine : IQueryEngine + { + Services.AddTransient(typeof(IQueryEngine), typeof(TEngine)); + + return this; + } + + public ISchemioOptions WithEngines(Func queryEngines) + { + if (queryEngines != null) + { + Services.AddTransient(c => queryEngines(c)); + } + + return this; + } + + public ISchemioOptions WithPathMatcher(Func pathMatcher) + { + if (pathMatcher != null) + Services.AddTransient(c => pathMatcher(c)); + + return this; + } + + public ISchemioOptions WithEntityConfiguration(Func> entityConfiguration) where T : class, IEntity + { + if (entityConfiguration != null) + { + Services.AddTransient(typeof(IEntityConfiguration), c => entityConfiguration(c)); + } + + return this; + } + } + + public interface ISchemioOptions + { + ISchemioOptions WithEngine(Func queryEngines); + + ISchemioOptions WithEngine() where TEngine : IQueryEngine; + + ISchemioOptions WithEngines(Func queryEngines); + + ISchemioOptions WithPathMatcher(Func pathMatcher); + + ISchemioOptions WithEntityConfiguration(Func> entityConfiguration) where T : class, IEntity; } } \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs index 2a8238d..d3ac786 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs @@ -1,6 +1,6 @@ using Schemio.Core.Impl; +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; namespace Schemio.Core.Tests.DataProvider.Tests { @@ -8,7 +8,7 @@ namespace Schemio.Core.Tests.DataProvider.Tests internal class EntityBuilderTests { private EntityBuilder _entityBuilder; - private IEntitySchema _entitySchema; + private IEntityConfiguration _entitySchema; private static List<(Type result, int InvocationCount)> TransformerInvocations; @@ -25,27 +25,27 @@ public void TestTransformExecutorForCorrectExecutionOfConfiguredTransforms() { var queryList = new List { - new CustomerResult{Id = 123, CustomerCode= "ABC", CustomerName="Ninja Labs"}, - new CommunicationResult{Id = 123, Email = "ninja@labs.com", Telephone = "0212345689"}, - new OrderCollectionResult(), - new OrderItemCollectionResult() + new CustomerRecord{Id = 123, CustomerCode= "ABC", CustomerName="Ninja Labs"}, + new CommunicationRecord{Id = 123, Email = "ninja@labs.com", Telephone = "0212345689"}, + new CollectionResult(), + new CollectionResult() }; var entity = _entityBuilder.Build(new DataContext(new EntityContext()), queryList); - var customerTransforms = TransformerInvocations.Where(x => x.result == typeof(CustomerResult)); + var customerTransforms = TransformerInvocations.Where(x => x.result == typeof(CustomerRecord)); Assert.That(customerTransforms.Count() == 1); Assert.That(customerTransforms.ElementAt(0).InvocationCount == 1); - var communicationTransforms = TransformerInvocations.Where(x => x.result == typeof(CommunicationResult)); + var communicationTransforms = TransformerInvocations.Where(x => x.result == typeof(CommunicationRecord)); Assert.That(communicationTransforms.Count() == 1); Assert.That(communicationTransforms.ElementAt(0).InvocationCount == 1); - var orderCollectionTransforms = TransformerInvocations.Where(x => x.result == typeof(OrderCollectionResult)); + var orderCollectionTransforms = TransformerInvocations.Where(x => x.result == typeof(CollectionResult)); Assert.That(orderCollectionTransforms.Count() == 1); Assert.That(orderCollectionTransforms.ElementAt(0).InvocationCount == 1); - var orderItemsCollectionTransforms = TransformerInvocations.Where(x => x.result == typeof(OrderItemCollectionResult)); + var orderItemsCollectionTransforms = TransformerInvocations.Where(x => x.result == typeof(CollectionResult)); Assert.That(orderItemsCollectionTransforms.Count() == 1); Assert.That(orderItemsCollectionTransforms.ElementAt(0).InvocationCount == 1); @@ -62,17 +62,17 @@ public override void Transform(TQueryResult queryResult, TEntity entity) } } - internal class MockCustomerSchema : BaseEntitySchema + internal class MockCustomerSchema : EntityConfiguration { public override IEnumerable> GetSchema() { return CreateSchema.For() - .Map>(For.Paths("customer/id", "customer/customercode", "customer/customername"), + .Map>(For.Paths("customer/id", "customer/customercode", "customer/customername"), customer => customer.Dependents - .Map>(For.Paths("customer/communication")) - .Map>(For.Paths("customer/orders"), + .Map>(For.Paths("customer/communication")) + .Map, Customer>>(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents - .Map>(For.Paths("customer/orders/order/items"))) + .Map, Customer>>(For.Paths("customer/orders/order/items"))) ).End(); } } diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs index 8838c45..48e5ca7 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs @@ -2,8 +2,8 @@ using Schemio.Core.PathMatchers; using Schemio.Core.Tests.EntitySetup; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.EntitySchemas; -using Schemio.Core.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Configuration; +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; namespace Schemio.Core.Tests.DataProvider.Tests { @@ -12,13 +12,13 @@ internal class QueryBuilderTests { private QueryBuilder _queryBuilder; - private IEntitySchema _entitySchema; + private IEntityConfiguration _entitySchema; private ISchemaPathMatcher _schemaPathMatcher; [SetUp] public void Setup() { - _entitySchema = new CustomerSchema(); + _entitySchema = new CustomerConfiguration(); /*----------------------------------------- * * @@ -75,7 +75,7 @@ public void TestQueryBuilderForCorrectParentQueryListWithOneChildren() Assert.That(parentQuery.GetType() == typeof(CustomerQuery)); var childQuery = parentQuery.Children.First(); - Assert.That(childQuery.GetType() == typeof(CustomerCommunicationQuery)); + Assert.That(childQuery.GetType() == typeof(CommunicationQuery)); } [Test] @@ -96,8 +96,8 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildren() var parentQuery = result.Queries.First(); Assert.That(parentQuery.GetType() == typeof(CustomerQuery)); - var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CustomerCommunicationQuery)); - var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CustomerOrdersQuery)); + var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CommunicationQuery)); + var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrdersQuery)); Assert.IsNotNull(communicationChildQuery); Assert.IsNotNull(ordersChildQuery); @@ -124,8 +124,8 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildrenAndOneChildF var parentQuery = result.Queries.First(); Assert.That(parentQuery.GetType() == typeof(CustomerQuery)); - var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CustomerCommunicationQuery)); - var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CustomerOrdersQuery)); + var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CommunicationQuery)); + var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrdersQuery)); Assert.IsNotNull(communicationChildQuery); Assert.IsNotNull(ordersChildQuery); @@ -133,7 +133,7 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildrenAndOneChildF // nested child query for order item in order query children as order items are included in paths Assert.That(ordersChildQuery.Children.Count, Is.EqualTo(1)); - var orderItemsChildQuery = ordersChildQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CustomerOrderItemsQuery)); + var orderItemsChildQuery = ordersChildQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrderItemsQuery)); Assert.IsNotNull(orderItemsChildQuery); } } diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs index fe87bf5..6d40035 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs @@ -3,8 +3,8 @@ using Schemio.Core.PathMatchers; using Schemio.Core.Tests.EntitySetup; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.EntitySchemas; -using Schemio.Core.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Configuration; +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; namespace Schemio.Core.Tests.DataProvider.Tests { @@ -42,7 +42,7 @@ public void TestQueryExecutorToCallEngineWhenQueriesExistForExecution() [Test] // TODO - All sequence assertions public void TestQueryExecutorToExecuteConfiguredQueriesInCorrectOrder() { - var querList = new QueryBuilder(new CustomerSchema(), new XPathMatcher()) + var querList = new QueryBuilder(new CustomerConfiguration(), new XPathMatcher()) .Build(new DataContext(new CustomerContext())); _queryExecutor.Execute(new DataContext(new EntityContext()), querList); diff --git a/tests/Schemio.Core.Tests/EntitySetup/Configuration/CustomerConfiguration.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/CustomerConfiguration.cs new file mode 100644 index 0000000..be8d432 --- /dev/null +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/CustomerConfiguration.cs @@ -0,0 +1,21 @@ +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; +using Schemio.Core.Tests.EntitySetup.Configuration.Transforms; +using Schemio.Core.Tests.EntitySetup.Entities; + +namespace Schemio.Core.Tests.EntitySetup.Configuration +{ + internal class CustomerConfiguration : EntityConfiguration + { + public override IEnumerable> GetSchema() + { + return CreateSchema.For() + .Map(For.Paths("customer/id", "customer/customercode", "customer/customername"), + customer => customer.Dependents + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), + customerOrders => customerOrders.Dependents + .Map(For.Paths("customer/orders/order/items"))) + ).End(); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationQuery.cs similarity index 53% rename from tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationQuery.cs index 2a9c08f..3136b90 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationQuery.cs @@ -1,16 +1,16 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries { - internal class CustomerCommunicationQuery : BaseQuery + internal class CommunicationQuery : BaseQuery { - private CustomerParameter QueryParameter; + private object QueryParameter; public override bool IsContextResolved() => QueryParameter != null; public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter + var customer = (CustomerRecord)parentQueryResult; + QueryParameter = new { CustomerId = customer.Id }; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationRecord.cs similarity index 75% rename from tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationRecord.cs index e001516..fe1274d 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationRecord.cs @@ -1,6 +1,6 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries { - public class CommunicationResult : IQueryResult + public class CommunicationRecord : IQueryResult { public int Id { get; set; } public string Telephone { get; set; } diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs similarity index 57% rename from tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs index 743844c..944a679 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs @@ -1,8 +1,8 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries { - public class CustomerQuery : BaseQuery + public class CustomerQuery : BaseQuery { - private CustomerParameter QueryParameter; + private object QueryParameter; public override bool IsContextResolved() => QueryParameter != null; @@ -10,9 +10,9 @@ public override void ResolveQuery(IDataContext context, IQueryResult parentQuery { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; - QueryParameter = new CustomerParameter + QueryParameter = new { - CustomerId = customer.CustomerId + customer.CustomerId }; } } diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerRecord.cs similarity index 57% rename from tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerRecord.cs index 83c141d..b56ec89 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerRecord.cs @@ -1,6 +1,6 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries { - public class CustomerResult : IQueryResult + public class CustomerRecord : IQueryResult { public int Id { get; set; } public string CustomerCode { get; set; } diff --git a/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemRecord.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemRecord.cs new file mode 100644 index 0000000..c7621c3 --- /dev/null +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemRecord.cs @@ -0,0 +1,8 @@ +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries +{ + public class OrderItemRecord + { + public int OrderId { get; set; } + public (int ItemId, string Name, decimal Cost)[] Items { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemsQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemsQuery.cs new file mode 100644 index 0000000..3e9d021 --- /dev/null +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemsQuery.cs @@ -0,0 +1,19 @@ +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries +{ + internal class OrderItemsQuery : BaseQuery> + { + private object QueryParameter; + + public override bool IsContextResolved() => QueryParameter != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to order query. + var ordersResult = (CollectionResult)parentQueryResult; + QueryParameter = new + { + OrderIds = new List(ordersResult.Select(x => x.OrderId)) + }; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderRecord.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderRecord.cs new file mode 100644 index 0000000..21811ed --- /dev/null +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderRecord.cs @@ -0,0 +1,9 @@ +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries +{ + public class OrderRecord + { + public int OrderId { get; set; } + public string OrderNo { get; set; } + public DateTime Date { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrdersQuery.cs similarity index 53% rename from tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrdersQuery.cs index 2c7d9f2..9acd1bc 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrdersQuery.cs @@ -1,16 +1,16 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries { - internal class CustomerOrdersQuery : BaseQuery> + internal class OrdersQuery : BaseQuery> { - private CustomerParameter QueryParameter; + private object QueryParameter; public override bool IsContextResolved() => QueryParameter != null; public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Does not execute as child to any query. - var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter + var customer = (CustomerRecord)parentQueryResult; + QueryParameter = new { CustomerId = customer.Id }; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CommunicationTransform.cs similarity index 73% rename from tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CommunicationTransform.cs index df2bce9..c608aec 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CommunicationTransform.cs @@ -1,11 +1,11 @@ +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Core.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Configuration.Transforms { - public class CustomerCommunicationTransform : BaseTransformer + public class CommunicationTransform : BaseTransformer { - public override void Transform(CommunicationResult queryResult, Customer entity) + public override void Transform(CommunicationRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Communication = new Communication diff --git a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CustomerTransform.cs similarity index 53% rename from tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CustomerTransform.cs index 86c8377..83d982e 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CustomerTransform.cs @@ -1,11 +1,11 @@ +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Core.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Configuration.Transforms { - public class CustomerTransform : BaseTransformer + public class CustomerTransform : BaseTransformer { - public override void Transform(CustomerResult queryResult, Customer entity) + public override void Transform(CustomerRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Id = queryResult.Id; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrderItemsTransform.cs similarity index 72% rename from tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrderItemsTransform.cs index 7e60442..3fa722c 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrderItemsTransform.cs @@ -1,11 +1,11 @@ +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Core.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Configuration.Transforms { - public class CustomerOrderItemsTransform : BaseTransformer, Customer> + public class OrderItemsTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult queryResult, Customer entity) + public override void Transform(CollectionResult queryResult, Customer entity) { if (queryResult == null || entity?.Orders == null) return; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrdersTransform.cs similarity index 56% rename from tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrdersTransform.cs index 40fda5a..dc0c536 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrdersTransform.cs @@ -1,11 +1,11 @@ +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Core.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Configuration.Transforms { - public class CustomerOrdersTransform : BaseTransformer, Customer> + public class OrdersTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult queryResult, Customer entity) + public override void Transform(CollectionResult queryResult, Customer entity) { if (queryResult == null) return; diff --git a/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs deleted file mode 100644 index a094b45..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; -using Schemio.Core.Tests.EntitySetup.Transforms; - -namespace Schemio.Core.Tests.EntitySetup.EntitySchemas -{ - internal class CustomerSchema : BaseEntitySchema - { - public override IEnumerable> GetSchema() - { - return CreateSchema.For() - .Map(For.Paths("customer/id", "customer/customercode", "customer/customername"), - customer => customer.Dependents - .Map(For.Paths("customer/communication")) - .Map(For.Paths("customer/orders"), - customerOrders => customerOrders.Dependents - .Map(For.Paths("customer/orders/order/items"))) - ).End(); - } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs deleted file mode 100644 index eb49793..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries -{ - internal class CustomerOrderItemsQuery : BaseQuery> - { - private OrderItemParameter QueryParameter; - - public override bool IsContextResolved() => QueryParameter != null; - - public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Execute as child to order query. - var ordersResult = (OrderCollectionResult)parentQueryResult; - QueryParameter = new OrderItemParameter - { - OrderIds = new List(ordersResult.Orders.Select(x => x.OrderId)) - }; - } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs deleted file mode 100644 index 89b0ec0..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries -{ - public class CustomerParameter : IQueryParameter - { - public int CustomerId { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs deleted file mode 100644 index 6642402..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries -{ - public class OrderCollectionResult : IQueryResult - { - public int CustomerId { get; set; } - public OrderValue[] Orders { get; set; } - } - - public class OrderValue - { - public int OrderId { get; set; } - public string OrderNo { get; set; } - public DateTime Date { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs deleted file mode 100644 index 11fc936..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries -{ - public class OrderItemCollectionResult : IQueryResult - { - public List OrderItems { get; set; } - } - - public class OrderItemValue - { - public int OrderId { get; set; } - public (int ItemId, string Name, decimal Cost)[] Items { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs deleted file mode 100644 index cd287fe..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries -{ - internal class OrderItemParameter : IQueryParameter - { - public List OrderIds { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/UnitTest1.cs b/tests/Schemio.Core.Tests/UnitTest1.cs deleted file mode 100644 index 460dce4..0000000 --- a/tests/Schemio.Core.Tests/UnitTest1.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Schemio.Core.Tests -{ - public class Tests - { - [SetUp] - public void Setup() - { - } - - [Test] - public void Test1() - { - Assert.Pass(); - } - } -} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index b5f1dd2..93d65ba 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -38,9 +38,14 @@ public void Setup() services.AddLogging(); - services.UseSchemio(new XPathMatcher(), - c => new QueryEngine(c.GetService>())) - .AddEntitySchema(); + //services.UseSchemio(new XPathMatcher(), + // c => new QueryEngine(c.GetService>())) + // .AddEntitySchema(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); // 4. Build the service provider _serviceProvider = services.BuildServiceProvider(); diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerConfiguration.cs similarity index 93% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerConfiguration.cs index 067e327..d3769bc 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerConfiguration.cs @@ -5,7 +5,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas { - internal class CustomerSchema : BaseEntitySchema + internal class CustomerConfiguration : EntityConfiguration { public override IEnumerable> GetSchema() { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index 6f5c92e..9135c5a 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,15 +4,15 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { - var customer = (CustomerResult)parentQueryResult; + var customer = (CustomerRecord)parentQueryResult; return async dbContext => await dbContext.Set() .Where(p => p.Customer.Id == customer.Id) - .Select(c => new CommunicationResult + .Select(c => new CommunicationRecord { Id = c.CommunicationId, AddressId = c.Address.AddressId, diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationRecord.cs similarity index 90% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationRecord.cs index 97746a9..29a8b01 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationRecord.cs @@ -3,7 +3,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { [CacheResult] - public class CommunicationResult : IQueryResult + public class CommunicationRecord : IQueryResult { public int Id { get; set; } public string Telephone { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs deleted file mode 100644 index 314ffec..0000000 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Schemio.Core; - -namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries -{ - public class CustomerParameter : IQueryParameter - { - public int CustomerId { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index 65fd283..8a8d10b 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -4,9 +4,9 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : BaseSQLQuery { - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. parentQueryResult will be null. var customer = (CustomerContext)context.Entity; @@ -15,7 +15,7 @@ protected override Func> GetQuery(IDataContext c { var result = await dbContext.Set() .Where(c => c.Id == customer.CustomerId) - .Select(c => new CustomerResult + .Select(c => new CustomerRecord { Id = c.Id, Name = c.Name, diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerRecord.cs similarity index 82% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerRecord.cs index 1260b75..ae7f175 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerResult : IQueryResult + public class CustomerRecord : IQueryResult { public int Id { get; set; } public string Code { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs deleted file mode 100644 index 7150937..0000000 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Schemio.Core; -using Schemio.Core.Helpers; - -namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries -{ - internal class OrderItemParameter : IQueryParameter - { - public OrderItemParameter() - { - OrderIds = new List(); - } - - public string ToCsv() - { - return OrderIds.ToCSV(); - } - - public List OrderIds { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemRecord.cs similarity index 85% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemRecord.cs index ccb1406..bb1c216 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class OrderItemResult : IQueryResult + public class OrderItemRecord : IQueryResult { public int OrderId { get; set; } public int ItemId { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index 8cbf59c..b9efa05 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -4,18 +4,18 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. - var ordersResults = (CollectionResult)parentQueryResult; + var ordersResults = (CollectionResult)parentQueryResult; return async dbContext => { var items = await dbContext.Set() .Where(p => ordersResults.Select(o => o.OrderId).Contains(p.Order.OrderId)) - .Select(c => new OrderItemResult + .Select(c => new OrderItemRecord { ItemId = c.ItemId, Name = c.Name, @@ -24,7 +24,7 @@ protected override Func>> GetQ }) .ToListAsync(); - return new CollectionResult(items); + return new CollectionResult(items); }; } } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderRecord.cs similarity index 86% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderRecord.cs index 06ecfec..2892312 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class OrderResult : IQueryResult + public class OrderRecord : IQueryResult { public int CustomerId { get; set; } public int OrderId { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index 96fe6f0..306f388 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,18 +4,18 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; + var customer = (CustomerRecord)parentQueryResult; return async dbContext => { var items = await dbContext.Set() .Where(p => p.Customer.Id == customer.Id) - .Select(c => new OrderResult + .Select(c => new OrderRecord { CustomerId = c.CustomerId, OrderId = c.OrderId, @@ -24,7 +24,7 @@ protected override Func>> GetQuery }) .ToListAsync(); - return new CollectionResult(items); + return new CollectionResult(items); }; } } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs index 0930475..bd52373 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { - public class CommunicationTransform : BaseTransformer + public class CommunicationTransform : BaseTransformer { - public override void Transform(CommunicationResult queryResult, Customer entity) + public override void Transform(CommunicationRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Communication = new Communication diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs index dd05b2f..ae467a0 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { - public class CustomerTransform : BaseTransformer + public class CustomerTransform : BaseTransformer { - public override void Transform(CustomerResult queryResult, Customer entity) + public override void Transform(CustomerRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Id = queryResult.Id; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs index 6e585ef..d6b9efa 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs @@ -5,9 +5,9 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { - public class OrderItemsTransform : BaseTransformer, Customer> + public class OrderItemsTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult collectionResult, Customer customer) + public override void Transform(CollectionResult collectionResult, Customer customer) { if (collectionResult == null || !collectionResult.Any() || customer.Orders == null) return; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs index cb4df27..0a29b7e 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { - public class OrdersTransform : BaseTransformer, Customer> + public class OrdersTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult collectionResult, Customer entity) + public override void Transform(CollectionResult collectionResult, Customer entity) { if (collectionResult == null || !collectionResult.Any()) return; diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index 470a766..a6c059a 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -5,6 +5,7 @@ using Schemio.Core.Helpers; using Schemio.Core.PathMatchers; using Schemio.SQL; +using Schemio.SQL.Tests.EntitySetup; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas; @@ -42,8 +43,13 @@ public void Setup() services.AddLogging(); - services.UseSchemio(new XPathMatcher(), c => new QueryEngine(configuration)) - .AddEntitySchema(); + //services.UseSchemio(new XPathMatcher(), c => new QueryEngine(configuration)) + // .AddEntitySchema(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(configuration)) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); // 4. Build the service provider _serviceProvider = services.BuildServiceProvider(); diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/CustomerConfiguration.cs similarity index 92% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/CustomerConfiguration.cs index 85fa6e5..37797f7 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/CustomerConfiguration.cs @@ -5,7 +5,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas { - internal class CustomerSchema : BaseEntitySchema + internal class CustomerConfiguration : EntityConfiguration { public override IEnumerable> GetSchema() { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs similarity index 84% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs index b5d23c8..0a1b735 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs @@ -4,14 +4,14 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; + var customer = (CustomerRecord)parentQueryResult; - return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( "select c.CommunicationId as ContactId, " + "c.Phone as Telephone, " + diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationRecord.cs similarity index 90% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationRecord.cs index e89da6f..a71784b 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationRecord.cs @@ -3,7 +3,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { [CacheResult] - public class CommunicationResult : IQueryResult + public class CommunicationRecord : IQueryResult { public int ContactId { get; set; } public string Telephone { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs similarity index 71% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs index ba8bdca..d254f27 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs @@ -4,14 +4,14 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : BaseSQLQuery { - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; - return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( "select CustomerId as Id, " + "Customer_Name as Name," + diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerRecord.cs similarity index 82% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerRecord.cs index 78891f1..67038cf 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerResult : IQueryResult + public class CustomerRecord : IQueryResult { public int Id { get; set; } public string Code { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemRecord.cs similarity index 84% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemRecord.cs index 58baec3..f9667ee 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class OrderItemResult : IQueryResult + public class OrderItemRecord : IQueryResult { public int OrderId { get; set; } public int ItemId { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs similarity index 79% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs index 2ab58a7..141a162 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs @@ -5,16 +5,16 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child query to order query taking OrderResult to resolve query parameter. - var ordersResult = (CollectionResult)parentQueryResult; + var ordersResult = (CollectionResult)parentQueryResult; return async connection => { - var items = await connection.QueryAsync(new CommandDefinition + var items = await connection.QueryAsync(new CommandDefinition ( "select OrderId, " + "OrderItemId as ItemId, " + @@ -23,7 +23,7 @@ protected override Func>> $"from TOrderItem where OrderId in ({ordersResult.Select(o => o.OrderId).ToCSV()})" )); - return new CollectionResult(items); + return new CollectionResult(items); }; } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderRecord.cs similarity index 83% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderRecord.cs index 3176222..336df23 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class OrderResult : IQueryResult + public class OrderRecord : IQueryResult { public int OrderId { get; set; } public string OrderNo { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs similarity index 69% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs index eec0892..60f17b4 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs @@ -4,16 +4,16 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; + var customer = (CustomerRecord)parentQueryResult; return async connection => { - var items = await connection.QueryAsync(new CommandDefinition + var items = await connection.QueryAsync(new CommandDefinition ( "select OrderId, " + "OrderNo, " + @@ -22,7 +22,7 @@ protected override Func>> GetQ $"where customerId={customer.Id}" )); - return new CollectionResult(items); + return new CollectionResult(items); }; } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CommunicationTransform.cs similarity index 92% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CommunicationTransform.cs index 9cd5dca..caadad1 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CommunicationTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms { - public class CommunicationTransform : BaseTransformer + public class CommunicationTransform : BaseTransformer { - public override void Transform(CommunicationResult queryResult, Customer entity) + public override void Transform(CommunicationRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Communication = new Communication diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CustomerTransform.cs similarity index 75% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CustomerTransform.cs index 5866926..8669ffa 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CustomerTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms { - public class CustomerTransform : BaseTransformer + public class CustomerTransform : BaseTransformer { - public override void Transform(CustomerResult queryResult, Customer entity) + public override void Transform(CustomerRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Id = queryResult.Id; diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrderItemsTransform.cs similarity index 92% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrderItemsTransform.cs index 8d06010..0dc1f85 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrderItemsTransform.cs @@ -5,9 +5,9 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms { - public class OrderItemsTransform : BaseTransformer, Customer> + public class OrderItemsTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult collectionResult, Customer customer) + public override void Transform(CollectionResult collectionResult, Customer customer) { if (collectionResult == null || !collectionResult.Any() || customer.Orders == null) return; diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrdersTransform.cs similarity index 87% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrdersTransform.cs index c9a2615..c11a122 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrdersTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms { - public class OrdersTransform : BaseTransformer, Customer> + public class OrdersTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult collectionResult, Customer contract) + public override void Transform(CollectionResult collectionResult, Customer contract) { if (collectionResult == null || !collectionResult.Any()) return; diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs deleted file mode 100644 index 1a0c34d..0000000 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Schemio.Core; - -namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries -{ - public class CustomerParameter : IQueryParameter - { - public int CustomerId { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs deleted file mode 100644 index 4a07efb..0000000 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Schemio.Core; -using Schemio.Core.Helpers; - -namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries -{ - internal class OrderItemParameter : IQueryParameter - { - public OrderItemParameter() - { - OrderIds = new List(); - } - - public string ToCsv() - { - return OrderIds.ToCSV(); - } - - public List OrderIds { get; set; } - } -} \ No newline at end of file From 7878509522d52e777c0ed5e5c7947b0536ac45fa Mon Sep 17 00:00:00 2001 From: Ninja Date: Mon, 18 Nov 2024 23:01:37 +0000 Subject: [PATCH 13/64] - Update v2.0.0 Developer Guide --- DeveloperGuide.md | 823 ++++++++++++++++++++++++---------------------- 1 file changed, 425 insertions(+), 398 deletions(-) diff --git a/DeveloperGuide.md b/DeveloperGuide.md index 5610659..4bd9031 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -1,389 +1,313 @@ # Developer Guide + ## i. Installation -Install the latest nuget package as appropriate. -`Scemio.Core` - for installing schemio for `bespoke` implementation of query engine. +`Schemio` allows you to aggregate data from heterogeneous data stores offering `SQL` & `API` packages out of the box below. SQL queries are supported by `Dapper` and `EntityFramework` engines. You could also `extend` Schemio to provide your own implementation(s) of `Query` and supporting `Query Engine` to retrieve data from `custom` data store(s). + +Below are the Nuget packages available. + +`Scemio.Core` - Install to extend schemio to implement `custom` querying engine. ``` NuGet\Install-Package Schemio.Core ``` -`Schemio.SQL` - for installing schemio for SQL with `Dapper` engine. +`Schemio.SQL` - Install when you would like to include SQL `Dapper` queries to access SQL database. ``` NuGet\Install-Package Schemio.SQL ``` -`Schemio.EntityFramework` - for installing schemio for SQL with `EntityFramework` engine. +`Schemio.EntityFramework` - Install when you would like to include SQL `EntityFramework` queries to access SQL database. ``` NuGet\Install-Package Schemio.EntityFramework ``` +`Schemio.Api` - Install when you would like to include web api queries with `HttpClient` query engine. +``` +NuGet\Install-Package Schemio.Api +``` ## ii. Implementation: Using Schemio -To use schemio you need to -> Step 1 - Setup the entity to be fetched. -> -> Step 2 - Construct the `DataProvider` with required dependencies. - -### Step 1. Entity Setup -Setting up an entity includes the following. -* Define the `entity` to be fetched using `DataProvider` - which is basically a class with entire object graph (with nested typed properties). -* Define the `entity schema` which is schema path mapping of the entire entity object graph. Each mapping consists of a `query` and `transformer` pair mapped to a sections of object graph (using XPaths or JsonPath for schema paths) - -#### 1.1 Entity -To mark the class as Entity, implement the class from `IEntity` interface. -Bear in mind this is the root entity to be fetched. - ->Below is an example `Customer` entity. -> -> ``` -> public class Customer : IEntity -> { -> public int CustomerId { get; set; } -> public string CustomerCode { get; set; } -> public string CustomerName { get; set; } -> public Communication Communication { get; set; } -> public Order[] Orders { get; set; } -> } -> ``` +To use **Schemio** you need to do the below steps +- **Step 1**: Define the aggregated `Entity`. +- **Step 2**: Setup the aggregate `Configuration` comprising of `Query`/`Transformer` hierarchical nested mappings. +- **Step 3**: Construct the `DataProvider` with required dependencies. + +### Step 1. Define Aggregate Entity. +To create an aggregate `Entity`, implement the class from `IEntity` interface. This is the entity that will be returned as aggregated result from multiple queries assembled to execute against homogeneous or heterogeneous data storage's. + +Below is an example `Customer` entity. + +``` +public class Customer : IEntity +{ + public int CustomerId { get; set; } + public string CustomerCode { get; set; } + public string CustomerName { get; set; } + public Communication Communication { get; set; } + public Order[] Orders { get; set; } +} +``` For the customer class, we can see there are three levels of nesting in the object graph. - Level 1 with paths: `Customer` - Level 2 with paths: `Customer.Communication` and `Customer.Orders` - Level 3 with paths: `Customer.Orders.Items` -If we choose XML Schema Definition (XSD) for the object schema of the above Customer class fo mapping with XPATHs -then below is the Customer XSD and XPaths for different nesting levels. - -> Customer XSD is -> ``` -> Coming soon... -> ``` - -> Schema mappings using XPaths are -> ``` -> - Level 1 with XPath: Customer -> - Level 2 with XPaths: Customer/Communication and Customer/Orders -> - Level 3 with XPath: Customer/Orders/Order/Items/Item - -#### 1.2 Entity Schema Definition -Define entity schema definition for the entity in context. - -* `Entity schema definition` is basically a configuration with hierarchy of `query/transformer` pairs mapped to the schema paths pointing to different levels of the entity's object graph. -* `Query` is an implementation to fetch data for a certain section of object graph from an underlying data storage. -* `Transformer` is an implementation to map the data fetched by the linked query to the relevant sections of the entity's object graph. - -To define Entity schema, implement `BaseEntitySchema` interface where T is entity in context. - -> -Example Entity Schema Definition (using XPaths) -> The `Customer` entity with `three` levels of `nesting` is configured below in `CustomerSchema` definition to show `query/transformer` pairs nested accordingly mapping to object graph using the XPath definitions. -> -> ``` -> internal class CustomerSchema : BaseEntitySchema -> { -> public override IEnumerable> GetSchema() -> { -> return CreateSchema.For() -> .Map(For.Paths("customer"), -> customer => customer.Dependents -> .Map(For.Paths("customer/communication")) -> .Map(For.Paths("customer/orders"), -> customerOrders => customerOrders.Dependents -> .Map(For.Paths("customer/orders/order/items"))) -> ).Create(); -> } -> } ->``` - -##### i. Query/Transformer Mapping -Every `Query` type in the `EntitySchema` definition should have a complementing `Transformer` type. +If we choose XML Schema Definition (XSD) for the Customer entity then XPaths for nesting levels should be. +``` +- Level 1 with XPath: Customer +- Level 2 with XPaths: Customer/Communication and Customer/Orders +- Level 3 with XPath: Customer/Orders/Order/Items/Item +``` +### Step 2: Setup Entity Aggregate Configuration +To define `Entity Configuration`, derive from `EntityConfiguration` class where `TEntity` is aggregate entity in context (ie. `IEntity`). + +The `Entity Configuration` is basically `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. +* `Query` is an implementation to `fetch` data for mapped sections of object graph. +* `Transformer` is an implementation to `map` data fetched by the associated query to the relevant sections of the entity's object graph. + +Below is an example Entity Configuration for the Customer Entity. + +``` +internal class CustomerConfiguration : EntityConfiguration +{ + public override IEnumerable> GetSchema() + { + return CreateSchema.For() + .Map(For.Paths("customer"), + customer => customer.Dependents + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), + customerOrders => customerOrders.Dependents + .Map(For.Paths("customer/orders/order/items")))) + .End(); + } +} +``` +`CustomerConfiguration` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. +`XPaths` are used to identify the schema paths in the object graph. Alternately, you could use your own representation to name the pairs or map the object graph. However, you would need to provide the `ISchemaPathmatcher` implementation to managing path matching. + +#### i. Query/Transformer Mapping +Every `Query` type in the Entity `Configuration` definition should have a complementing `Transformer` type. You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. ->Below is the snippet from `CustomerSchema` definition. ->``` -> .Map(For.Paths("customer", "customer/code", "customer/name")) ->``` +Below is the snippet from `CustomerConfiguration` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. +``` + .Map(For.Paths("customer")) +``` -##### ii. Nested Query/Transformer Mappings -* You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query paramter. -* The query/transformer mappings can be `nested` to `5` levels down. -* When certain `schema paths` are included in the DataProvider `request` to fetch the Entity, the relevant query and transformer pairs get executed in the order of their nesting to hydrate the entity. +#### ii. Nested Query/Transformer Mappings +You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query context. ->Example nesting of Communication query under Customer query. ->``` -> .Map(For.Paths("customer"), -- Parent -> customer => customer.Dependents -> .Map(For.Paths("customer/communication")) -- Child ->``` +The query/transformer mappings can be `nested` to `5` levels down. + +Below is snippet to show nesting of `CommunicationQuery` as child to `CustomerQuery`. +``` +.Map(For.Paths("customer"), -- Parent + customer => customer.Dependents + .Map(For.Paths("customer/communication")) -- Child +``` +Execution Flow +* In parent/child hierarchy, the first parent query executes first, followed by its immediate children. The execution flows in sequence to the last child query in order of its nesting. +* While executing the output of the parent is passed in to the child query to resolve query context and get it ready for execution. +* Transformers are also executed in the same sequence to map data to the Aggregate Entity. +* When a query path for nested query is included for execution, all the parent queries involved in that object graph get included for execution in order of its nesting. -Please see the execution sequence below for queries and transformers nested in CustomerSchema implemented above. +Please see the execution sequence below for queries and transformers nested in `CustomerConfiguration` implemented above. image +#### iii. Query Class +`Query` - The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. -`Please Note:` If you need to support custom schema language for mapping the object graph, then see extending schemio section below. - - -#### 1.2.1 Query Class -The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. - -QueryEngine is an implementation of `IQueryEngine` to execute queries against a supported data storage to return a collection of query results (ie. of type IQueryResult). - -As explained above, You can configure a query in `Parent` or `Child` (nested) mode in nested hierarchies. - -To define a `parent` or `child` query, derive from `BaseQuery` -* `TQueryParameter` is basically the class that holds the `inputs` required by the root query for execution. It is an implementation of `IQueryParameter` type. -* `TQueryResult` is the result that will be returned from executing the root query. It is an implementation of `IQueryResult` type. - -The query parameter needs to be resolved before executing the query with QueryEngine. -To resolve the query parameter you need to override `ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult)` method - -i. Parent Query - In `parent` mode, which is usually configured at level 1 to query the root entity, the query parameter is resolved using the `IDataContext` parameter passed to data provider class. `IQueryResult` parameter in ResolveQueryParameter() will be `null`. - - -> See example `CustomerQuery` implemented to be configured and run in parent mode below. -> ``` ->internal class CustomerQuery : BaseQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Executes as Parent or Level 1 query. -> // The query parameter is resolved using IDataContext parameter of data provider class. Parent query result will be null. -> -> var customer = (CustomerContext)context; -> QueryParameter = new CustomerParameter -> { -> CustomerId = customer.CustomerId -> }; -> } -> } ->``` - -ii. Child Query - In `child` mode, which is a query configured usually at level below any parent query, the query parameter can be resolved using the `IQueryResult` query result of the `parent` query. -IDataContext parameter passed to data provider class is also available. - -Note: You can have a maximum of `5` levels of query nestings. - -> See example `CustomerCommunicationQuery` implemented to be configured and run as child or nested query to customer query below. Please see `CustomerSchema` definition above for parent/child configuration setup. ->``` -> internal class CustomerCommunicationQuery : BaseQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child to customer query. -> // The result from parent customer query is used to resolve the query parameter of the nested communication query. -> -> var customer = (CustomerResult)parentQueryResult; -> QueryParameter = new CustomerParameter -> { -> CustomerId = customer.Id -> }; -> } -> } ->``` - -#### Query Engines - -`Please Note:` The above query implementation examples are with respect to parent/child configuration. The actual storage specific query definition should vary with specific implementation of the QueryEngine. -> Please see supported Query engine implementations below. -- `Schemio.SQL` - provides the implementation of IQueryEngine to execute SQL queries. Uses `Dapper` for SQL data acess. -- `Schemio.EntityFramework` - provides implementation of IQueryEngine to execute `Entity Framework` queries. - -`Query using Schemio.SQL` -The SQL query needs to implement `BaseSQLQuery`. -And, requires implementing `public abstract CommandDefinition GetCommandDefinition()` method to return `command definition` for query to be executed with `Dapper` supported QueryEngine. - -See below example `CustomerQuery` implemented as Root SQL query ->``` -> internal class CustomerQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Executes as root or level 1 query. parent QueryResult should be null. -> var customer = (CustomerContext)context.Entity; -> QueryParameter = new CustomerParameter -> { -> CustomerId = (int)customer.CustomerId -> }; -> } -> -> public override IEnumerable Execute(IDbConnection conn) -> { -> return conn.Query(new CommandDefinition -> ( -> "select CustomerId as Id, " + -> "Customer_Name as Name," + -> "Customer_Code as Code " + -> $"from TCustomer where customerId={QueryParameter.CustomerId}" -> )); -> } -> } ->``` -> -See below example `CustomerOrderItemsQuery` implemented as child SQL query. ->``` ->internal class CustomerOrderItemsQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child query to order query taking OrderResult to resolve query parameter. -> var ordersResult = (OrderResult)parentQueryResult; -> -> QueryParameter ??= new OrderItemParameter(); -> QueryParameter.OrderIds.Add(ordersResult.OrderId); -> } -> -> public override IEnumerable Execute(IDbConnection conn) -> { -> return conn.Query(new CommandDefinition -> ( -> "select OrderId, " + -> "OrderItemId as ItemId, " + -> "Name, " + -> "Cost " + -> $"from TOrderItem where OrderId in ({QueryParameter.ToCsv()})" -> )); -> } -> } ->``` - -`Query using Schemio.EntityFramework` -The SQL query needs to implement `BaseSQLQuery`. -And, requires implementing `public abstract IEnumerable Run(DbContext dbContext)` method to implement query using `DbContext` using entity framework. - -See below example `CustomerQuery` implemented as Root Entity framework query ->``` -> internal class CustomerQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Executes as root or level 1 query. parent QueryResult shuld be null. -> var customer = (CustomerContext)context.Entity; -> QueryParameter = new CustomerParameter -> { -> CustomerId = (int)customer.CustomerId -> }; -> } -> -> public override IEnumerable Run(DbContext dbContext) -> { -> return dbContext.Set() -> .Where(c => c.Id == QueryParameter.CustomerId) -> .Select(c => new CustomerResult -> { -> Id = c.Id, -> Name = c.Name, -> Code = c.Code -> }); -> } -> } ->``` -> -See below example `CustomerOrderItemsQuery` implemented as child Entity framework query. ->``` ->internal class CustomerOrderItemsQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child query to order query taking OrderResult to resolve query parameter. -> var ordersResult = (CustomerOrderResult)parentQueryResult; -> -> QueryParameter ??= new OrderItemParameter(); -> QueryParameter.OrderIds.Add(ordersResult.OrderId); -> } -> -> public override IEnumerable Run(DbContext dbContext) -> { -> return dbContext.Set() -> .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) -> .Select(c => new OrderItemResult -> { -> ItemId = c.ItemId, -> Name = c.Name, -> Cost = c.Cost, -> OrderId = c.Order.OrderId -> }); -> ; -> } -> } ->``` - - -#### 2.2 Tranformer Class -The purpose of the transformer class is to transform the data fetched by the linked query class and mapp to the configured object graph of the entity. +`QueryEngine` is an implementation of `IQueryEngine` to execute queries with supported data storage to return query result (ie. Result instance of `IQueryResult`). -To define a transformer class, you need to implement `BaseTransformer` -- where TEntity is Entity implementing `IEntity`. eg. Customer. -- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. +Depending on the Nuget package(s) installed, you could implement `SQL` and `API` queries. +* `SQL` queries execute to get data from SQL database using `Dapper` or `EntityFramework` engines. +* `API` query executes web api to call an `endpoint` using `HTTPClient` supported engine to get data. -Note: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. +**Important**: You can combine heterogeneous queries in the Entity configuration to target different data stores. -For the example query/transformer mapping ->``` -> .Map(For.Paths("customer")) ->``` - -The customer transformer maps data only to the `customer` xpath mapped object graph of customer class. -ie. - `customer/id`, `customer/customercode`, `customer/customername` - -In below transformer example, `CustomerTransformer` is implemented to transform entity `Customer` with `CustomerResult` query result obtained from `CustomerQuery` execution. - -> ->``` ->internal class CustomerTransform : BaseTransformer -> { -> public override Customer Transform(CustomerResult queryResult, Customer entity) -> { -> var customer = entity ?? new Customer(); -> customer.CustomerId = queryResult.Id; -> customer.CustomerName = queryResult.CustomerName; -> customer.CustomerCode = queryResult.CustomerCode; -> return customer; -> } -> } ->``` - -### DataProvider Setup -Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. +Example of SQL & API queries are below. +You need to override the `GetQuery(IDataContext context, IQueryResult parentQueryResult)` method to return query delegate (package specific implementation). +* `IDataContext` is the context parameter passed to DataProvider to get aggregated results (. Aggregated Entity). This parameter is always available for both parent and child queries. +* `IQueryResult` parameter is only available when query is configured in child mode, else will be null. + +##### `Schemio.SQL` - with `Dapper` Query implementation. + +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseSQLQuery +{ + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. + var customer = (CustomerContext)context.Entity; + + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition + ( + "select CustomerId as Id, " + + "Customer_Name as Name," + + "Customer_Code as Code " + + $"from TCustomer where customerId={customer.CustomerId}" + )); + } +} +``` +2. Example Child Query - OrdersQuery +``` +internal class OrdersQuery : BaseSQLQuery> +{ + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer query. + var customer = (CustomerResult)parentQueryResult; -- `ILogger>` - logger implementation. default no logger. -- `IEntitySchema` - mandatory entity schema definition for entity's object graph. -- `IQueryEngine` - implementation of query engine to execute queries (of type IQuery) with supported data storage. -- `ISchemaPathMatcher` - implementation of schema path matcher to use custom schema paths with entity schema definition. + return async connection => + { + var items = await connection.QueryAsync(new CommandDefinition + ( + "select OrderId, " + + "OrderNo, " + + "OrderDate " + + "from TOrder " + + $"where customerId={customer.Id}" + )); + + return new CollectionResult(items); + }; + } +} +``` -Example constructors: +##### `Schemio.EntityFramework` - with `EntityFramework` Query implementation -i. With `EntitySchema` and `QueryEngine` implementations. +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseSQLQuery +{ + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. parentQueryResult will be null. + var customer = (CustomerContext)context.Entity; + return async dbContext => + { + var result = await dbContext.Set() + .Where(c => c.Id == customer.CustomerId) + .Select(c => new CustomerResult + { + Id = c.Id, + Name = c.Name, + Code = c.Code + }) + .FirstOrDefaultAsync(); + + return result; + }; + } +} ``` - public DataProvider(IEntitySchema entitySchema, params IQueryEngine[] queryEngines) -``` -ii. With `Logger`, `EntitySchema`, `QueryEngine`, and `SchemaPathmMatcher` for custom schema paths mapping in entity schema definition. +2. Example Child Query - OrdersQuery ``` - public DataProvider(ILogger> logger, IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) - + internal class OrdersQuery : BaseSQLQuery> + { + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer query. + var customer = (CustomerResult)parentQueryResult; + + return async dbContext => + { + var items = await dbContext.Set() + .Where(p => p.Customer.Id == customer.Id) + .Select(c => new OrderResult + { + CustomerId = c.CustomerId, + OrderId = c.OrderId, + Date = c.Date, + OrderNo = c.OrderNo + }) + .ToListAsync(); + + return new CollectionResult(items); + }; + } + } +``` +##### `Schemio.Api` - with `HttpClient` Query implementation +1. Example Parent Query - CustomerQuery ``` -#### Schemio.SQL -Construct DataProvider using `Schemio.SQL.QueryEngine` query engine. +public class CustomerQuery : BaseApiQuery +{ + public CustomerQuery() : base(Endpoints.BaseAddress) + { + } + protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. + var customer = (CustomerContext)context.Entity; + + return ()=> new Uri(string.Format($"v2/customers/{customer.CustomerId}); + } +} +``` +2. Example Child Query - OrdersQuery +``` +internal class OrdersQuery : BaseApiQuery> +{ + public OrdersQuery() : base(Endpoints.BaseAddress) + { + } + protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer api. + var customer = (CustomerResult)parentApiResult; + + return ()=> new Uri(string.Format($"v2/customers/{customer.Id}/orders); + } +} +``` + +#### iv. Transformer Class +The purpose of the transformer class is to transform the data fetched by the linked query class and map to the configured object graph of the entity. + +To define a transformer class, you need to implement `BaseTransformer` +- where TEntity is Aggregate Entity implementing `IEntity`. eg. Customer. +- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. +Example transformer - Customer Transformer ``` -var provider = new DataProvider(new CustomerSchema(), new Schemio.SQL.QueryEngine(new SQLConfiguration())); +internal class CustomerTransform : BaseTransformer +{ + public override Customer Transform(CustomerResult queryResult, Customer entity) + { + var customer = entity ?? new Customer(); + customer.CustomerId = queryResult.Id; + customer.CustomerName = queryResult.CustomerName; + customer.CustomerCode = queryResult.CustomerCode; + return customer; + } +} ``` -#### Schemio.EntityFramework -Construct DataProvider using `Schemio.EntityFramework.QueryEngine` query engine. +**Note**: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. +For the example query/transformer mapping ``` -var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.QueryEngine()); +.Map(For.Paths("customer/communication")) ``` +The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. -### Using IOC for registrations +### Step 3. DataProvider Setup +Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. -#### Registrations +#### Container Registrations With ServiceCollection, you need to register the below dependencies. + ``` // Register core services services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); - services.AddTransient(typeof(ITransformExecutor<>), typeof(TransformExecutor<>)); + services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); services.AddTransient(); @@ -404,103 +328,206 @@ With ServiceCollection, you need to register the below dependencies. services.AddTransient(c => new QueryEngine(c.GetService>()); - // Register schema definitions. eg CustomerSchema - services.AddTransient, CustomerSchema>(); + // Register each entity configuration. eg CustomerConfiguration + services.AddTransient, CustomerConfiguration>(); + + ``` + +`Please Note:` You can combine multiple query engines and implement supporting types of queries to execute on target data platforms. + + +#### Using Fluent interface for registrations + +i. Example registration: Schemio.SQL + +``` +// Enable DbProviderFactory. + DbProviderFactories.RegisterFactory(DbProviderName, SqliteFactory.Instance); + + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + + var configuration = new SQLConfiguration { ConnectionSettings = new ConnectionSettings { ConnectionString = connectionString, ProviderName = DbProviderName } }; + +// Enable logging + services.AddLogging(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(configuration)) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); +``` + +ii. Example registration: Schemio.EntityFramework + +``` + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + +// Enable DBContext Factory + services.AddDbContextFactory(options => + options.UseSqlite(connectionString)); + +// Enable logging + services.AddLogging(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + +``` +iii. Example registration: Schemio.API +``` + // Enable logging + services.AddLogging(); + + // Enable HttpClient + services.AddHttpClient(); + + services.UseSchemio() + .WithEngine() + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + +``` +iv. Example registration: Multiple Engines ``` + // Enable logging + services.AddLogging(); + + // Enable HttpClient + services.AddHttpClient(); + + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + +// Enable DBContext Factory + services.AddDbContextFactory(options => + options.UseSqlite(connectionString)); + + services.UseSchemio() + .WithEngine() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); +``` + +#### Data Provider -`Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. +##### i. Dependency Inject - IDataProvider -#### Data Provider (DI) To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` -## Extend Schemio -### Custom Query Engine -To provide custom query engine and query implementations, you need to extend the base interfaces as depicted below -- IQueryEngine interface to implement the custom query engine to be used with schemio. +##### ii. Call DataProvider.GetData(IDataContext) method. +TBC + +## Extending Schemio + +You could extend Schemio by providing your own custom implementation of the query engine (`IQueryEngine`) and query (`IQuery`) to execute queries on custom target data platform. + +To do this, you need to extend the base interfaces as depicted below. +### i. IQueryEngine +Implement `IQueryEngine` interface to provide the custom query engine to be used with schemio. ``` public interface IQueryEngine - { - /// - /// Detrmines whether an instance of query can be executed with this engine. - /// - /// instance of IQuery. - /// Boolean; True when supported. - bool CanExecute(IQuery query); - - /// - /// Executes a list of queries returning a list of aggregated results. - /// - /// List of IQuery instances. - /// List of query results. Instances of IQueryResult. - IEnumerable Execute(IEnumerable queries); - } +{ + /// + /// Detrmines whether an instance of query can be executed with this engine. + /// + /// instance of IQuery. + /// Boolean; True when supported. + bool CanExecute(IQuery query); + + /// + /// Executes a given query returning query result. + /// + /// Custom instance of IQuery. + /// Task of IQueryResult. + Task Execute(IQuery> query); +} ``` Example Entity Framework implementation is below ``` public class QueryEngine : IQueryEngine where T : DbContext +{ + private readonly IDbContextFactory _dbContextFactory; + + public QueryEngine(IDbContextFactory _dbContextFactory) { - private readonly IDbContextFactory _dbContextFactory; + this._dbContextFactory = _dbContextFactory; + } - public QueryEngine(IDbContextFactory _dbContextFactory) + public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; + + public Task Execute(IQuery query) + { + using (var dbcontext = _dbContextFactory.CreateDbContext()) { - this._dbContextFactory = _dbContextFactory; + var result = ((ISQLQuery)query).Run(dbcontext); + return result; } + } +} +``` +### ii. IQuery +With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query custom query engine. - public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; +To do this, you need to extend `BaseQuery` where TQueryResult is `IQueryResult`. And, provide overrides for below methods. +- `bool IsContextResolved()` +Engine calls this method to confirm whether the query is ready for execution. Return true when query context is resolved. +- `void ResolveQuery(IDataContext context, IQueryResult parentQueryResult)` +This method is invoked by schemio to resolve the query context required for execution ith supporting query engine. `IQueryResult` parameter is only available when the custom query is configured in nested or child mode. - public IEnumerable Execute(IEnumerable queries) - { - var output = new List(); - using (var dbcontext = _dbContextFactory.CreateDbContext()) - { - foreach (var query in queries) - { - var results = ((ISQLQuery)query).Run(dbcontext); +Example - EntityFramework Supported query implementation is shown below. +``` + public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery + where TQueryResult : IQueryResult + { + private Func> QueryDelegate = null; + + public override bool IsContextResolved() => QueryDelegate != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + QueryDelegate = GetQuery(context, parentQueryResult); + } + + async Task ISQLQuery.Run(DbContext dbContext) + { + return await QueryDelegate(dbContext); + } + + /// + /// Get query delegate to return query result. + /// + /// + /// + /// + protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); + } +``` - if (results == null) - continue; +### iii. Custom Schema Paths - output.AddRange(results); - } +Additionally, You can provide your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. - return output.ToArray(); - } - } - } -``` -- Provide base implementation supporting IQuery, IRootQuery & IChildQuery interfaces. -- You can implement the parent and child base class implementations to construct for queries to be executed with custom engine implementation above. +To do this you need to follow the below steps +i. Provide entity schema definition with query/transformer pairs using custom schema language paths. -For Parent Query base implementation, see example below. +Example - with Dummy schema mapping ``` -public abstract class BaseSQLQuery - : BaseQuery, ISQLQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// Func> - public abstract IEnumerable Run(DbContext dbContext); - } +.Map(For.Paths("customer$orders")) ``` -### Custom Schema Language -You can provide your own schema language support for use in entity schema definition to map sections of object graph. - -To do this you need to follow the below steps -* Provide entity schema definition with query/transformer pairs using custom schema language paths -* Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. This matcher is used by query builder to pick queries for matched paths against the configured p in Entity schema definition. +ii. Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. +`Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. ``` public interface ISchemaPathMatcher { bool IsMatch(string inputPath, ISchemaPaths configuredPaths); } ``` -Example implementation of XPath matcher is below. +Example implementation of XPathMatcher is below. ``` public class XPathMatcher : ISchemaPathMatcher { From 32b91a97474f7274b1f5af0f241a8f8da7f88f93 Mon Sep 17 00:00:00 2001 From: Ninja Date: Tue, 19 Nov 2024 00:05:08 +0000 Subject: [PATCH 14/64] - Update Developer.md for v2.0.0 --- Developer Guide.md | 38 +++++++++++++++++++++++++++----------- DeveloperGuide.md | 38 +++++++++++++++++++++++++++----------- 2 files changed, 54 insertions(+), 22 deletions(-) diff --git a/Developer Guide.md b/Developer Guide.md index db3535a..306c177 100644 --- a/Developer Guide.md +++ b/Developer Guide.md @@ -317,16 +317,21 @@ With ServiceCollection, you need to register the below dependencies. // Enable logging services.AddLogging(); - //For Dapper SQL engine. + //For Dapper SQL engine - Schemio.SQL services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { Providername = "System.Data.SqlClient", ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" }}); - // For entity framework engine. + // For entity framework engine - Schemio.EntityFramework services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); services.AddTransient(c => new QueryEngine(c.GetService>()); + // For HTTPClient Engine for web APIs - Schemio.API + + // Enable HttpClient + services.AddHttpClient(); + services.AddTransient(); // Register each entity configuration. eg CustomerConfiguration services.AddTransient, CustomerConfiguration>(); @@ -414,9 +419,17 @@ iv. Example registration: Multiple Engines ##### i. Dependency Inject - IDataProvider -To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` +To use Data provider, Inject `IDataProvider` where T is IEntity, using constructor & property injection method or explicitly Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` + +##### ii. Call DataProvider.GetData(IEntityContext context) method. +You need to call the `GetData()` method with an instance of parameter class derived from `IEntityContext` interface. -##### ii. Call DataProvider.GetData(IDataContext) method. +The `IEntityContext` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. +- When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. +- When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. + +When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution.. +Example - Control Flow TBC ## Extending Schemio @@ -509,23 +522,26 @@ Example - EntityFramework Supported query implementation is shown below. ### iii. Custom Schema Paths -Additionally, You can provide your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. +Additionally, You can use your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. + +To do this you need to follow the below steps: +#### i. Use schema paths in Entity Configuration. -To do this you need to follow the below steps -i. Provide entity schema definition with query/transformer pairs using custom schema language paths. +Provide entity schema definition with query/transformer pairs using custom schema language paths. Example - with Dummy schema mapping ``` .Map(For.Paths("customer$orders")) ``` +#### ii. ISchemaPathMatcher +Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. -ii. Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. `Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. ``` public interface ISchemaPathMatcher - { - bool IsMatch(string inputPath, ISchemaPaths configuredPaths); - } +{ + bool IsMatch(string inputPath, ISchemaPaths configuredPaths); +} ``` Example implementation of XPathMatcher is below. ``` diff --git a/DeveloperGuide.md b/DeveloperGuide.md index 4bd9031..99ec652 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -317,16 +317,21 @@ With ServiceCollection, you need to register the below dependencies. // Enable logging services.AddLogging(); - //For Dapper SQL engine. + //For Dapper SQL engine - Schemio.SQL services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { Providername = "System.Data.SqlClient", ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" }}); - // For entity framework engine. + // For entity framework engine - Schemio.EntityFramework services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); services.AddTransient(c => new QueryEngine(c.GetService>()); + // For HTTPClient Engine for web APIs - Schemio.API + + // Enable HttpClient + services.AddHttpClient(); + services.AddTransient(); // Register each entity configuration. eg CustomerConfiguration services.AddTransient, CustomerConfiguration>(); @@ -414,9 +419,17 @@ iv. Example registration: Multiple Engines ##### i. Dependency Inject - IDataProvider -To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` +To use Data provider, Inject `IDataProvider` where T is IEntity, using constructor & property injection method or explicitly Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` + +##### ii. Call DataProvider.GetData(IEntityContext context) method. +You need to call the `GetData()` method with an instance of parameter class derived from `IEntityContext` interface. -##### ii. Call DataProvider.GetData(IDataContext) method. +The `IEntityContext` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. +- When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. +- When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. + +When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution.. +Example - Control Flow TBC ## Extending Schemio @@ -509,23 +522,26 @@ Example - EntityFramework Supported query implementation is shown below. ### iii. Custom Schema Paths -Additionally, You can provide your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. +Additionally, You can use your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. + +To do this you need to follow the below steps: +#### i. Use schema paths in Entity Configuration. -To do this you need to follow the below steps -i. Provide entity schema definition with query/transformer pairs using custom schema language paths. +Provide entity schema definition with query/transformer pairs using custom schema language paths. Example - with Dummy schema mapping ``` .Map(For.Paths("customer$orders")) ``` +#### ii. ISchemaPathMatcher +Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. -ii. Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. `Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. ``` public interface ISchemaPathMatcher - { - bool IsMatch(string inputPath, ISchemaPaths configuredPaths); - } +{ + bool IsMatch(string inputPath, ISchemaPaths configuredPaths); +} ``` Example implementation of XPathMatcher is below. ``` From 12c15c92cff71fc165d48618d28de73b15d81ffc Mon Sep 17 00:00:00 2001 From: Ninja Date: Tue, 19 Nov 2024 00:08:09 +0000 Subject: [PATCH 15/64] - Update DeveloperGuide.md v2.0.0 --- Developer Guide.md | 4 ++-- DeveloperGuide.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Developer Guide.md b/Developer Guide.md index 306c177..334e198 100644 --- a/Developer Guide.md +++ b/Developer Guide.md @@ -298,7 +298,7 @@ For the example query/transformer mapping The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. ### Step 3. DataProvider Setup -Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. +Data provider needs to be setup with required dependencies. Provide implementations of below dependencies to construct the data provider. #### Container Registrations @@ -415,7 +415,7 @@ iv. Example registration: Multiple Engines .WithEntityConfiguration(c => new CustomerConfiguration()); ``` -#### Data Provider +#### Use Data Provider ##### i. Dependency Inject - IDataProvider diff --git a/DeveloperGuide.md b/DeveloperGuide.md index 99ec652..e01a546 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -298,7 +298,7 @@ For the example query/transformer mapping The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. ### Step 3. DataProvider Setup -Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. +Data provider needs to be setup with required dependencies. Provide implementations of below dependencies to construct the data provider. #### Container Registrations @@ -415,7 +415,7 @@ iv. Example registration: Multiple Engines .WithEntityConfiguration(c => new CustomerConfiguration()); ``` -#### Data Provider +#### Use Data Provider ##### i. Dependency Inject - IDataProvider From ac64f4f413e968200bfd9d8def2d99e28f6a2a76 Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Tue, 19 Nov 2024 00:09:04 +0000 Subject: [PATCH 16/64] Delete Developer Guide.md --- Developer Guide.md | 567 --------------------------------------------- 1 file changed, 567 deletions(-) delete mode 100644 Developer Guide.md diff --git a/Developer Guide.md b/Developer Guide.md deleted file mode 100644 index 334e198..0000000 --- a/Developer Guide.md +++ /dev/null @@ -1,567 +0,0 @@ -# Developer Guide - -## i. Installation - -`Schemio` allows you to aggregate data from heterogeneous data stores offering `SQL` & `API` packages out of the box below. SQL queries are supported by `Dapper` and `EntityFramework` engines. You could also `extend` Schemio to provide your own implementation(s) of `Query` and supporting `Query Engine` to retrieve data from `custom` data store(s). - -Below are the Nuget packages available. - -`Scemio.Core` - Install to extend schemio to implement `custom` querying engine. -``` -NuGet\Install-Package Schemio.Core -``` -`Schemio.SQL` - Install when you would like to include SQL `Dapper` queries to access SQL database. -``` -NuGet\Install-Package Schemio.SQL -``` -`Schemio.EntityFramework` - Install when you would like to include SQL `EntityFramework` queries to access SQL database. -``` -NuGet\Install-Package Schemio.EntityFramework -``` -`Schemio.Api` - Install when you would like to include web api queries with `HttpClient` query engine. -``` -NuGet\Install-Package Schemio.Api -``` -## ii. Implementation: Using Schemio - -To use **Schemio** you need to do the below steps -- **Step 1**: Define the aggregated `Entity`. -- **Step 2**: Setup the aggregate `Configuration` comprising of `Query`/`Transformer` hierarchical nested mappings. -- **Step 3**: Construct the `DataProvider` with required dependencies. - -### Step 1. Define Aggregate Entity. -To create an aggregate `Entity`, implement the class from `IEntity` interface. This is the entity that will be returned as aggregated result from multiple queries assembled to execute against homogeneous or heterogeneous data storage's. - -Below is an example `Customer` entity. - -``` -public class Customer : IEntity -{ - public int CustomerId { get; set; } - public string CustomerCode { get; set; } - public string CustomerName { get; set; } - public Communication Communication { get; set; } - public Order[] Orders { get; set; } -} -``` - -For the customer class, we can see there are three levels of nesting in the object graph. -- Level 1 with paths: `Customer` -- Level 2 with paths: `Customer.Communication` and `Customer.Orders` -- Level 3 with paths: `Customer.Orders.Items` - -If we choose XML Schema Definition (XSD) for the Customer entity then XPaths for nesting levels should be. -``` -- Level 1 with XPath: Customer -- Level 2 with XPaths: Customer/Communication and Customer/Orders -- Level 3 with XPath: Customer/Orders/Order/Items/Item -``` -### Step 2: Setup Entity Aggregate Configuration -To define `Entity Configuration`, derive from `EntityConfiguration` class where `TEntity` is aggregate entity in context (ie. `IEntity`). - -The `Entity Configuration` is basically `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. -* `Query` is an implementation to `fetch` data for mapped sections of object graph. -* `Transformer` is an implementation to `map` data fetched by the associated query to the relevant sections of the entity's object graph. - -Below is an example Entity Configuration for the Customer Entity. - -``` -internal class CustomerConfiguration : EntityConfiguration -{ - public override IEnumerable> GetSchema() - { - return CreateSchema.For() - .Map(For.Paths("customer"), - customer => customer.Dependents - .Map(For.Paths("customer/communication")) - .Map(For.Paths("customer/orders"), - customerOrders => customerOrders.Dependents - .Map(For.Paths("customer/orders/order/items")))) - .End(); - } -} -``` -`CustomerConfiguration` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. -`XPaths` are used to identify the schema paths in the object graph. Alternately, you could use your own representation to name the pairs or map the object graph. However, you would need to provide the `ISchemaPathmatcher` implementation to managing path matching. - -#### i. Query/Transformer Mapping -Every `Query` type in the Entity `Configuration` definition should have a complementing `Transformer` type. -You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. - -Below is the snippet from `CustomerConfiguration` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. -``` - .Map(For.Paths("customer")) -``` - -#### ii. Nested Query/Transformer Mappings -You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query context. - -The query/transformer mappings can be `nested` to `5` levels down. - -Below is snippet to show nesting of `CommunicationQuery` as child to `CustomerQuery`. -``` -.Map(For.Paths("customer"), -- Parent - customer => customer.Dependents - .Map(For.Paths("customer/communication")) -- Child -``` - -Execution Flow -* In parent/child hierarchy, the first parent query executes first, followed by its immediate children. The execution flows in sequence to the last child query in order of its nesting. -* While executing the output of the parent is passed in to the child query to resolve query context and get it ready for execution. -* Transformers are also executed in the same sequence to map data to the Aggregate Entity. -* When a query path for nested query is included for execution, all the parent queries involved in that object graph get included for execution in order of its nesting. - -Please see the execution sequence below for queries and transformers nested in `CustomerConfiguration` implemented above. - -image - -#### iii. Query Class -`Query` - The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. - -`QueryEngine` is an implementation of `IQueryEngine` to execute queries with supported data storage to return query result (ie. Result instance of `IQueryResult`). - -Depending on the Nuget package(s) installed, you could implement `SQL` and `API` queries. -* `SQL` queries execute to get data from SQL database using `Dapper` or `EntityFramework` engines. -* `API` query executes web api to call an `endpoint` using `HTTPClient` supported engine to get data. - -**Important**: You can combine heterogeneous queries in the Entity configuration to target different data stores. - -Example of SQL & API queries are below. -You need to override the `GetQuery(IDataContext context, IQueryResult parentQueryResult)` method to return query delegate (package specific implementation). -* `IDataContext` is the context parameter passed to DataProvider to get aggregated results (. Aggregated Entity). This parameter is always available for both parent and child queries. -* `IQueryResult` parameter is only available when query is configured in child mode, else will be null. - -##### `Schemio.SQL` - with `Dapper` Query implementation. - -1. Example Parent Query - CustomerQuery -``` -public class CustomerQuery : BaseSQLQuery -{ - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; - - return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition - ( - "select CustomerId as Id, " + - "Customer_Name as Name," + - "Customer_Code as Code " + - $"from TCustomer where customerId={customer.CustomerId}" - )); - } -} -``` -2. Example Child Query - OrdersQuery -``` -internal class OrdersQuery : BaseSQLQuery> -{ - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; - - return async connection => - { - var items = await connection.QueryAsync(new CommandDefinition - ( - "select OrderId, " + - "OrderNo, " + - "OrderDate " + - "from TOrder " + - $"where customerId={customer.Id}" - )); - - return new CollectionResult(items); - }; - } -} -``` - -##### `Schemio.EntityFramework` - with `EntityFramework` Query implementation - -1. Example Parent Query - CustomerQuery -``` -public class CustomerQuery : BaseSQLQuery -{ - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Executes as root or level 1 query. parentQueryResult will be null. - var customer = (CustomerContext)context.Entity; - - return async dbContext => - { - var result = await dbContext.Set() - .Where(c => c.Id == customer.CustomerId) - .Select(c => new CustomerResult - { - Id = c.Id, - Name = c.Name, - Code = c.Code - }) - .FirstOrDefaultAsync(); - - return result; - }; - } -} -``` -2. Example Child Query - OrdersQuery -``` - internal class OrdersQuery : BaseSQLQuery> - { - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; - - return async dbContext => - { - var items = await dbContext.Set() - .Where(p => p.Customer.Id == customer.Id) - .Select(c => new OrderResult - { - CustomerId = c.CustomerId, - OrderId = c.OrderId, - Date = c.Date, - OrderNo = c.OrderNo - }) - .ToListAsync(); - - return new CollectionResult(items); - }; - } - } -``` -##### `Schemio.Api` - with `HttpClient` Query implementation -1. Example Parent Query - CustomerQuery -``` -public class CustomerQuery : BaseApiQuery -{ - public CustomerQuery() : base(Endpoints.BaseAddress) - { - } - protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; - - return ()=> new Uri(string.Format($"v2/customers/{customer.CustomerId}); - } -} -``` -2. Example Child Query - OrdersQuery -``` -internal class OrdersQuery : BaseApiQuery> -{ - public OrdersQuery() : base(Endpoints.BaseAddress) - { - } - protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Execute as child to customer api. - var customer = (CustomerResult)parentApiResult; - - return ()=> new Uri(string.Format($"v2/customers/{customer.Id}/orders); - } -} -``` - -#### iv. Transformer Class -The purpose of the transformer class is to transform the data fetched by the linked query class and map to the configured object graph of the entity. - -To define a transformer class, you need to implement `BaseTransformer` -- where TEntity is Aggregate Entity implementing `IEntity`. eg. Customer. -- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. - -Example transformer - Customer Transformer -``` -internal class CustomerTransform : BaseTransformer -{ - public override Customer Transform(CustomerResult queryResult, Customer entity) - { - var customer = entity ?? new Customer(); - customer.CustomerId = queryResult.Id; - customer.CustomerName = queryResult.CustomerName; - customer.CustomerCode = queryResult.CustomerCode; - return customer; - } -} -``` - -**Note**: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. - -For the example query/transformer mapping -``` -.Map(For.Paths("customer/communication")) -``` -The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. - -### Step 3. DataProvider Setup -Data provider needs to be setup with required dependencies. Provide implementations of below dependencies to construct the data provider. - -#### Container Registrations - -With ServiceCollection, you need to register the below dependencies. - -``` - // Register core services - services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); - services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); - services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); - services.AddTransient(); - - // Register instance of ISchemaPathMatcher - Json, XPath or Custom. - services.AddTransient(c => new XPathMatcher()); - - // Enable logging - services.AddLogging(); - - //For Dapper SQL engine - Schemio.SQL - services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { - Providername = "System.Data.SqlClient", - ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" - }}); - - // For entity framework engine - Schemio.EntityFramework - services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); - services.AddTransient(c => new QueryEngine(c.GetService>()); - - // For HTTPClient Engine for web APIs - Schemio.API - - // Enable HttpClient - services.AddHttpClient(); - services.AddTransient(); - - // Register each entity configuration. eg CustomerConfiguration - services.AddTransient, CustomerConfiguration>(); - - ``` - -`Please Note:` You can combine multiple query engines and implement supporting types of queries to execute on target data platforms. - - -#### Using Fluent interface for registrations - -i. Example registration: Schemio.SQL - -``` -// Enable DbProviderFactory. - DbProviderFactories.RegisterFactory(DbProviderName, SqliteFactory.Instance); - - var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; - - var configuration = new SQLConfiguration { ConnectionSettings = new ConnectionSettings { ConnectionString = connectionString, ProviderName = DbProviderName } }; - -// Enable logging - services.AddLogging(); - - services.UseSchemio() - .WithEngine(c => new QueryEngine(configuration)) - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); -``` - -ii. Example registration: Schemio.EntityFramework - -``` - var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; - -// Enable DBContext Factory - services.AddDbContextFactory(options => - options.UseSqlite(connectionString)); - -// Enable logging - services.AddLogging(); - - services.UseSchemio() - .WithEngine(c => new QueryEngine(c.GetService>())) - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); - -``` -iii. Example registration: Schemio.API -``` - // Enable logging - services.AddLogging(); - - // Enable HttpClient - services.AddHttpClient(); - - services.UseSchemio() - .WithEngine() - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); - -``` -iv. Example registration: Multiple Engines -``` - // Enable logging - services.AddLogging(); - - // Enable HttpClient - services.AddHttpClient(); - - var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; - -// Enable DBContext Factory - services.AddDbContextFactory(options => - options.UseSqlite(connectionString)); - - services.UseSchemio() - .WithEngine() - .WithEngine(c => new QueryEngine(c.GetService>())) - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); -``` - -#### Use Data Provider - -##### i. Dependency Inject - IDataProvider - -To use Data provider, Inject `IDataProvider` where T is IEntity, using constructor & property injection method or explicitly Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` - -##### ii. Call DataProvider.GetData(IEntityContext context) method. -You need to call the `GetData()` method with an instance of parameter class derived from `IEntityContext` interface. - -The `IEntityContext` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. -- When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. -- When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. - -When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution.. -Example - Control Flow -TBC - -## Extending Schemio - -You could extend Schemio by providing your own custom implementation of the query engine (`IQueryEngine`) and query (`IQuery`) to execute queries on custom target data platform. - -To do this, you need to extend the base interfaces as depicted below. -### i. IQueryEngine -Implement `IQueryEngine` interface to provide the custom query engine to be used with schemio. -``` -public interface IQueryEngine -{ - /// - /// Detrmines whether an instance of query can be executed with this engine. - /// - /// instance of IQuery. - /// Boolean; True when supported. - bool CanExecute(IQuery query); - - /// - /// Executes a given query returning query result. - /// - /// Custom instance of IQuery. - /// Task of IQueryResult. - Task Execute(IQuery> query); -} -``` -Example Entity Framework implementation is below -``` -public class QueryEngine : IQueryEngine where T : DbContext -{ - private readonly IDbContextFactory _dbContextFactory; - - public QueryEngine(IDbContextFactory _dbContextFactory) - { - this._dbContextFactory = _dbContextFactory; - } - - public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; - - public Task Execute(IQuery query) - { - using (var dbcontext = _dbContextFactory.CreateDbContext()) - { - var result = ((ISQLQuery)query).Run(dbcontext); - return result; - } - } -} -``` -### ii. IQuery -With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query custom query engine. - -To do this, you need to extend `BaseQuery` where TQueryResult is `IQueryResult`. And, provide overrides for below methods. -- `bool IsContextResolved()` -Engine calls this method to confirm whether the query is ready for execution. Return true when query context is resolved. -- `void ResolveQuery(IDataContext context, IQueryResult parentQueryResult)` -This method is invoked by schemio to resolve the query context required for execution ith supporting query engine. `IQueryResult` parameter is only available when the custom query is configured in nested or child mode. - - -Example - EntityFramework Supported query implementation is shown below. -``` - public abstract class BaseSQLQuery - : BaseQuery, ISQLQuery - where TQueryResult : IQueryResult - { - private Func> QueryDelegate = null; - - public override bool IsContextResolved() => QueryDelegate != null; - - public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) - { - QueryDelegate = GetQuery(context, parentQueryResult); - } - - async Task ISQLQuery.Run(DbContext dbContext) - { - return await QueryDelegate(dbContext); - } - - /// - /// Get query delegate to return query result. - /// - /// - /// - /// - protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); - } -``` - -### iii. Custom Schema Paths - -Additionally, You can use your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. - -To do this you need to follow the below steps: -#### i. Use schema paths in Entity Configuration. - -Provide entity schema definition with query/transformer pairs using custom schema language paths. - -Example - with Dummy schema mapping -``` -.Map(For.Paths("customer$orders")) -``` -#### ii. ISchemaPathMatcher -Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. - -`Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. -``` -public interface ISchemaPathMatcher -{ - bool IsMatch(string inputPath, ISchemaPaths configuredPaths); -} -``` -Example implementation of XPathMatcher is below. -``` -public class XPathMatcher : ISchemaPathMatcher - { - private static readonly Regex ancestorRegex = new Regex(@"=ancestor::(?'path'.*?)(/@|\[.*\]/@)", RegexOptions.Compiled); - - public bool IsMatch(string inputXPath, ISchemaPaths configuredXPaths) - { - if (inputXPath == null) - return false; - - if (configuredXPaths.Paths.Any(x => inputXPath.ToLower().Contains(x.ToLower()))) - return true; - - if (configuredXPaths.Paths.Any(x => inputXPath.Contains("ancestor::") - && ancestorRegex.Matches(inputXPath).Select(match => match.Groups["path"].Value).Distinct().Any(match => x.EndsWith(match)))) - return true; - - return false; - } - } -``` \ No newline at end of file From 5ade11cffc3c0a0ae1931608f1455548f0b6c22f Mon Sep 17 00:00:00 2001 From: Ninja Date: Tue, 19 Nov 2024 23:00:12 +0000 Subject: [PATCH 17/64] - Update DeveloperGuide.md --- DeveloperGuide.md | 9 ++++++--- Images/Schemio-Control-Flow.png | Bin 0 -> 110068 bytes 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 Images/Schemio-Control-Flow.png diff --git a/DeveloperGuide.md b/DeveloperGuide.md index e01a546..f580c27 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -428,9 +428,12 @@ The `IEntityContext` provides a `SchemaPaths` property, which is a list of schem - When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. - When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. -When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution.. -Example - Control Flow -TBC +When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution. + +Example - Control Flow + +image + ## Extending Schemio diff --git a/Images/Schemio-Control-Flow.png b/Images/Schemio-Control-Flow.png new file mode 100644 index 0000000000000000000000000000000000000000..cfab755b2a1c353c8313fb4f156c20fce919554a GIT binary patch literal 110068 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 z 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 literal 0 HcmV?d00001 From 3935a74a6bfe93f507555685fb1cc9e5bbaae6a0 Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Tue, 19 Nov 2024 23:02:43 +0000 Subject: [PATCH 18/64] Update DeveloperGuide.md --- DeveloperGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DeveloperGuide.md b/DeveloperGuide.md index f580c27..651bf2a 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -113,7 +113,7 @@ Execution Flow Please see the execution sequence below for queries and transformers nested in `CustomerConfiguration` implemented above. -image +image #### iii. Query Class `Query` - The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. @@ -432,7 +432,7 @@ When nested path for a nested query is included (eg. customer/orders/order/items Example - Control Flow -image +image ## Extending Schemio From 2be00d651161eb204100bd6d3b7558d67356fdd5 Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Tue, 19 Nov 2024 23:07:22 +0000 Subject: [PATCH 19/64] Update README.md --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1cbb00a..9ea604c 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Schemio is perfect fit for many use cases. Few examples that require the service ## Getting Started? ### i. Installation -Install the latest nuget package as appropriate for Core, SQL using Dapper or EntityFramework using commands below. +Install the latest nuget package as appropriate for `Core`, `Web API`, `SQL` using `Dapper` or `EntityFramework` using commands below. `Scemio.Core` - for installing schemio for `bespoke` implementation of query engine. ``` @@ -43,7 +43,10 @@ NuGet\Install-Package Schemio.SQL ``` NuGet\Install-Package Schemio.EntityFramework ``` - +`Schemio.API` - for installing schemio for Web API with `HttpClient` engine. +``` +NuGet\Install-Package Schemio.API +``` ### ii. Developer Guide Please see [Developer Guide](/DeveloperGuide.md) for details on how to implement schemio in your project. From 0afc58e15c4e16bebfc3d2c6aba4842a163ac5da Mon Sep 17 00:00:00 2001 From: Ninja Date: Tue, 19 Nov 2024 23:12:48 +0000 Subject: [PATCH 20/64] - Update Developer Guide --- Images/Schemio-Control-Flow.png | Bin 110068 -> 110412 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Images/Schemio-Control-Flow.png b/Images/Schemio-Control-Flow.png index cfab755b2a1c353c8313fb4f156c20fce919554a..0f3c7db49c2f0232f9de49d8b2dd94e093718966 100644 GIT binary patch delta 79587 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 delta 79180 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�uVx#q8Z8qBx{p83d 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 Date: Tue, 19 Nov 2024 23:55:43 +0000 Subject: [PATCH 21/64] Rename DeveloperGuide.md to index.md --- DeveloperGuide.md => index.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename DeveloperGuide.md => index.md (100%) diff --git a/DeveloperGuide.md b/index.md similarity index 100% rename from DeveloperGuide.md rename to index.md From f10450e868fa41095b41ccc2601790c83d6d43bc Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Tue, 19 Nov 2024 23:56:56 +0000 Subject: [PATCH 22/64] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9ea604c..3ee6315 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ NuGet\Install-Package Schemio.API ``` ### ii. Developer Guide -Please see [Developer Guide](/DeveloperGuide.md) for details on how to implement schemio in your project. +Please see [Developer Guide](https://codeshayk.github.io/schemio/) for details on how to implement schemio in your project. ## Support @@ -63,8 +63,8 @@ This project is licensed with the [MIT license](LICENSE). The main branch is now on .NET 8.0. The following previous versions are available: | Version | Release Notes | Developer Guide | | -------- | --------|--------| -| [`v1.0.0`](https://github.com/CodeShayk/Schemio/tree/v1.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v1.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v1.0.0/DeveloperGuide.md) | -| [`Pre-Release v2.0.0`](https://github.com/CodeShayk/Schemio/tree/v2.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v2.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v2.0.0/DeveloperGuide.md) | +| [`v1.0.0`](https://github.com/CodeShayk/Schemio/tree/v1.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v1.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v1.0.0/index.md) | +| [`Pre-Release v2.0.0`](https://github.com/CodeShayk/Schemio/tree/v2.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v2.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v2.0.0/index.md) | ## Credits Thank you for reading. Please fork, explore, contribute and report. Happy Coding !! :) From 177bdb88393ad5344096c0870e0f5fe309ab64e7 Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Tue, 19 Nov 2024 23:57:39 +0000 Subject: [PATCH 23/64] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3ee6315..5a1ca08 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ NuGet\Install-Package Schemio.API ``` ### ii. Developer Guide -Please see [Developer Guide](https://codeshayk.github.io/schemio/) for details on how to implement schemio in your project. +Please see [Developer Guide](https://codeshayk.github.io/Schemio/) for details on how to implement schemio in your project. ## Support From d0d1d8ab705d415c6b9d23ac363e72dc21a80764 Mon Sep 17 00:00:00 2001 From: Ninja Date: Wed, 20 Nov 2024 23:12:51 +0000 Subject: [PATCH 24/64] - Checkpoint: Add Schemio.API.Tests & Refactorings --- Schemio.sln | 11 +- index.md | 78 ++++++-- src/Schemio.API/IWebResponse.cs | 9 - src/Schemio.API/WebHeaderResult.cs | 12 ++ .../{BaseWebQuery.cs => WebQuery.cs} | 37 ++-- src/Schemio.Core/ISchemaPathMatcher.cs | 8 +- src/Schemio.Core/PathMatchers/JPathMatcher.cs | 2 +- src/Schemio.EntityFramework/IDbContext.cs | 9 - .../{BaseSQLQuery.cs => SQLQuery.cs} | 2 +- .../{BaseSQLQuery.cs => SQLQuery.cs} | 2 +- tests/Schemio.API.Tests/E2E.Tests/BaseTest.cs | 76 ++++++++ tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs | 168 ++++++++++++++++++ .../Schemio.API.Tests/EntitySetup/Customer.cs | 46 +++++ .../EntitySetup/CustomerConfiguration.cs | 25 +++ .../EntitySetup/CustomerContext.cs | 10 ++ .../QueryResults/CommunicationResult.cs | 17 ++ .../QueryResults/CustomerResult.cs | 9 + .../QueryResults/OrderItemResult.cs | 10 ++ .../EntitySetup/QueryResults/OrderResult.cs | 11 ++ .../Transforms/CommunicationTransform.cs | 29 +++ .../Transforms/CustomerTransform.cs | 20 +++ .../Transforms/OrderItemsTransform.cs | 31 ++++ .../EntitySetup/Transforms/OrdersTransform.cs | 27 +++ .../WebApis/CommunicationWebQuery.cs | 18 ++ .../EntitySetup/WebApis/CustomerWebQuery.cs | 42 +++++ .../EntitySetup/WebApis/Endpoints.cs | 26 +++ .../EntitySetup/WebApis/OrderItemsWebQuery.cs | 22 +++ .../EntitySetup/WebApis/OrdersWebQuery.cs | 20 +++ .../Schemio.API.Tests.csproj | 28 +++ .../Schemio.EntityFramework.Tests/BaseTest.cs | 4 - .../Queries/CommunicationQuery.cs | 2 +- .../EntitySchemas/Queries/CustomerQuery.cs | 2 +- .../EntitySchemas/Queries/OrderItemsQuery.cs | 2 +- .../EntitySchemas/Queries/OrdersQuery.cs | 2 +- tests/Schemio.SQL.Tests/BaseTest.cs | 4 - .../Queries/CommunicationQuery.cs | 2 +- .../Queries/CustomerQuery.cs | 2 +- .../Queries/OrderItemsQuery.cs | 2 +- .../Queries/OrdersQuery.cs | 2 +- 39 files changed, 756 insertions(+), 73 deletions(-) delete mode 100644 src/Schemio.API/IWebResponse.cs create mode 100644 src/Schemio.API/WebHeaderResult.cs rename src/Schemio.API/{BaseWebQuery.cs => WebQuery.cs} (84%) delete mode 100644 src/Schemio.EntityFramework/IDbContext.cs rename src/Schemio.EntityFramework/{BaseSQLQuery.cs => SQLQuery.cs} (95%) rename src/Schemio.SQL/{BaseSQLQuery.cs => SQLQuery.cs} (91%) create mode 100644 tests/Schemio.API.Tests/E2E.Tests/BaseTest.cs create mode 100644 tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/Customer.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/CustomerConfiguration.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/QueryResults/CommunicationResult.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/QueryResults/CustomerResult.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderItemResult.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderResult.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/Transforms/CommunicationTransform.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/Transforms/CustomerTransform.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/Transforms/OrderItemsTransform.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/Transforms/OrdersTransform.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/WebApis/CommunicationWebQuery.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/WebApis/Endpoints.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/WebApis/OrdersWebQuery.cs create mode 100644 tests/Schemio.API.Tests/Schemio.API.Tests.csproj diff --git a/Schemio.sln b/Schemio.sln index cb33b57..75e0047 100644 --- a/Schemio.sln +++ b/Schemio.sln @@ -10,7 +10,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{AF995FEF-BB94-48D0-B02B-6671DA73056B}" ProjectSection(SolutionItems) = preProject .gitignore = .gitignore - DeveloperGuide.md = DeveloperGuide.md + index.md = index.md LICENSE.md = LICENSE.md README.md = README.md EndProjectSection @@ -36,7 +36,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL", "src\Schemio.SQL\Schemio.SQL.csproj", "{52986844-698F-486B-AEC9-846AAF50CF46}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Schemio.API", "src\Schemio.API\Schemio.API.csproj", "{0C1A05D2-653D-4F88-B397-BA53E0BA7281}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.API", "src\Schemio.API\Schemio.API.csproj", "{0C1A05D2-653D-4F88-B397-BA53E0BA7281}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.API.Tests", "tests\Schemio.API.Tests\Schemio.API.Tests.csproj", "{D0EE40C1-87EF-413D-A046-DC37D58BC344}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -72,6 +74,10 @@ Global {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Debug|Any CPU.Build.0 = Debug|Any CPU {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Release|Any CPU.ActiveCfg = Release|Any CPU {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Release|Any CPU.Build.0 = Release|Any CPU + {D0EE40C1-87EF-413D-A046-DC37D58BC344}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D0EE40C1-87EF-413D-A046-DC37D58BC344}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0EE40C1-87EF-413D-A046-DC37D58BC344}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D0EE40C1-87EF-413D-A046-DC37D58BC344}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -85,6 +91,7 @@ Global {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} {52986844-698F-486B-AEC9-846AAF50CF46} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} {0C1A05D2-653D-4F88-B397-BA53E0BA7281} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} + {D0EE40C1-87EF-413D-A046-DC37D58BC344} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C0FF62D6-1374-4939-A546-432862338528} diff --git a/index.md b/index.md index 651bf2a..913fb2c 100644 --- a/index.md +++ b/index.md @@ -131,11 +131,12 @@ You need to override the `GetQuery(IDataContext context, IQueryResult parentQuer * `IDataContext` is the context parameter passed to DataProvider to get aggregated results (. Aggregated Entity). This parameter is always available for both parent and child queries. * `IQueryResult` parameter is only available when query is configured in child mode, else will be null. -##### `Schemio.SQL` - with `Dapper` Query implementation. +##### `Schemio.SQL` - with `Dapper` Query implementation. +To create a SQL query you need to derive from `SQLQuery` where TQueryResult is `IQueryResult` implementation. 1. Example Parent Query - CustomerQuery ``` -public class CustomerQuery : BaseSQLQuery +public class CustomerQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { @@ -154,7 +155,7 @@ public class CustomerQuery : BaseSQLQuery ``` 2. Example Child Query - OrdersQuery ``` -internal class OrdersQuery : BaseSQLQuery> +internal class OrdersQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { @@ -179,10 +180,11 @@ internal class OrdersQuery : BaseSQLQuery> ``` ##### `Schemio.EntityFramework` - with `EntityFramework` Query implementation +To create a SQL query you need to derive from `SQLQuery` where TQueryResult is `IQueryResult` implementation. 1. Example Parent Query - CustomerQuery ``` -public class CustomerQuery : BaseSQLQuery +public class CustomerQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { @@ -208,7 +210,7 @@ public class CustomerQuery : BaseSQLQuery ``` 2. Example Child Query - OrdersQuery ``` - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { @@ -234,25 +236,62 @@ public class CustomerQuery : BaseSQLQuery } ``` ##### `Schemio.Api` - with `HttpClient` Query implementation +To create a Web API query you need to derive from `WebQuery` where TQueryResult is `IQueryResult` implementation. + +`Important`: If you need to get response headers in the result then TQueryResult should derive from `WebHeaderResult` class. + 1. Example Parent Query - CustomerQuery ``` -public class CustomerQuery : BaseApiQuery +public class CustomerWebQuery : WebQuery { - public CustomerQuery() : base(Endpoints.BaseAddress) - { - } - protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + public CustomerWebQuery() : base(Endpoints.BaseAddress) { - // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; - - return ()=> new Uri(string.Format($"v2/customers/{customer.CustomerId}); + } + + protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) + { + // Executes as root or level 1 api. + var customerContext = (CustomerContext)context.Entity; + + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Customer, customerContext.CustomerId), UriKind.Absolute); + } + + ///

+ /// Override to pass outgoing request headers. + /// + /// + protected override IDictionary GetRequestHeaders() + { + return new Dictionary + { + { "x-meta-branch-code", "London" } + }; + } + + /// + /// Override to subscribe for given Response headers to be added to TQueryResult. + /// For receiving response headers, You need to implement the TQueryResult type from `WebHeaderResult` class instead of IQueryResult. + /// + /// + protected override IEnumerable GetResponseHeaders() + { + return new[] { "x-meta-branch-code" }; } } ``` +Note: CustomerResult is above query implements from `WebHeaderResult` class to support response headers. +``` +public class CustomerResult : WebHeaderResult +{ + public int Id { get; set; } + public string Code { get; set; } + public string Name { get; set; } +} +``` + 2. Example Child Query - OrdersQuery ``` -internal class OrdersQuery : BaseApiQuery> +internal class OrdersQuery : WebQuery> { public OrdersQuery() : base(Endpoints.BaseAddress) { @@ -284,6 +323,11 @@ internal class CustomerTransform : BaseTransformer customer.CustomerId = queryResult.Id; customer.CustomerName = queryResult.CustomerName; customer.CustomerCode = queryResult.CustomerCode; + + if (queryResult is WebHeaderResult webHeaderResult) + if (webHeaderResult.Headers.TryGetValue("x-meta-branch-code", out var branch)) + customer.Branch = branch; + return customer; } } @@ -484,7 +528,7 @@ public class QueryEngine : IQueryEngine where T : DbContext } ``` ### ii. IQuery -With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query custom query engine. +With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query with custom query engine. To do this, you need to extend `BaseQuery` where TQueryResult is `IQueryResult`. And, provide overrides for below methods. - `bool IsContextResolved()` @@ -495,7 +539,7 @@ This method is invoked by schemio to resolve the query context required for exec Example - EntityFramework Supported query implementation is shown below. ``` - public abstract class BaseSQLQuery + public abstract class SQLQuery : BaseQuery, ISQLQuery where TQueryResult : IQueryResult { diff --git a/src/Schemio.API/IWebResponse.cs b/src/Schemio.API/IWebResponse.cs deleted file mode 100644 index 51e9325..0000000 --- a/src/Schemio.API/IWebResponse.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Schemio.Core; - -namespace Schemio.API -{ - public interface IWebResponse : IQueryResult - { - IDictionary Headers { get; internal set; } - } -} \ No newline at end of file diff --git a/src/Schemio.API/WebHeaderResult.cs b/src/Schemio.API/WebHeaderResult.cs new file mode 100644 index 0000000..d2ef135 --- /dev/null +++ b/src/Schemio.API/WebHeaderResult.cs @@ -0,0 +1,12 @@ +using Schemio.Core; + +namespace Schemio.API +{ + /// + /// Implement to return web query response with headers. + /// + public abstract class WebHeaderResult : IQueryResult + { + public IDictionary Headers { get; internal set; } + } +} \ No newline at end of file diff --git a/src/Schemio.API/BaseWebQuery.cs b/src/Schemio.API/WebQuery.cs similarity index 84% rename from src/Schemio.API/BaseWebQuery.cs rename to src/Schemio.API/WebQuery.cs index e8f4027..34f5f7a 100644 --- a/src/Schemio.API/BaseWebQuery.cs +++ b/src/Schemio.API/WebQuery.cs @@ -4,16 +4,16 @@ namespace Schemio.API { - public abstract class BaseWebQuery : BaseQuery, IWebQuery - where TQueryResult : IWebResponse + public abstract class WebQuery : BaseQuery, IWebQuery + where TQueryResult : IQueryResult { protected Uri BaseAddress; - protected BaseWebQuery() : this(string.Empty) + protected WebQuery() : this(string.Empty) { } - protected BaseWebQuery(string baseAddress) + protected WebQuery(string baseAddress) { if (!string.IsNullOrEmpty(baseAddress)) BaseAddress = new Uri(baseAddress); @@ -150,22 +150,27 @@ private void SetResponseHeaders(HttpResponseMessage response, TQueryResult? resu var headers = GetResponseHeaders(); - if (headers != null && headers.Any()) - foreach (var header in headers) - { - if (!response.Headers.Any(r => r.Key == header)) - continue; + if (headers == null || !headers.Any()) + return; - var responseHeader = response.Headers.First(r => r.Key == header); + if (!(result is WebHeaderResult webResult)) + throw new InvalidOperationException($"{typeof(TQueryResult).Name} should implement from WebHeaderResult for response Headers"); - var value = responseHeader.Value != null && responseHeader.Value.Any() - ? responseHeader.Value.ElementAt(0) - : string.Empty; + foreach (var header in headers) + { + if (!response.Headers.Any(r => r.Key == header)) + continue; - result.Headers ??= new Dictionary(); + var responseHeader = response.Headers.First(r => r.Key == header); - result.Headers.Add(responseHeader.Key, value); - } + var value = responseHeader.Value != null && responseHeader.Value.Any() + ? responseHeader.Value.ElementAt(0) + : string.Empty; + + webResult.Headers ??= new Dictionary(); + + webResult.Headers.Add(responseHeader.Key, value); + } } } } \ No newline at end of file diff --git a/src/Schemio.Core/ISchemaPathMatcher.cs b/src/Schemio.Core/ISchemaPathMatcher.cs index c52ef0f..1779c0a 100644 --- a/src/Schemio.Core/ISchemaPathMatcher.cs +++ b/src/Schemio.Core/ISchemaPathMatcher.cs @@ -1,7 +1,13 @@ -namespace Schemio.Core +namespace Schemio.Core { public interface ISchemaPathMatcher { + /// + /// Determines whether there is a match for given input path vs configured paths for entity's object graph. + /// + /// Input path from IEntityContext.SchemaPaths + /// Configured paths from EntityConfiguration + /// bool IsMatch(string inputPath, ISchemaPaths configuredPaths); } } \ No newline at end of file diff --git a/src/Schemio.Core/PathMatchers/JPathMatcher.cs b/src/Schemio.Core/PathMatchers/JPathMatcher.cs index a24b1b2..fa2d03d 100644 --- a/src/Schemio.Core/PathMatchers/JPathMatcher.cs +++ b/src/Schemio.Core/PathMatchers/JPathMatcher.cs @@ -5,7 +5,7 @@ namespace Schemio.Core.PathMatchers public class JPathMatcher : ISchemaPathMatcher { public bool IsMatch(string inputXPath, ISchemaPaths configuredXPaths) => - // Does the template xpath contain any of the mapping xpaths? + // Does the template path contain any of the mapping xpaths? inputXPath.IsNotNullOrEmpty() && configuredXPaths.Paths.Any(x => inputXPath.ToLower().Contains(x.ToLower())); } diff --git a/src/Schemio.EntityFramework/IDbContext.cs b/src/Schemio.EntityFramework/IDbContext.cs deleted file mode 100644 index 8bc0aca..0000000 --- a/src/Schemio.EntityFramework/IDbContext.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace Schemio.EntityFramework -{ - public interface IDbContext - { - DbSet Set() where TEntity : class; - } -} \ No newline at end of file diff --git a/src/Schemio.EntityFramework/BaseSQLQuery.cs b/src/Schemio.EntityFramework/SQLQuery.cs similarity index 95% rename from src/Schemio.EntityFramework/BaseSQLQuery.cs rename to src/Schemio.EntityFramework/SQLQuery.cs index eeca8c8..ad20b68 100644 --- a/src/Schemio.EntityFramework/BaseSQLQuery.cs +++ b/src/Schemio.EntityFramework/SQLQuery.cs @@ -3,7 +3,7 @@ namespace Schemio.EntityFramework { - public abstract class BaseSQLQuery + public abstract class SQLQuery : BaseQuery, ISQLQuery where TQueryResult : IQueryResult { diff --git a/src/Schemio.SQL/BaseSQLQuery.cs b/src/Schemio.SQL/SQLQuery.cs similarity index 91% rename from src/Schemio.SQL/BaseSQLQuery.cs rename to src/Schemio.SQL/SQLQuery.cs index b85111c..85fa883 100644 --- a/src/Schemio.SQL/BaseSQLQuery.cs +++ b/src/Schemio.SQL/SQLQuery.cs @@ -3,7 +3,7 @@ namespace Schemio.SQL { - public abstract class BaseSQLQuery : BaseQuery, ISQLQuery + public abstract class SQLQuery : BaseQuery, ISQLQuery where TQueryResult : IQueryResult { async Task ISQLQuery.Run(IDbConnection conn) diff --git a/tests/Schemio.API.Tests/E2E.Tests/BaseTest.cs b/tests/Schemio.API.Tests/E2E.Tests/BaseTest.cs new file mode 100644 index 0000000..ebb7a34 --- /dev/null +++ b/tests/Schemio.API.Tests/E2E.Tests/BaseTest.cs @@ -0,0 +1,76 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using NUnit.Framework; +using Schemio.API.Tests.EntitySetup; +using Schemio.Core; +using Schemio.Core.PathMatchers; +using WireMock.RequestBuilders; +using WireMock.ResponseBuilders; +using WireMock.Server; + +namespace Schemio.API.Tests.E2E.Tests +{ + [TestFixture] + public class BaseTest + { + protected WireMockServer server; + protected ServiceProvider serviceProvider; + protected IDataProvider dataProvider; + + [OneTimeTearDown] + public void OneTimeTearDown() + { + if (serviceProvider is IDisposable disposable) + disposable.Dispose(); + + server.Stop(); + + if (server is IDisposable sdisposable) + sdisposable.Dispose(); + } + + public void StubApi(string endpoint, object body, IDictionary headers = null) + { + // Arrange (start WireMock.Net server) + + var response = Response.Create() + .WithStatusCode(200) + .WithBodyAsJson(body); + + if (headers != null) + response.WithHeaders(headers); + + server + .Given(Request.Create().WithUrl(endpoint).UsingGet()) + .RespondWith(response); + + // Act (use a HttpClient which connects to the URL where WireMock.Net is running) + var result = new HttpClient().GetAsync(endpoint).Result; + var raw = result.Content.ReadAsStringAsync().Result; + + // Assert + //Check.That(response).IsEqualTo(EXPECTED_RESULT); + } + + [OneTimeSetUp] + public void OneTimeSetup() + { + server = WireMockServer.Start(5000); + + var services = new ServiceCollection(); + + services.AddLogging(c => c.AddConsole()); + services.AddHttpClient(); + + services.UseSchemio() + .WithEngine() + .WithPathMatcher(c => new JPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + + // 4. Build the service provider + serviceProvider = services.BuildServiceProvider(); + + dataProvider = serviceProvider.GetService>(); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs b/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs new file mode 100644 index 0000000..df2c54f --- /dev/null +++ b/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs @@ -0,0 +1,168 @@ +using Schemio.Core.Helpers; +using NUnit.Framework; +using Schemio.API.Tests.EntitySetup; +using Schemio.API.Tests.EntitySetup.WebApis; +using static Schemio.API.Tests.EntitySetup.Customer; +using static Schemio.API.Tests.EntitySetup.Customer.Contacts; + +namespace Schemio.API.Tests.E2E.Tests +{ + [TestFixture] + public class E2ETests : BaseTest + { + [SetUp] + public void Setup() + { + StubApi(string.Format(Endpoints.BaseAddress + Endpoints.Customer, Endpoints.Ids.CustomerId), new { Id = 1000, Name = "John McKinsey", Code = "THG-UY6789" }, new Dictionary { { "x-meta-branch-code", "London" } }); + StubApi(string.Format(Endpoints.BaseAddress + Endpoints.Communication, Endpoints.Ids.CustomerId), new { Id = 4567, Telephone = "07675998878", Email = "John.McKinsy@gmail.com", HouseNo = "22", City = "London", Region = "London", PostalCode = "W12 6GH", Country = "United Kingdom" }); + StubApi(string.Format(Endpoints.BaseAddress + Endpoints.Orders, Endpoints.Ids.CustomerId), new[] { new { OrderId = 1234, OrderNo = "GHK-897GB", Date = "2024-01-01T00:00:00" } }); + StubApi(string.Format(Endpoints.BaseAddress + Endpoints.OrderItems, Endpoints.Ids.CustomerId, Endpoints.Ids.OrderId), new[] { new { OrderId = 1234, ItemId = 2244, Name = "Pen", Cost = 12.00m }, new { OrderId = 1234, ItemId = 6677, Name = "Book", Cost = 15.00m } }); + } + + [TearDown] + public void Teardown() + { + } + + [Test] + public void TestDataProviderToFetchWholeContractWhenNamesAreNull() + { + var customer = dataProvider.GetData(new CustomerContext + { + CustomerId = Endpoints.Ids.CustomerId + }); + + var expected = new Customer + { + Id = 1000, + Name = "John McKinsey", + Code = "THG-UY6789", + Branch = "London", // Received via response header + Communication = new Contacts + { + ContactId = 4567, + Phone = "07675998878", + Email = "John.McKinsy@gmail.com", + PostalAddress = new Address + { + HouseNo = "22", + City = "London", + Region = "London", + PostalCode = "W12 6GH", + Country = "United Kingdom", + } + }, + Orders = + [ + new Order + { + OrderId = 1234, + OrderNo = "GHK-897GB", + Date = DateTime.Parse("2024-01-01T00:00:00"), + Items = + [ + new Order.OrderItem + { + ItemId = 2244, Name = "Pen", Cost = 12.00m + }, + new Order.OrderItem + { + ItemId = 6677, Name = "Book", Cost = 15.00m + } + ] + } + ] + }; + + AssertAreEqual(expected, customer); + } + + [Test] + public void TestDataProviderToFetchPartialCustomerOrdersContractWhenNamesAreIncluded() + { + var customer = dataProvider.GetData(new CustomerContext + { + CustomerId = Endpoints.Ids.CustomerId, + SchemaPaths = ["customer.orders.items"] + }); + + var expected = new Customer + { + Id = 1000, + Name = "John McKinsey", + Code = "THG-UY6789", + Branch = "London", + Orders = + [ + new Order + { + OrderId = 1234, + OrderNo = "GHK-897GB", + Date = DateTime.Parse("2024-01-01T00:00:00"), + Items = + [ + new Order.OrderItem + { + ItemId = 2244, Name = "Pen", Cost = 12.00m + }, + new Order.OrderItem + { + ItemId = 6677, Name = "Book", Cost = 15.00m + } + ] + } + ] + }; + + AssertAreEqual(expected, customer); + } + + [Test] + public void TestDataProviderToFetchPartialCustomerCommunicationContractWhenNamesAreIncluded() + { + var customer = dataProvider.GetData(new CustomerContext + { + CustomerId = Endpoints.Ids.CustomerId, + SchemaPaths = ["customer.communication"] + }); + + var expected = new Customer + { + Id = 1000, + Name = "John McKinsey", + Code = "THG-UY6789", + Branch = "London", + Communication = new Contacts + { + ContactId = 4567, + Phone = "07675998878", + Email = "John.McKinsy@gmail.com", + PostalAddress = new Address + { + HouseNo = "22", + City = "London", + Region = "London", + PostalCode = "W12 6GH", + Country = "United Kingdom", + } + } + }; + + AssertAreEqual(expected, customer); + } + + private void AssertAreEqual(Customer expected, Customer actual) + { + var actualCustomer = actual.ToJson(); + var expectedCustomer = expected.ToJson(); + + Console.WriteLine("expected:"); + Console.WriteLine(expectedCustomer); + + Console.WriteLine("actual:"); + Console.WriteLine(actualCustomer); + + Assert.That(actualCustomer, Is.EqualTo(expectedCustomer)); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/Customer.cs b/tests/Schemio.API.Tests/EntitySetup/Customer.cs new file mode 100644 index 0000000..b9edab2 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/Customer.cs @@ -0,0 +1,46 @@ +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup +{ + public class Customer : IEntity + { + public int Id { get; set; } + public string Code { get; set; } + public string Name { get; set; } + public string Branch { get; set; } + public Contacts Communication { get; set; } + public Order[] Orders { get; set; } + + public class Contacts + { + public int ContactId { get; set; } + public string Phone { get; set; } + public string Email { get; set; } + public Address PostalAddress { get; set; } + + public class Address + { + public string HouseNo { get; set; } + public string City { get; set; } + public string Region { get; set; } + public string PostalCode { get; set; } + public string Country { get; set; } + } + } + + public class Order + { + public int OrderId { get; set; } + public string OrderNo { get; set; } + public DateTime Date { get; set; } + public OrderItem[] Items { get; set; } + + public class OrderItem + { + public int ItemId { get; set; } + public string Name { get; set; } + public decimal Cost { get; set; } + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/CustomerConfiguration.cs b/tests/Schemio.API.Tests/EntitySetup/CustomerConfiguration.cs new file mode 100644 index 0000000..da5f523 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/CustomerConfiguration.cs @@ -0,0 +1,25 @@ +using Schemio.API.Tests.EntitySetup.ResultTransformers; +using Schemio.API.Tests.EntitySetup.WebApis; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup +{ + internal class CustomerConfiguration : EntityConfiguration + { + /// + /// Constructs the api aggregate with web apis and result transformers to map data to aggregated contract. + /// + /// Mappings + public override IEnumerable> GetSchema() + { + return CreateSchema.For() + .Map(For.Paths("customer"), + customer => customer.Dependents + .Map(For.Paths("customer.communication")) + .Map(For.Paths("customer.orders"), + customerOrders => customerOrders.Dependents + .Map(For.Paths("customer.orders.items"))) + ).End(); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs new file mode 100644 index 0000000..d10e4f9 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs @@ -0,0 +1,10 @@ +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup +{ + internal class CustomerContext : IEntityContext + { + public int CustomerId { get; set; } + public string[] SchemaPaths { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/QueryResults/CommunicationResult.cs b/tests/Schemio.API.Tests/EntitySetup/QueryResults/CommunicationResult.cs new file mode 100644 index 0000000..729c021 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/QueryResults/CommunicationResult.cs @@ -0,0 +1,17 @@ +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.QueryResults +{ + [CacheResult] + public class CommunicationResult : IQueryResult + { + public int Id { get; set; } + public string Telephone { get; set; } + public string Email { get; set; } + public string HouseNo { get; set; } + public string City { get; set; } + public string Region { get; set; } + public string PostalCode { get; set; } + public string Country { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/QueryResults/CustomerResult.cs b/tests/Schemio.API.Tests/EntitySetup/QueryResults/CustomerResult.cs new file mode 100644 index 0000000..0a55954 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/QueryResults/CustomerResult.cs @@ -0,0 +1,9 @@ +namespace Schemio.API.Tests.EntitySetup.QueryResults +{ + public class CustomerResult : WebHeaderResult + { + public int Id { get; set; } + public string Code { get; set; } + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderItemResult.cs b/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderItemResult.cs new file mode 100644 index 0000000..260a388 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderItemResult.cs @@ -0,0 +1,10 @@ +namespace Schemio.API.Tests.EntitySetup.QueryResults +{ + public class OrderItemResult + { + public int OrderId { get; set; } + public int ItemId { get; set; } + public string Name { get; set; } + public decimal Cost { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderResult.cs b/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderResult.cs new file mode 100644 index 0000000..6a5a26d --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderResult.cs @@ -0,0 +1,11 @@ +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.QueryResults +{ + public class OrderResult : IQueryResult + { + public int OrderId { get; set; } + public string OrderNo { get; set; } + public DateTime Date { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/Transforms/CommunicationTransform.cs b/tests/Schemio.API.Tests/EntitySetup/Transforms/CommunicationTransform.cs new file mode 100644 index 0000000..d7fc36d --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/Transforms/CommunicationTransform.cs @@ -0,0 +1,29 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.ResultTransformers +{ + public class CommunicationTransform : BaseTransformer + { + public override void Transform(CommunicationResult apiResult, Customer contract) + { + var customer = contract ?? new Customer(); + customer.Communication = new Customer.Contacts + { + ContactId = apiResult.Id, + Email = apiResult.Email, + Phone = apiResult.Telephone + }; + + if (apiResult.HouseNo != null) + customer.Communication.PostalAddress = new Customer.Contacts.Address + { + HouseNo = apiResult.HouseNo, + City = apiResult.City, + Country = apiResult.Country, + PostalCode = apiResult.PostalCode, + Region = apiResult.Region + }; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/Transforms/CustomerTransform.cs b/tests/Schemio.API.Tests/EntitySetup/Transforms/CustomerTransform.cs new file mode 100644 index 0000000..3f53a6f --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/Transforms/CustomerTransform.cs @@ -0,0 +1,20 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.ResultTransformers +{ + public class CustomerTransform : BaseTransformer + { + public override void Transform(CustomerResult result, Customer contract) + { + var customer = contract ?? new Customer(); + customer.Id = result.Id; + customer.Name = result.Name; + customer.Code = result.Code; + + if (result is WebHeaderResult webResult) + if (webResult.Headers.TryGetValue("x-meta-branch-code", out var branch)) + customer.Branch = branch; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/Transforms/OrderItemsTransform.cs b/tests/Schemio.API.Tests/EntitySetup/Transforms/OrderItemsTransform.cs new file mode 100644 index 0000000..8c5912a --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/Transforms/OrderItemsTransform.cs @@ -0,0 +1,31 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; +using Schemio.Core.Helpers; +using static Schemio.API.Tests.EntitySetup.Customer.Order; + +namespace Schemio.API.Tests.EntitySetup.ResultTransformers +{ + public class OrderItemsTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer customer) + { + if (collectionResult == null || !collectionResult.Any() || customer.Orders == null) + return; + + foreach (var result in collectionResult) + { + var order = customer.Orders.FirstOrDefault(o => o.OrderId == result.OrderId); + if (order == null) + continue; + + order.Items = ArrayUtil.EnsureAndResizeArray(order.Items, out var index); + order.Items[index] = new OrderItem + { + ItemId = result.ItemId, + Name = result.Name, + Cost = result.Cost + }; + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/Transforms/OrdersTransform.cs b/tests/Schemio.API.Tests/EntitySetup/Transforms/OrdersTransform.cs new file mode 100644 index 0000000..8f71f72 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/Transforms/OrdersTransform.cs @@ -0,0 +1,27 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; +using static Schemio.API.Tests.EntitySetup.Customer; + +namespace Schemio.API.Tests.EntitySetup.ResultTransformers +{ + public class OrdersTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer contract) + { + if (collectionResult == null || !collectionResult.Any()) + return; + + var customer = contract ?? new Customer(); + + customer.Orders = new Order[collectionResult.Count]; + + for (var index = 0; index < collectionResult.Count; index++) + customer.Orders[index] = new Order + { + Date = collectionResult[index].Date, + OrderId = collectionResult[index].OrderId, + OrderNo = collectionResult[index].OrderNo + }; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/CommunicationWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/CommunicationWebQuery.cs new file mode 100644 index 0000000..6207527 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/CommunicationWebQuery.cs @@ -0,0 +1,18 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.WebApis +{ + internal class CommunicationWebQuery : WebQuery + { + public CommunicationWebQuery() : base(Endpoints.BaseAddress) + { + } + + protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) + { + var customer = (CustomerResult)parentApiResult; + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Communication, customer.Id), UriKind.Absolute); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs new file mode 100644 index 0000000..ef798d7 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs @@ -0,0 +1,42 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.WebApis +{ + public class CustomerWebQuery : WebQuery + { + public CustomerWebQuery() : base(Endpoints.BaseAddress) + { + } + + protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) + { + // Executes as root or level 1 api. + var customerContext = (CustomerContext)context.Entity; + + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Customer, customerContext.CustomerId), UriKind.Absolute); + } + + /// + /// Override to pass outgoing request headers. + /// + /// + protected override IDictionary GetRequestHeaders() + { + return new Dictionary + { + { "x-meta-branch-code", "London" } + }; + } + + /// + /// Override to subscribe for given Response headers to be added to Web query Result. + /// For receiving response headers, You need to implement the TQueryResult type from WebResult class instead of IQueryResult. + /// + /// + protected override IEnumerable GetResponseHeaders() + { + return new[] { "x-meta-branch-code" }; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/Endpoints.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/Endpoints.cs new file mode 100644 index 0000000..e59bf16 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/Endpoints.cs @@ -0,0 +1,26 @@ +namespace Schemio.API.Tests.EntitySetup.WebApis +{ + public static class Endpoints + { + public const string Customer = "v2/clients/{0}"; + public const string Communication = "v2/clients/{0}/communication"; + public const string Orders = "v2/clients/{0}/orders"; + public const string OrderItems = "v2/clients/{0}/orders/items?$filter=orderId in {1}"; + + public const string BaseAddress = "http://localhost:5000/"; + + public static class Ids + { + public const int CustomerId = 1000; + public const int OrderId = 1234; + } + + public static class Response + { + public const string Customer = @"{""id"": 1000, ""code"": ""ABC-2244"",""name"": ""John McKinsy""}"; + public const string Communication = @"{ 'contactId': 4567, 'phone': '07675998878', 'email': 'John.McKinsy@gmail.com', 'postalAddress': { 'addressId': 3456, 'houseNo': '22', 'city': 'London', 'region': 'London', 'postalCode': 'W12 6GH', 'country': 'United Kingdom' } }"; + public const string Orders = @"{ 'orderId': 1234, 'orderNo': 'GHK-897GB', 'date': '2024-01-01T00:00:00' }"; + public const string OrderItems = @"[{ 'itemId': 2244, 'name': 'Pen', 'cost': 12.0 }, { 'itemId': 6677, 'name': 'Book', 'cost': 15.0 }]"; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs new file mode 100644 index 0000000..7330f02 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs @@ -0,0 +1,22 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; +using Schemio.Core.Helpers; + +namespace Schemio.API.Tests.EntitySetup.WebApis +{ + internal class OrderItemsWebQuery : WebQuery> + { + public OrderItemsWebQuery() : base(Endpoints.BaseAddress) + { + } + + protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) + { + // Execute as nested api to order parent api taking OrderResult to resolve api parameter. + var orders = (CollectionResult)parentApiResult; + var customerContext = (CustomerContext)context.Entity; + + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.OrderItems, customerContext.CustomerId, orders.Select(o => o.OrderId).ToCSV()), UriKind.Absolute); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/OrdersWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrdersWebQuery.cs new file mode 100644 index 0000000..daa43b8 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrdersWebQuery.cs @@ -0,0 +1,20 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.WebApis +{ + internal class OrdersWebQuery : WebQuery> + { + public OrdersWebQuery() : base(Endpoints.BaseAddress) + { + } + + protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) + { + // Execute as child to customer api. + var customer = (CustomerResult)parentApiResult; + + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Orders, customer.Id), UriKind.Absolute); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/Schemio.API.Tests.csproj b/tests/Schemio.API.Tests/Schemio.API.Tests.csproj new file mode 100644 index 0000000..5a1ea0b --- /dev/null +++ b/tests/Schemio.API.Tests/Schemio.API.Tests.csproj @@ -0,0 +1,28 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index 93d65ba..a9dec25 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -38,10 +38,6 @@ public void Setup() services.AddLogging(); - //services.UseSchemio(new XPathMatcher(), - // c => new QueryEngine(c.GetService>())) - // .AddEntitySchema(); - services.UseSchemio() .WithEngine(c => new QueryEngine(c.GetService>())) .WithPathMatcher(c => new XPathMatcher()) diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index 9135c5a..914b098 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index 8a8d10b..d63855a 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index b9efa05..6c306ec 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index 306f388..a16eae5 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index a6c059a..f701f36 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -5,7 +5,6 @@ using Schemio.Core.Helpers; using Schemio.Core.PathMatchers; using Schemio.SQL; -using Schemio.SQL.Tests.EntitySetup; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas; @@ -43,9 +42,6 @@ public void Setup() services.AddLogging(); - //services.UseSchemio(new XPathMatcher(), c => new QueryEngine(configuration)) - // .AddEntitySchema(); - services.UseSchemio() .WithEngine(c => new QueryEngine(configuration)) .WithPathMatcher(c => new XPathMatcher()) diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs index 0a1b735..0a75dd9 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs index d254f27..d1b9b5d 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs index 141a162..4256ae7 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs @@ -5,7 +5,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs index 60f17b4..e49a354 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { From 67438ac586771d2bfbcc1951b9136398f60d634c Mon Sep 17 00:00:00 2001 From: Ninja Date: Wed, 20 Nov 2024 23:30:42 +0000 Subject: [PATCH 25/64] - Refactor IoC ServiceExtensions --- index.md | 2 +- src/Schemio.API/WebQuery.cs | 2 +- src/Schemio.Core/ServicesExtensions.cs | 51 ++++++++++---------------- 3 files changed, 22 insertions(+), 33 deletions(-) diff --git a/index.md b/index.md index 913fb2c..d2ae4ff 100644 --- a/index.md +++ b/index.md @@ -299,7 +299,7 @@ internal class OrdersQuery : WebQuery> protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer api. - var customer = (CustomerResult)parentApiResult; + var customer = (CustomerResult)parentQueryResult; return ()=> new Uri(string.Format($"v2/customers/{customer.Id}/orders); } diff --git a/src/Schemio.API/WebQuery.cs b/src/Schemio.API/WebQuery.cs index 34f5f7a..99c3e95 100644 --- a/src/Schemio.API/WebQuery.cs +++ b/src/Schemio.API/WebQuery.cs @@ -39,7 +39,7 @@ protected virtual IDictionary GetRequestHeaders() /// /// Override to get custom incoming headers with the api response. - /// The headers collection will be present on `IApiResult.Headers` when api response includes any of the headers defined in this method. + /// The headers collection will be present on `WebHeaderResult.Headers` when api response includes any of the headers defined in this method. /// /// protected virtual IEnumerable GetResponseHeaders() diff --git a/src/Schemio.Core/ServicesExtensions.cs b/src/Schemio.Core/ServicesExtensions.cs index 9094514..263be61 100644 --- a/src/Schemio.Core/ServicesExtensions.cs +++ b/src/Schemio.Core/ServicesExtensions.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Schemio.Core.Impl; using Schemio.Core.PathMatchers; @@ -6,40 +7,13 @@ namespace Schemio.Core { public static class ServicesExtensions { - public static IServiceCollection UseSchemio(this IServiceCollection services, - ISchemaPathMatcher schemaPathMatcher = null, - params Func[] queryEngines - ) - { - services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); - services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); - services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); - - services.AddTransient(); - services.AddTransient(c => schemaPathMatcher ?? new XPathMatcher()); - - if (queryEngines != null && queryEngines.Length > 0) - foreach (var engine in queryEngines) - services.AddTransient(c => engine(c)); - - return services; - } - - public static IServiceCollection AddEntitySchema(this IServiceCollection services) - where TEntity : IEntity - where TSchema : IEntityConfiguration - { - services.AddTransient(typeof(IEntityConfiguration), typeof(TSchema)); - - return services; - } - public static SchemioOptionsBuilder UseSchemio(this IServiceCollection services) { services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); services.AddTransient(); + services.AddTransient(); return new SchemioOptionsBuilder(services); } @@ -54,11 +28,11 @@ public SchemioOptionsBuilder(IServiceCollection services) public IServiceCollection Services { get; } - public ISchemioOptions WithEngine(Func queryEngines) + public ISchemioOptions WithEngine(Func queryEngine) { - if (queryEngines != null) + if (queryEngine != null) { - Services.AddTransient(c => queryEngines(c)); + Services.AddTransient(c => queryEngine(c)); } return this; @@ -81,14 +55,29 @@ public ISchemioOptions WithEngines(Func queryE return this; } + /// + /// Register an instance of ISchemaPathMatcher. Default is XPathMatcher. + /// + /// + /// public ISchemioOptions WithPathMatcher(Func pathMatcher) { if (pathMatcher != null) + { + Services.RemoveAll(); Services.AddTransient(c => pathMatcher(c)); + } return this; } + /// + /// Register and instance of EntityConfiguration + /// You could register configuration for multiple entities. + /// + /// IEntity + /// Instance of EntityConfiguration[typeparamref name="T"] + /// public ISchemioOptions WithEntityConfiguration(Func> entityConfiguration) where T : class, IEntity { if (entityConfiguration != null) From 8104198b5919e21fe35807804deeab82f1f3b6d8 Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 01:25:47 +0000 Subject: [PATCH 26/64] - Rename IEntityContext to IEntityRequest --- index.md | 14 +++++++------- src/Schemio.Core/DataContext.cs | 6 +++--- src/Schemio.Core/IDataContext.cs | 2 +- src/Schemio.Core/IDataProvider.cs | 2 +- src/Schemio.Core/IEntityContextValidator.cs | 2 +- .../{IEntityContext.cs => IEntityRequest.cs} | 2 +- src/Schemio.Core/ISchemaPathMatcher.cs | 2 +- src/Schemio.Core/Impl/DataProvider.cs | 17 ++--------------- src/Schemio.Core/Impl/QueryBuilder.cs | 4 ++-- src/Schemio.Core/XML/XMLDataProvider.cs | 6 +++--- tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs | 6 +++--- .../{CustomerContext.cs => CustomerRequest.cs} | 2 +- .../EntitySetup/WebApis/CustomerWebQuery.cs | 2 +- .../EntitySetup/WebApis/OrderItemsWebQuery.cs | 2 +- .../DataProvider.Tests/EntityBuilderTests.cs | 2 +- .../Configuration/Queries/CustomerQuery.cs | 2 +- .../EntitySetup/CustomerContext.cs | 2 +- .../Schemio.EntityFramework.Tests/E2E.Tests.cs | 6 +++--- .../{CustomerContext.cs => CustomerRequest.cs} | 2 +- .../EntitySchemas/Queries/CustomerQuery.cs | 2 +- tests/Schemio.SQL.Tests/E2E.Tests.cs | 8 ++++---- .../{CustomerContext.cs => CustomerRequest.cs} | 2 +- .../Queries/CustomerQuery.cs | 2 +- 23 files changed, 42 insertions(+), 55 deletions(-) rename src/Schemio.Core/{IEntityContext.cs => IEntityRequest.cs} (83%) rename tests/Schemio.API.Tests/EntitySetup/{CustomerContext.cs => CustomerRequest.cs} (76%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/{CustomerContext.cs => CustomerRequest.cs} (77%) rename tests/Schemio.SQL.Tests/EntitySetup/{CustomerContext.cs => CustomerRequest.cs} (76%) diff --git a/index.md b/index.md index d2ae4ff..3d66219 100644 --- a/index.md +++ b/index.md @@ -141,7 +141,7 @@ public class CustomerQuery : SQLQuery protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; + var customer = (CustomerRequest)context.Request; return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( @@ -189,7 +189,7 @@ public class CustomerQuery : SQLQuery protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. parentQueryResult will be null. - var customer = (CustomerContext)context.Entity; + var customer = (CustomerRequest)context.Request; return async dbContext => { @@ -251,9 +251,9 @@ public class CustomerWebQuery : WebQuery protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) { // Executes as root or level 1 api. - var customerContext = (CustomerContext)context.Entity; + var customerRequest = (CustomerRequest)context.Request; - return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Customer, customerContext.CustomerId), UriKind.Absolute); + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Customer, customerRequest.CustomerId), UriKind.Absolute); } /// @@ -465,10 +465,10 @@ iv. Example registration: Multiple Engines To use Data provider, Inject `IDataProvider` where T is IEntity, using constructor & property injection method or explicitly Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` -##### ii. Call DataProvider.GetData(IEntityContext context) method. -You need to call the `GetData()` method with an instance of parameter class derived from `IEntityContext` interface. +##### ii. Call DataProvider.GetData(IEntityRequest context) method. +You need to call the `GetData()` method with an instance of parameter class derived from `IEntityRequest` interface. -The `IEntityContext` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. +The `IEntityRequest` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. - When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. - When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. diff --git a/src/Schemio.Core/DataContext.cs b/src/Schemio.Core/DataContext.cs index 140e743..2e528fe 100644 --- a/src/Schemio.Core/DataContext.cs +++ b/src/Schemio.Core/DataContext.cs @@ -2,13 +2,13 @@ namespace Schemio.Core { internal class DataContext : IDataContext { - public DataContext(IEntityContext entityContext) + public DataContext(IEntityRequest request) { - Entity = entityContext; + Request = request; Cache = new Dictionary(); } public Dictionary Cache { get; set; } - public IEntityContext Entity { get; set; } + public IEntityRequest Request { get; set; } } } \ No newline at end of file diff --git a/src/Schemio.Core/IDataContext.cs b/src/Schemio.Core/IDataContext.cs index 151268f..e53967c 100644 --- a/src/Schemio.Core/IDataContext.cs +++ b/src/Schemio.Core/IDataContext.cs @@ -2,6 +2,6 @@ namespace Schemio.Core { public interface IDataContext : IEntityContextCache { - IEntityContext Entity { get; } + IEntityRequest Request { get; } } } \ No newline at end of file diff --git a/src/Schemio.Core/IDataProvider.cs b/src/Schemio.Core/IDataProvider.cs index 12329e8..ef3899b 100644 --- a/src/Schemio.Core/IDataProvider.cs +++ b/src/Schemio.Core/IDataProvider.cs @@ -2,6 +2,6 @@ namespace Schemio.Core { public interface IDataProvider where TEntity : IEntity { - TEntity GetData(IEntityContext context); + TEntity GetData(IEntityRequest request); } } \ No newline at end of file diff --git a/src/Schemio.Core/IEntityContextValidator.cs b/src/Schemio.Core/IEntityContextValidator.cs index f1accbe..62f3d29 100644 --- a/src/Schemio.Core/IEntityContextValidator.cs +++ b/src/Schemio.Core/IEntityContextValidator.cs @@ -2,6 +2,6 @@ namespace Schemio.Core { public interface IEntityContextValidator { - public void Validate(IEntityContext context); + public void Validate(IEntityRequest context); } } \ No newline at end of file diff --git a/src/Schemio.Core/IEntityContext.cs b/src/Schemio.Core/IEntityRequest.cs similarity index 83% rename from src/Schemio.Core/IEntityContext.cs rename to src/Schemio.Core/IEntityRequest.cs index 1e85b70..f26d15f 100644 --- a/src/Schemio.Core/IEntityContext.cs +++ b/src/Schemio.Core/IEntityRequest.cs @@ -1,6 +1,6 @@ namespace Schemio.Core { - public interface IEntityContext + public interface IEntityRequest { /// /// Entity schema paths for data retrieval. diff --git a/src/Schemio.Core/ISchemaPathMatcher.cs b/src/Schemio.Core/ISchemaPathMatcher.cs index 1779c0a..51e71de 100644 --- a/src/Schemio.Core/ISchemaPathMatcher.cs +++ b/src/Schemio.Core/ISchemaPathMatcher.cs @@ -5,7 +5,7 @@ public interface ISchemaPathMatcher /// /// Determines whether there is a match for given input path vs configured paths for entity's object graph. /// - /// Input path from IEntityContext.SchemaPaths + /// Input path from IEntityRequest.SchemaPaths /// Configured paths from EntityConfiguration /// bool IsMatch(string inputPath, ISchemaPaths configuredPaths); diff --git a/src/Schemio.Core/Impl/DataProvider.cs b/src/Schemio.Core/Impl/DataProvider.cs index 0c4b8df..484c758 100644 --- a/src/Schemio.Core/Impl/DataProvider.cs +++ b/src/Schemio.Core/Impl/DataProvider.cs @@ -41,9 +41,9 @@ public DataProvider( this.entityBuilder = entityBuilder; } - public TEntity GetData(IEntityContext entityContext) + public TEntity GetData(IEntityRequest request) { - var context = new DataContext(entityContext); + var context = new DataContext(request); return GetData(context); } @@ -53,19 +53,6 @@ internal TEntity GetData(IDataContext context) var watch = System.Diagnostics.Stopwatch.StartNew(); var queries = queryBuilder.Build(context); - //foreach (var item in queries.Queries) - //{ - // Console.WriteLine("L1 Query To Execute: " + item.GetType().Name); - - // foreach (var item2 in item.Children) - // { - // Console.WriteLine("L2 Query To Execute: " + item2.GetType().Name); - - // foreach (var item3 in item2.Children) - // Console.WriteLine("L3 Query To Execute: " + item3.GetType().Name); - // } - //} - watch.Stop(); logger?.LogInformation("Query builder executed in " + watch.ElapsedMilliseconds + " ms"); diff --git a/src/Schemio.Core/Impl/QueryBuilder.cs b/src/Schemio.Core/Impl/QueryBuilder.cs index 5de3cea..2ed81c2 100644 --- a/src/Schemio.Core/Impl/QueryBuilder.cs +++ b/src/Schemio.Core/Impl/QueryBuilder.cs @@ -57,8 +57,8 @@ private QueryList GetMappedQueries(IReadOnlyCollection> private IEnumerable FilterByPaths(IDataContext context, IEnumerable> mappings) { - var matchedMappings = context.Entity.SchemaPaths != null - ? mappings.Where(mapping => context.Entity.SchemaPaths.Any(Path => schemaPathMatcher.IsMatch(Path, mapping.SchemaPaths))) + var matchedMappings = context.Request?.SchemaPaths != null + ? mappings.Where(mapping => context.Request.SchemaPaths.Any(Path => schemaPathMatcher.IsMatch(Path, mapping.SchemaPaths))) .ToList() : mappings; diff --git a/src/Schemio.Core/XML/XMLDataProvider.cs b/src/Schemio.Core/XML/XMLDataProvider.cs index d4e859d..f3e1872 100644 --- a/src/Schemio.Core/XML/XMLDataProvider.cs +++ b/src/Schemio.Core/XML/XMLDataProvider.cs @@ -28,7 +28,7 @@ public XMLDataProvider(IEntityContextValidator entityContextValidator, /// /// /// XDocument - public virtual XDocument GetData(IEntityContext context) + public virtual XDocument GetData(IEntityRequest context) { // Log Request context. LogRequest(context); @@ -63,8 +63,8 @@ private XDocument TransformToXmlDocument(T dataSource) return doc; } - private void LogRequest(IEntityContext context) => logger.LogInformation(context.GetType().Name); + private void LogRequest(IEntityRequest context) => logger.LogInformation(context.GetType().Name); - private void ValidateRequest(IEntityContext context) => entityContextValidator.Validate(context); + private void ValidateRequest(IEntityRequest context) => entityContextValidator.Validate(context); } } \ No newline at end of file diff --git a/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs b/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs index df2c54f..b44161a 100644 --- a/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs +++ b/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs @@ -27,7 +27,7 @@ public void Teardown() [Test] public void TestDataProviderToFetchWholeContractWhenNamesAreNull() { - var customer = dataProvider.GetData(new CustomerContext + var customer = dataProvider.GetData(new CustomerRequest { CustomerId = Endpoints.Ids.CustomerId }); @@ -80,7 +80,7 @@ public void TestDataProviderToFetchWholeContractWhenNamesAreNull() [Test] public void TestDataProviderToFetchPartialCustomerOrdersContractWhenNamesAreIncluded() { - var customer = dataProvider.GetData(new CustomerContext + var customer = dataProvider.GetData(new CustomerRequest { CustomerId = Endpoints.Ids.CustomerId, SchemaPaths = ["customer.orders.items"] @@ -120,7 +120,7 @@ public void TestDataProviderToFetchPartialCustomerOrdersContractWhenNamesAreIncl [Test] public void TestDataProviderToFetchPartialCustomerCommunicationContractWhenNamesAreIncluded() { - var customer = dataProvider.GetData(new CustomerContext + var customer = dataProvider.GetData(new CustomerRequest { CustomerId = Endpoints.Ids.CustomerId, SchemaPaths = ["customer.communication"] diff --git a/tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.API.Tests/EntitySetup/CustomerRequest.cs similarity index 76% rename from tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs rename to tests/Schemio.API.Tests/EntitySetup/CustomerRequest.cs index d10e4f9..3568b57 100644 --- a/tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.API.Tests/EntitySetup/CustomerRequest.cs @@ -2,7 +2,7 @@ namespace Schemio.API.Tests.EntitySetup { - internal class CustomerContext : IEntityContext + internal class CustomerRequest : IEntityRequest { public int CustomerId { get; set; } public string[] SchemaPaths { get; set; } diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs index ef798d7..1f5d26f 100644 --- a/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs @@ -12,7 +12,7 @@ public CustomerWebQuery() : base(Endpoints.BaseAddress) protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) { // Executes as root or level 1 api. - var customerContext = (CustomerContext)context.Entity; + var customerContext = (CustomerRequest)context.Request; return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Customer, customerContext.CustomerId), UriKind.Absolute); } diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs index 7330f02..9d68217 100644 --- a/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs @@ -14,7 +14,7 @@ protected override Func GetQuery(IDataContext context, IQueryResult parentA { // Execute as nested api to order parent api taking OrderResult to resolve api parameter. var orders = (CollectionResult)parentApiResult; - var customerContext = (CustomerContext)context.Entity; + var customerContext = (CustomerRequest)context.Request; return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.OrderItems, customerContext.CustomerId, orders.Select(o => o.OrderId).ToCSV()), UriKind.Absolute); } diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs index d3ac786..1d77a96 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs @@ -78,7 +78,7 @@ public override IEnumerable> GetSchema() } } - internal class EntityContext : IEntityContext + internal class EntityContext : IEntityRequest { public int CustomerId { get; set; } public string[] SchemaPaths { get; set; } diff --git a/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs index 944a679..003c58c 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs @@ -9,7 +9,7 @@ public class CustomerQuery : BaseQuery public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; + var customer = (CustomerContext)context.Request; QueryParameter = new { customer.CustomerId diff --git a/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs index 9a98422..17dcab3 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs @@ -1,6 +1,6 @@ namespace Schemio.Core.Tests.EntitySetup { - internal class CustomerContext : IEntityContext + internal class CustomerContext : IEntityRequest { public int CustomerId { get; set; } public string[] SchemaPaths { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs b/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs index 48d4f96..860c2b0 100644 --- a/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs +++ b/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs @@ -19,7 +19,7 @@ public void Setup() [Test] public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1 }); @@ -68,7 +68,7 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() [Test] public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1, SchemaPaths = new[] { "Customer/Communication" } @@ -102,7 +102,7 @@ public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() [Test] public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1, SchemaPaths = new[] { "Customer/orders/order/items/item" } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerRequest.cs similarity index 77% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerRequest.cs index 9339619..e33b242 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerRequest.cs @@ -2,7 +2,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup { - internal class CustomerContext : IEntityContext + internal class CustomerRequest : IEntityRequest { public int CustomerId { get; set; } public string[] SchemaPaths { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index d63855a..4e8daa8 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -9,7 +9,7 @@ public class CustomerQuery : SQLQuery protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. parentQueryResult will be null. - var customer = (CustomerContext)context.Entity; + var customer = (CustomerRequest)context.Request; return async dbContext => { diff --git a/tests/Schemio.SQL.Tests/E2E.Tests.cs b/tests/Schemio.SQL.Tests/E2E.Tests.cs index bdf8c1d..23dc60d 100644 --- a/tests/Schemio.SQL.Tests/E2E.Tests.cs +++ b/tests/Schemio.SQL.Tests/E2E.Tests.cs @@ -20,7 +20,7 @@ public void Setup() [Test] public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1 }); @@ -69,7 +69,7 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() [Test] public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1, SchemaPaths = new[] { "Customer/orders/order/items/item" } @@ -105,7 +105,7 @@ public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() [Test] public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1, SchemaPaths = new[] { "Customer/Communication" } @@ -139,7 +139,7 @@ public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() [Test] public void TestDataProviderToCacheResultForResultsWithAttributeApplied() { - var context = new DataContext(new CustomerContext + var context = new DataContext(new CustomerRequest { CustomerId = 1 }); diff --git a/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.SQL.Tests/EntitySetup/CustomerRequest.cs similarity index 76% rename from tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs rename to tests/Schemio.SQL.Tests/EntitySetup/CustomerRequest.cs index 08db7e7..6234c15 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/CustomerRequest.cs @@ -2,7 +2,7 @@ namespace Schemio.SQL.Tests.EntitySetup { - internal class CustomerContext : IEntityContext + internal class CustomerRequest : IEntityRequest { public int CustomerId { get; set; } public string[] SchemaPaths { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs index d1b9b5d..fb5c2ca 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs @@ -9,7 +9,7 @@ public class CustomerQuery : SQLQuery protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; + var customer = (CustomerRequest)context.Request; return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( From 7ef5f4bd73992889ccf7b2c5d4401b00da9252fa Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 20:44:30 +0000 Subject: [PATCH 27/64] - Update Readme --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5a1ca08..e1c287c 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,15 @@ | Schemio.Core|[![NuGet version](https://badge.fury.io/nu/Schemio.Core.svg)](https://badge.fury.io/nu/Schemio.Core) | Provides `core` functionality to configure nested queries and transformers. With ability to map schema paths (XPath/JSONPath) to entity's object graph. `No QueryEngine` provided and requires implementing IQueryEngine to execute IQuery instances. | | Schemio.SQL|[![NuGet version](https://badge.fury.io/nu/Schemio.SQL.svg)](https://badge.fury.io/nu/Schemio.SQL)| Provides schemio with query engine using `Dapper` to execute SQL queries. | | Schemio.EntityFramework|[![NuGet version](https://badge.fury.io/nu/Schemio.EntityFramework.svg)](https://badge.fury.io/nu/Schemio.EntityFramework)| Provides schemio with `Entity Framework` query engine to execute queries using DbContext. | -| Schemio.Api|[![NuGet version](https://badge.fury.io/nu/Schemio.Api.svg)](https://badge.fury.io/nu/Schemio.Api)| Provides schemio with `Web Api` query engine to execute apis using HttpClient. | +| Schemio.API|[![NuGet version](https://badge.fury.io/nu/Schemio.Api.svg)](https://badge.fury.io/nu/Schemio.Api)| Provides schemio with `Web Api` query engine to execute apis using HttpClient. | ## Concept ### What is Schemio? -`Schemio` is a data aggregation framework that +`Schemio` is a data aggregation framework using queries that can target different data platforms. + +Key benefits: - allows fetching `aggregated` data from `heterogeneous` data storages. You could combine queries targetting different data platforms (example. `SQL`, `API`, `Cache`) to return an aggregated data `entity`. -- allows `selectively` fetching only `parts` of the aggregated data entity. You could retrieve an aggregated data entity with only `sections` of its `object graph` `populated` with data depending upon the `context` passed with the request. +- allows `selectively` fetching only `parts` of the aggregated data entity. You could retrieve an aggregated data entity with only `sections` of its `object graph` populated with data depending upon the `schema paths` passed with the request. ### When to use Schemio? Schemio is perfect fit for many use cases. Few examples that require the service tier to dynamically fetch aggregated data with high performance, availability and scalability are From 321500094b738c11e33923a2394f80ecbec2431e Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 22:24:25 +0000 Subject: [PATCH 28/64] - Target .Net 9.0 --- src/Schemio.API/Schemio.API.csproj | 2 +- src/Schemio.Core/Schemio.Core.csproj | 8 +-- .../Schemio.EntityFramework.csproj | 4 +- .../Motley - Backup (1).SQL.csproj | 55 ------------------- .../Motley - Backup (10).SQL.csproj | 55 ------------------- .../Motley - Backup (100).SQL.csproj | 55 ------------------- .../Motley - Backup (101).SQL.csproj | 55 ------------------- .../Motley - Backup (102).SQL.csproj | 55 ------------------- .../Motley - Backup (103).SQL.csproj | 55 ------------------- .../Motley - Backup (104).SQL.csproj | 55 ------------------- .../Motley - Backup (105).SQL.csproj | 55 ------------------- .../Motley - Backup (106).SQL.csproj | 55 ------------------- .../Motley - Backup (107).SQL.csproj | 55 ------------------- .../Motley - Backup (108).SQL.csproj | 55 ------------------- .../Motley - Backup (109).SQL.csproj | 55 ------------------- .../Motley - Backup (11).SQL.csproj | 55 ------------------- .../Motley - Backup (110).SQL.csproj | 55 ------------------- .../Motley - Backup (111).SQL.csproj | 55 ------------------- .../Motley - Backup (112).SQL.csproj | 55 ------------------- .../Motley - Backup (113).SQL.csproj | 55 ------------------- .../Motley - Backup (114).SQL.csproj | 55 ------------------- .../Motley - Backup (115).SQL.csproj | 55 ------------------- .../Motley - Backup (116).SQL.csproj | 55 ------------------- .../Motley - Backup (117).SQL.csproj | 55 ------------------- .../Motley - Backup (118).SQL.csproj | 55 ------------------- .../Motley - Backup (119).SQL.csproj | 55 ------------------- .../Motley - Backup (12).SQL.csproj | 55 ------------------- .../Motley - Backup (120).SQL.csproj | 55 ------------------- .../Motley - Backup (121).SQL.csproj | 55 ------------------- .../Motley - Backup (122).SQL.csproj | 55 ------------------- .../Motley - Backup (123).SQL.csproj | 55 ------------------- .../Motley - Backup (124).SQL.csproj | 55 ------------------- .../Motley - Backup (125).SQL.csproj | 55 ------------------- .../Motley - Backup (126).SQL.csproj | 55 ------------------- .../Motley - Backup (127).SQL.csproj | 55 ------------------- .../Motley - Backup (128).SQL.csproj | 55 ------------------- .../Motley - Backup (129).SQL.csproj | 55 ------------------- .../Motley - Backup (13).SQL.csproj | 55 ------------------- .../Motley - Backup (130).SQL.csproj | 55 ------------------- .../Motley - Backup (131).SQL.csproj | 55 ------------------- .../Motley - Backup (132).SQL.csproj | 55 ------------------- .../Motley - Backup (133).SQL.csproj | 55 ------------------- .../Motley - Backup (134).SQL.csproj | 55 ------------------- .../Motley - Backup (135).SQL.csproj | 55 ------------------- .../Motley - Backup (136).SQL.csproj | 55 ------------------- .../Motley - Backup (137).SQL.csproj | 55 ------------------- .../Motley - Backup (138).SQL.csproj | 55 ------------------- .../Motley - Backup (139).SQL.csproj | 55 ------------------- .../Motley - Backup (14).SQL.csproj | 55 ------------------- .../Motley - Backup (140).SQL.csproj | 55 ------------------- .../Motley - Backup (141).SQL.csproj | 55 ------------------- .../Motley - Backup (142).SQL.csproj | 55 ------------------- .../Motley - Backup (143).SQL.csproj | 55 ------------------- .../Motley - Backup (144).SQL.csproj | 55 ------------------- .../Motley - Backup (145).SQL.csproj | 55 ------------------- .../Motley - Backup (146).SQL.csproj | 55 ------------------- .../Motley - Backup (147).SQL.csproj | 55 ------------------- .../Motley - Backup (148).SQL.csproj | 55 ------------------- .../Motley - Backup (149).SQL.csproj | 55 ------------------- .../Motley - Backup (15).SQL.csproj | 55 ------------------- .../Motley - Backup (150).SQL.csproj | 55 ------------------- .../Motley - Backup (151).SQL.csproj | 55 ------------------- .../Motley - Backup (152).SQL.csproj | 55 ------------------- .../Motley - Backup (153).SQL.csproj | 55 ------------------- .../Motley - Backup (154).SQL.csproj | 55 ------------------- .../Motley - Backup (155).SQL.csproj | 55 ------------------- .../Motley - Backup (156).SQL.csproj | 55 ------------------- .../Motley - Backup (157).SQL.csproj | 55 ------------------- .../Motley - Backup (158).SQL.csproj | 55 ------------------- .../Motley - Backup (159).SQL.csproj | 55 ------------------- .../Motley - Backup (16).SQL.csproj | 55 ------------------- .../Motley - Backup (160).SQL.csproj | 55 ------------------- .../Motley - Backup (161).SQL.csproj | 55 ------------------- .../Motley - Backup (162).SQL.csproj | 55 ------------------- .../Motley - Backup (163).SQL.csproj | 55 ------------------- .../Motley - Backup (164).SQL.csproj | 55 ------------------- .../Motley - Backup (165).SQL.csproj | 55 ------------------- .../Motley - Backup (166).SQL.csproj | 55 ------------------- .../Motley - Backup (167).SQL.csproj | 55 ------------------- .../Motley - Backup (168).SQL.csproj | 55 ------------------- .../Motley - Backup (169).SQL.csproj | 55 ------------------- .../Motley - Backup (17).SQL.csproj | 55 ------------------- .../Motley - Backup (170).SQL.csproj | 55 ------------------- .../Motley - Backup (171).SQL.csproj | 55 ------------------- .../Motley - Backup (172).SQL.csproj | 55 ------------------- .../Motley - Backup (173).SQL.csproj | 55 ------------------- .../Motley - Backup (174).SQL.csproj | 55 ------------------- .../Motley - Backup (175).SQL.csproj | 55 ------------------- .../Motley - Backup (176).SQL.csproj | 55 ------------------- .../Motley - Backup (177).SQL.csproj | 55 ------------------- .../Motley - Backup (178).SQL.csproj | 55 ------------------- .../Motley - Backup (179).SQL.csproj | 55 ------------------- .../Motley - Backup (18).SQL.csproj | 55 ------------------- .../Motley - Backup (180).SQL.csproj | 55 ------------------- .../Motley - Backup (181).SQL.csproj | 55 ------------------- .../Motley - Backup (182).SQL.csproj | 55 ------------------- .../Motley - Backup (183).SQL.csproj | 55 ------------------- .../Motley - Backup (184).SQL.csproj | 55 ------------------- .../Motley - Backup (185).SQL.csproj | 55 ------------------- .../Motley - Backup (186).SQL.csproj | 55 ------------------- .../Motley - Backup (187).SQL.csproj | 55 ------------------- .../Motley - Backup (188).SQL.csproj | 55 ------------------- .../Motley - Backup (189).SQL.csproj | 55 ------------------- .../Motley - Backup (19).SQL.csproj | 55 ------------------- .../Motley - Backup (190).SQL.csproj | 55 ------------------- .../Motley - Backup (191).SQL.csproj | 55 ------------------- .../Motley - Backup (192).SQL.csproj | 55 ------------------- .../Motley - Backup (193).SQL.csproj | 55 ------------------- .../Motley - Backup (194).SQL.csproj | 55 ------------------- .../Motley - Backup (195).SQL.csproj | 55 ------------------- .../Motley - Backup (196).SQL.csproj | 55 ------------------- .../Motley - Backup (197).SQL.csproj | 55 ------------------- .../Motley - Backup (198).SQL.csproj | 55 ------------------- .../Motley - Backup (199).SQL.csproj | 55 ------------------- .../Motley - Backup (2).SQL.csproj | 55 ------------------- .../Motley - Backup (20).SQL.csproj | 55 ------------------- .../Motley - Backup (200).SQL.csproj | 55 ------------------- .../Motley - Backup (201).SQL.csproj | 55 ------------------- .../Motley - Backup (202).SQL.csproj | 55 ------------------- .../Motley - Backup (203).SQL.csproj | 55 ------------------- .../Motley - Backup (204).SQL.csproj | 55 ------------------- .../Motley - Backup (205).SQL.csproj | 55 ------------------- .../Motley - Backup (206).SQL.csproj | 55 ------------------- .../Motley - Backup (207).SQL.csproj | 55 ------------------- .../Motley - Backup (208).SQL.csproj | 55 ------------------- .../Motley - Backup (209).SQL.csproj | 55 ------------------- .../Motley - Backup (21).SQL.csproj | 55 ------------------- .../Motley - Backup (210).SQL.csproj | 55 ------------------- .../Motley - Backup (211).SQL.csproj | 55 ------------------- .../Motley - Backup (212).SQL.csproj | 55 ------------------- .../Motley - Backup (213).SQL.csproj | 55 ------------------- .../Motley - Backup (214).SQL.csproj | 55 ------------------- .../Motley - Backup (215).SQL.csproj | 55 ------------------- .../Motley - Backup (216).SQL.csproj | 55 ------------------- .../Motley - Backup (217).SQL.csproj | 55 ------------------- .../Motley - Backup (218).SQL.csproj | 55 ------------------- .../Motley - Backup (219).SQL.csproj | 55 ------------------- .../Motley - Backup (22).SQL.csproj | 55 ------------------- .../Motley - Backup (220).SQL.csproj | 55 ------------------- .../Motley - Backup (221).SQL.csproj | 55 ------------------- .../Motley - Backup (222).SQL.csproj | 54 ------------------ .../Motley - Backup (23).SQL.csproj | 55 ------------------- .../Motley - Backup (24).SQL.csproj | 55 ------------------- .../Motley - Backup (25).SQL.csproj | 55 ------------------- .../Motley - Backup (26).SQL.csproj | 55 ------------------- .../Motley - Backup (27).SQL.csproj | 55 ------------------- .../Motley - Backup (28).SQL.csproj | 55 ------------------- .../Motley - Backup (29).SQL.csproj | 55 ------------------- .../Motley - Backup (3).SQL.csproj | 55 ------------------- .../Motley - Backup (30).SQL.csproj | 55 ------------------- .../Motley - Backup (31).SQL.csproj | 55 ------------------- .../Motley - Backup (32).SQL.csproj | 55 ------------------- .../Motley - Backup (33).SQL.csproj | 55 ------------------- .../Motley - Backup (34).SQL.csproj | 55 ------------------- .../Motley - Backup (35).SQL.csproj | 55 ------------------- .../Motley - Backup (36).SQL.csproj | 55 ------------------- .../Motley - Backup (37).SQL.csproj | 55 ------------------- .../Motley - Backup (38).SQL.csproj | 55 ------------------- .../Motley - Backup (39).SQL.csproj | 55 ------------------- .../Motley - Backup (4).SQL.csproj | 55 ------------------- .../Motley - Backup (40).SQL.csproj | 55 ------------------- .../Motley - Backup (41).SQL.csproj | 55 ------------------- .../Motley - Backup (42).SQL.csproj | 55 ------------------- .../Motley - Backup (43).SQL.csproj | 55 ------------------- .../Motley - Backup (44).SQL.csproj | 55 ------------------- .../Motley - Backup (45).SQL.csproj | 55 ------------------- .../Motley - Backup (46).SQL.csproj | 55 ------------------- .../Motley - Backup (47).SQL.csproj | 55 ------------------- .../Motley - Backup (48).SQL.csproj | 55 ------------------- .../Motley - Backup (49).SQL.csproj | 55 ------------------- .../Motley - Backup (5).SQL.csproj | 55 ------------------- .../Motley - Backup (50).SQL.csproj | 55 ------------------- .../Motley - Backup (51).SQL.csproj | 55 ------------------- .../Motley - Backup (52).SQL.csproj | 55 ------------------- .../Motley - Backup (53).SQL.csproj | 55 ------------------- .../Motley - Backup (54).SQL.csproj | 55 ------------------- .../Motley - Backup (55).SQL.csproj | 55 ------------------- .../Motley - Backup (56).SQL.csproj | 55 ------------------- .../Motley - Backup (57).SQL.csproj | 55 ------------------- .../Motley - Backup (58).SQL.csproj | 55 ------------------- .../Motley - Backup (59).SQL.csproj | 55 ------------------- .../Motley - Backup (6).SQL.csproj | 55 ------------------- .../Motley - Backup (60).SQL.csproj | 55 ------------------- .../Motley - Backup (61).SQL.csproj | 55 ------------------- .../Motley - Backup (62).SQL.csproj | 55 ------------------- .../Motley - Backup (63).SQL.csproj | 55 ------------------- .../Motley - Backup (64).SQL.csproj | 55 ------------------- .../Motley - Backup (65).SQL.csproj | 55 ------------------- .../Motley - Backup (66).SQL.csproj | 55 ------------------- .../Motley - Backup (67).SQL.csproj | 55 ------------------- .../Motley - Backup (68).SQL.csproj | 55 ------------------- .../Motley - Backup (69).SQL.csproj | 55 ------------------- .../Motley - Backup (7).SQL.csproj | 55 ------------------- .../Motley - Backup (70).SQL.csproj | 55 ------------------- .../Motley - Backup (71).SQL.csproj | 55 ------------------- .../Motley - Backup (72).SQL.csproj | 55 ------------------- .../Motley - Backup (73).SQL.csproj | 55 ------------------- .../Motley - Backup (74).SQL.csproj | 55 ------------------- .../Motley - Backup (75).SQL.csproj | 55 ------------------- .../Motley - Backup (76).SQL.csproj | 55 ------------------- .../Motley - Backup (77).SQL.csproj | 55 ------------------- .../Motley - Backup (78).SQL.csproj | 55 ------------------- .../Motley - Backup (79).SQL.csproj | 55 ------------------- .../Motley - Backup (8).SQL.csproj | 55 ------------------- .../Motley - Backup (80).SQL.csproj | 55 ------------------- .../Motley - Backup (81).SQL.csproj | 55 ------------------- .../Motley - Backup (82).SQL.csproj | 55 ------------------- .../Motley - Backup (83).SQL.csproj | 55 ------------------- .../Motley - Backup (84).SQL.csproj | 55 ------------------- .../Motley - Backup (85).SQL.csproj | 55 ------------------- .../Motley - Backup (86).SQL.csproj | 55 ------------------- .../Motley - Backup (87).SQL.csproj | 55 ------------------- .../Motley - Backup (88).SQL.csproj | 55 ------------------- .../Motley - Backup (89).SQL.csproj | 55 ------------------- .../Motley - Backup (9).SQL.csproj | 55 ------------------- .../Motley - Backup (90).SQL.csproj | 55 ------------------- .../Motley - Backup (91).SQL.csproj | 55 ------------------- .../Motley - Backup (92).SQL.csproj | 55 ------------------- .../Motley - Backup (93).SQL.csproj | 55 ------------------- .../Motley - Backup (94).SQL.csproj | 55 ------------------- .../Motley - Backup (95).SQL.csproj | 55 ------------------- .../Motley - Backup (96).SQL.csproj | 55 ------------------- .../Motley - Backup (97).SQL.csproj | 55 ------------------- .../Motley - Backup (98).SQL.csproj | 55 ------------------- .../Motley - Backup (99).SQL.csproj | 55 ------------------- src/Schemio.SQL/Motley - Backup.SQL.csproj | 55 ------------------- src/Schemio.SQL/Schemio.SQL.csproj | 6 +- .../Schemio.API.Tests.csproj | 20 ++++--- .../DataProvider.Tests/EntityBuilderTests.cs | 2 +- .../DataProvider.Tests/QueryBuilderTests.cs | 18 +++--- .../Schemio.Core.Tests.csproj | 20 ++++--- .../Schemio.EntityFramework.Tests/BaseTest.cs | 4 +- .../Schemio.EntityFramework.Tests.csproj | 24 +++++--- tests/Schemio.SQL.Tests/BaseTest.cs | 4 +- .../Schemio.SQL.Tests.csproj | 26 +++++---- 235 files changed, 83 insertions(+), 12319 deletions(-) delete mode 100644 src/Schemio.SQL/Motley - Backup (1).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (10).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (100).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (101).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (102).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (103).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (104).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (105).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (106).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (107).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (108).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (109).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (11).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (110).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (111).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (112).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (113).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (114).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (115).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (116).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (117).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (118).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (119).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (12).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (120).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (121).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (122).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (123).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (124).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (125).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (126).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (127).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (128).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (129).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (13).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (130).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (131).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (132).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (133).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (134).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (135).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (136).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (137).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (138).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (139).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (14).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (140).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (141).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (142).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (143).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (144).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (145).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (146).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (147).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (148).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (149).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (15).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (150).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (151).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (152).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (153).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (154).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (155).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (156).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (157).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (158).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (159).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (16).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (160).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (161).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (162).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (163).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (164).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (165).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (166).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (167).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (168).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (169).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (17).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (170).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (171).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (172).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (173).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (174).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (175).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (176).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (177).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (178).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (179).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (18).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (180).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (181).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (182).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (183).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (184).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (185).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (186).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (187).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (188).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (189).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (19).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (190).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (191).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (192).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (193).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (194).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (195).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (196).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (197).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (198).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (199).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (2).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (20).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (200).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (201).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (202).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (203).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (204).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (205).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (206).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (207).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (208).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (209).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (21).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (210).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (211).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (212).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (213).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (214).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (215).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (216).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (217).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (218).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (219).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (22).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (220).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (221).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (222).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (23).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (24).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (25).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (26).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (27).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (28).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (29).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (3).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (30).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (31).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (32).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (33).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (34).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (35).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (36).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (37).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (38).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (39).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (4).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (40).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (41).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (42).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (43).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (44).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (45).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (46).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (47).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (48).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (49).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (5).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (50).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (51).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (52).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (53).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (54).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (55).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (56).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (57).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (58).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (59).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (6).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (60).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (61).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (62).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (63).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (64).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (65).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (66).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (67).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (68).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (69).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (7).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (70).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (71).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (72).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (73).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (74).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (75).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (76).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (77).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (78).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (79).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (8).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (80).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (81).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (82).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (83).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (84).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (85).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (86).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (87).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (88).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (89).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (9).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (90).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (91).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (92).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (93).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (94).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (95).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (96).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (97).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (98).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (99).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup.SQL.csproj diff --git a/src/Schemio.API/Schemio.API.csproj b/src/Schemio.API/Schemio.API.csproj index d51b5fc..fe22f30 100644 --- a/src/Schemio.API/Schemio.API.csproj +++ b/src/Schemio.API/Schemio.API.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable diff --git a/src/Schemio.Core/Schemio.Core.csproj b/src/Schemio.Core/Schemio.Core.csproj index 00fcd1a..8579bc0 100644 --- a/src/Schemio.Core/Schemio.Core.csproj +++ b/src/Schemio.Core/Schemio.Core.csproj @@ -1,7 +1,7 @@ - + - net8.0 + net9.0 enable enable true @@ -39,8 +39,8 @@ - - + + diff --git a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj index 3635f2d..a7c656c 100644 --- a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj +++ b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable true enable @@ -43,7 +43,7 @@ - + diff --git a/src/Schemio.SQL/Motley - Backup (1).SQL.csproj b/src/Schemio.SQL/Motley - Backup (1).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (1).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (10).SQL.csproj b/src/Schemio.SQL/Motley - Backup (10).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (10).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (100).SQL.csproj b/src/Schemio.SQL/Motley - Backup (100).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (100).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (101).SQL.csproj b/src/Schemio.SQL/Motley - Backup (101).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (101).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (102).SQL.csproj b/src/Schemio.SQL/Motley - Backup (102).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (102).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (103).SQL.csproj b/src/Schemio.SQL/Motley - Backup (103).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (103).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (104).SQL.csproj b/src/Schemio.SQL/Motley - Backup (104).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (104).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (105).SQL.csproj b/src/Schemio.SQL/Motley - Backup (105).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (105).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (106).SQL.csproj b/src/Schemio.SQL/Motley - Backup (106).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (106).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (107).SQL.csproj b/src/Schemio.SQL/Motley - Backup (107).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (107).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (108).SQL.csproj b/src/Schemio.SQL/Motley - Backup (108).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (108).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (109).SQL.csproj b/src/Schemio.SQL/Motley - Backup (109).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (109).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (11).SQL.csproj b/src/Schemio.SQL/Motley - Backup (11).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (11).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (110).SQL.csproj b/src/Schemio.SQL/Motley - Backup (110).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (110).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (111).SQL.csproj b/src/Schemio.SQL/Motley - Backup (111).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (111).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (112).SQL.csproj b/src/Schemio.SQL/Motley - Backup (112).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (112).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (113).SQL.csproj b/src/Schemio.SQL/Motley - Backup (113).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (113).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (114).SQL.csproj b/src/Schemio.SQL/Motley - Backup (114).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (114).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (115).SQL.csproj b/src/Schemio.SQL/Motley - Backup (115).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (115).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (116).SQL.csproj b/src/Schemio.SQL/Motley - Backup (116).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (116).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (117).SQL.csproj b/src/Schemio.SQL/Motley - Backup (117).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (117).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (118).SQL.csproj b/src/Schemio.SQL/Motley - Backup (118).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (118).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (119).SQL.csproj b/src/Schemio.SQL/Motley - Backup (119).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (119).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (12).SQL.csproj b/src/Schemio.SQL/Motley - Backup (12).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (12).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (120).SQL.csproj b/src/Schemio.SQL/Motley - Backup (120).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (120).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (121).SQL.csproj b/src/Schemio.SQL/Motley - Backup (121).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (121).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (122).SQL.csproj b/src/Schemio.SQL/Motley - Backup (122).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (122).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (123).SQL.csproj b/src/Schemio.SQL/Motley - Backup (123).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (123).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (124).SQL.csproj b/src/Schemio.SQL/Motley - Backup (124).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (124).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (125).SQL.csproj b/src/Schemio.SQL/Motley - Backup (125).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (125).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (126).SQL.csproj b/src/Schemio.SQL/Motley - Backup (126).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (126).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (127).SQL.csproj b/src/Schemio.SQL/Motley - Backup (127).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (127).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (128).SQL.csproj b/src/Schemio.SQL/Motley - Backup (128).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (128).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (129).SQL.csproj b/src/Schemio.SQL/Motley - Backup (129).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (129).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (13).SQL.csproj b/src/Schemio.SQL/Motley - Backup (13).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (13).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (130).SQL.csproj b/src/Schemio.SQL/Motley - Backup (130).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (130).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (131).SQL.csproj b/src/Schemio.SQL/Motley - Backup (131).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (131).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (132).SQL.csproj b/src/Schemio.SQL/Motley - Backup (132).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (132).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (133).SQL.csproj b/src/Schemio.SQL/Motley - Backup (133).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (133).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (134).SQL.csproj b/src/Schemio.SQL/Motley - Backup (134).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (134).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (135).SQL.csproj b/src/Schemio.SQL/Motley - Backup (135).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (135).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (136).SQL.csproj b/src/Schemio.SQL/Motley - Backup (136).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (136).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (137).SQL.csproj b/src/Schemio.SQL/Motley - Backup (137).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (137).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (138).SQL.csproj b/src/Schemio.SQL/Motley - Backup (138).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (138).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (139).SQL.csproj b/src/Schemio.SQL/Motley - Backup (139).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (139).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (14).SQL.csproj b/src/Schemio.SQL/Motley - Backup (14).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (14).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (140).SQL.csproj b/src/Schemio.SQL/Motley - Backup (140).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (140).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (141).SQL.csproj b/src/Schemio.SQL/Motley - Backup (141).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (141).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (142).SQL.csproj b/src/Schemio.SQL/Motley - Backup (142).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (142).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (143).SQL.csproj b/src/Schemio.SQL/Motley - Backup (143).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (143).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (144).SQL.csproj b/src/Schemio.SQL/Motley - Backup (144).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (144).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (145).SQL.csproj b/src/Schemio.SQL/Motley - Backup (145).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (145).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (146).SQL.csproj b/src/Schemio.SQL/Motley - Backup (146).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (146).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (147).SQL.csproj b/src/Schemio.SQL/Motley - Backup (147).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (147).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (148).SQL.csproj b/src/Schemio.SQL/Motley - Backup (148).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (148).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (149).SQL.csproj b/src/Schemio.SQL/Motley - Backup (149).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (149).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (15).SQL.csproj b/src/Schemio.SQL/Motley - Backup (15).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (15).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (150).SQL.csproj b/src/Schemio.SQL/Motley - Backup (150).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (150).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (151).SQL.csproj b/src/Schemio.SQL/Motley - Backup (151).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (151).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (152).SQL.csproj b/src/Schemio.SQL/Motley - Backup (152).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (152).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (153).SQL.csproj b/src/Schemio.SQL/Motley - Backup (153).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (153).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (154).SQL.csproj b/src/Schemio.SQL/Motley - Backup (154).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (154).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (155).SQL.csproj b/src/Schemio.SQL/Motley - Backup (155).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (155).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (156).SQL.csproj b/src/Schemio.SQL/Motley - Backup (156).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (156).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (157).SQL.csproj b/src/Schemio.SQL/Motley - Backup (157).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (157).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (158).SQL.csproj b/src/Schemio.SQL/Motley - Backup (158).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (158).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (159).SQL.csproj b/src/Schemio.SQL/Motley - Backup (159).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (159).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (16).SQL.csproj b/src/Schemio.SQL/Motley - Backup (16).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (16).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (160).SQL.csproj b/src/Schemio.SQL/Motley - Backup (160).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (160).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (161).SQL.csproj b/src/Schemio.SQL/Motley - Backup (161).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (161).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (162).SQL.csproj b/src/Schemio.SQL/Motley - Backup (162).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (162).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (163).SQL.csproj b/src/Schemio.SQL/Motley - Backup (163).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (163).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (164).SQL.csproj b/src/Schemio.SQL/Motley - Backup (164).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (164).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (165).SQL.csproj b/src/Schemio.SQL/Motley - Backup (165).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (165).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (166).SQL.csproj b/src/Schemio.SQL/Motley - Backup (166).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (166).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (167).SQL.csproj b/src/Schemio.SQL/Motley - Backup (167).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (167).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (168).SQL.csproj b/src/Schemio.SQL/Motley - Backup (168).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (168).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (169).SQL.csproj b/src/Schemio.SQL/Motley - Backup (169).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (169).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (17).SQL.csproj b/src/Schemio.SQL/Motley - Backup (17).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (17).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (170).SQL.csproj b/src/Schemio.SQL/Motley - Backup (170).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (170).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (171).SQL.csproj b/src/Schemio.SQL/Motley - Backup (171).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (171).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (172).SQL.csproj b/src/Schemio.SQL/Motley - Backup (172).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (172).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (173).SQL.csproj b/src/Schemio.SQL/Motley - Backup (173).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (173).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (174).SQL.csproj b/src/Schemio.SQL/Motley - Backup (174).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (174).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (175).SQL.csproj b/src/Schemio.SQL/Motley - Backup (175).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (175).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (176).SQL.csproj b/src/Schemio.SQL/Motley - Backup (176).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (176).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (177).SQL.csproj b/src/Schemio.SQL/Motley - Backup (177).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (177).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (178).SQL.csproj b/src/Schemio.SQL/Motley - Backup (178).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (178).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (179).SQL.csproj b/src/Schemio.SQL/Motley - Backup (179).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (179).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (18).SQL.csproj b/src/Schemio.SQL/Motley - Backup (18).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (18).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (180).SQL.csproj b/src/Schemio.SQL/Motley - Backup (180).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (180).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (181).SQL.csproj b/src/Schemio.SQL/Motley - Backup (181).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (181).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (182).SQL.csproj b/src/Schemio.SQL/Motley - Backup (182).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (182).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (183).SQL.csproj b/src/Schemio.SQL/Motley - Backup (183).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (183).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (184).SQL.csproj b/src/Schemio.SQL/Motley - Backup (184).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (184).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (185).SQL.csproj b/src/Schemio.SQL/Motley - Backup (185).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (185).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (186).SQL.csproj b/src/Schemio.SQL/Motley - Backup (186).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (186).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (187).SQL.csproj b/src/Schemio.SQL/Motley - Backup (187).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (187).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (188).SQL.csproj b/src/Schemio.SQL/Motley - Backup (188).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (188).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (189).SQL.csproj b/src/Schemio.SQL/Motley - Backup (189).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (189).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (19).SQL.csproj b/src/Schemio.SQL/Motley - Backup (19).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (19).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (190).SQL.csproj b/src/Schemio.SQL/Motley - Backup (190).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (190).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (191).SQL.csproj b/src/Schemio.SQL/Motley - Backup (191).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (191).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (192).SQL.csproj b/src/Schemio.SQL/Motley - Backup (192).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (192).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (193).SQL.csproj b/src/Schemio.SQL/Motley - Backup (193).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (193).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (194).SQL.csproj b/src/Schemio.SQL/Motley - Backup (194).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (194).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (195).SQL.csproj b/src/Schemio.SQL/Motley - Backup (195).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (195).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (196).SQL.csproj b/src/Schemio.SQL/Motley - Backup (196).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (196).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (197).SQL.csproj b/src/Schemio.SQL/Motley - Backup (197).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (197).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (198).SQL.csproj b/src/Schemio.SQL/Motley - Backup (198).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (198).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (199).SQL.csproj b/src/Schemio.SQL/Motley - Backup (199).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (199).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (2).SQL.csproj b/src/Schemio.SQL/Motley - Backup (2).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (2).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (20).SQL.csproj b/src/Schemio.SQL/Motley - Backup (20).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (20).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (200).SQL.csproj b/src/Schemio.SQL/Motley - Backup (200).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (200).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (201).SQL.csproj b/src/Schemio.SQL/Motley - Backup (201).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (201).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (202).SQL.csproj b/src/Schemio.SQL/Motley - Backup (202).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (202).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (203).SQL.csproj b/src/Schemio.SQL/Motley - Backup (203).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (203).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (204).SQL.csproj b/src/Schemio.SQL/Motley - Backup (204).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (204).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (205).SQL.csproj b/src/Schemio.SQL/Motley - Backup (205).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (205).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (206).SQL.csproj b/src/Schemio.SQL/Motley - Backup (206).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (206).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (207).SQL.csproj b/src/Schemio.SQL/Motley - Backup (207).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (207).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (208).SQL.csproj b/src/Schemio.SQL/Motley - Backup (208).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (208).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (209).SQL.csproj b/src/Schemio.SQL/Motley - Backup (209).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (209).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (21).SQL.csproj b/src/Schemio.SQL/Motley - Backup (21).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (21).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (210).SQL.csproj b/src/Schemio.SQL/Motley - Backup (210).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (210).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (211).SQL.csproj b/src/Schemio.SQL/Motley - Backup (211).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (211).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (212).SQL.csproj b/src/Schemio.SQL/Motley - Backup (212).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (212).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (213).SQL.csproj b/src/Schemio.SQL/Motley - Backup (213).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (213).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (214).SQL.csproj b/src/Schemio.SQL/Motley - Backup (214).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (214).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (215).SQL.csproj b/src/Schemio.SQL/Motley - Backup (215).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (215).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (216).SQL.csproj b/src/Schemio.SQL/Motley - Backup (216).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (216).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (217).SQL.csproj b/src/Schemio.SQL/Motley - Backup (217).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (217).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (218).SQL.csproj b/src/Schemio.SQL/Motley - Backup (218).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (218).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (219).SQL.csproj b/src/Schemio.SQL/Motley - Backup (219).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (219).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (22).SQL.csproj b/src/Schemio.SQL/Motley - Backup (22).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (22).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (220).SQL.csproj b/src/Schemio.SQL/Motley - Backup (220).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (220).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (221).SQL.csproj b/src/Schemio.SQL/Motley - Backup (221).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (221).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (222).SQL.csproj b/src/Schemio.SQL/Motley - Backup (222).SQL.csproj deleted file mode 100644 index f8e4eb3..0000000 --- a/src/Schemio.SQL/Motley - Backup (222).SQL.csproj +++ /dev/null @@ -1,54 +0,0 @@ - - - - net8.0 - enable - enable - true - Schemio with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Schemio - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Schemio/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (23).SQL.csproj b/src/Schemio.SQL/Motley - Backup (23).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (23).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (24).SQL.csproj b/src/Schemio.SQL/Motley - Backup (24).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (24).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (25).SQL.csproj b/src/Schemio.SQL/Motley - Backup (25).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (25).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (26).SQL.csproj b/src/Schemio.SQL/Motley - Backup (26).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (26).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (27).SQL.csproj b/src/Schemio.SQL/Motley - Backup (27).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (27).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (28).SQL.csproj b/src/Schemio.SQL/Motley - Backup (28).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (28).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (29).SQL.csproj b/src/Schemio.SQL/Motley - Backup (29).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (29).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (3).SQL.csproj b/src/Schemio.SQL/Motley - Backup (3).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (3).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (30).SQL.csproj b/src/Schemio.SQL/Motley - Backup (30).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (30).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (31).SQL.csproj b/src/Schemio.SQL/Motley - Backup (31).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (31).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (32).SQL.csproj b/src/Schemio.SQL/Motley - Backup (32).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (32).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (33).SQL.csproj b/src/Schemio.SQL/Motley - Backup (33).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (33).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (34).SQL.csproj b/src/Schemio.SQL/Motley - Backup (34).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (34).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (35).SQL.csproj b/src/Schemio.SQL/Motley - Backup (35).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (35).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (36).SQL.csproj b/src/Schemio.SQL/Motley - Backup (36).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (36).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (37).SQL.csproj b/src/Schemio.SQL/Motley - Backup (37).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (37).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (38).SQL.csproj b/src/Schemio.SQL/Motley - Backup (38).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (38).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (39).SQL.csproj b/src/Schemio.SQL/Motley - Backup (39).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (39).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (4).SQL.csproj b/src/Schemio.SQL/Motley - Backup (4).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (4).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (40).SQL.csproj b/src/Schemio.SQL/Motley - Backup (40).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (40).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (41).SQL.csproj b/src/Schemio.SQL/Motley - Backup (41).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (41).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (42).SQL.csproj b/src/Schemio.SQL/Motley - Backup (42).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (42).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (43).SQL.csproj b/src/Schemio.SQL/Motley - Backup (43).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (43).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (44).SQL.csproj b/src/Schemio.SQL/Motley - Backup (44).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (44).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (45).SQL.csproj b/src/Schemio.SQL/Motley - Backup (45).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (45).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (46).SQL.csproj b/src/Schemio.SQL/Motley - Backup (46).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (46).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (47).SQL.csproj b/src/Schemio.SQL/Motley - Backup (47).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (47).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (48).SQL.csproj b/src/Schemio.SQL/Motley - Backup (48).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (48).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (49).SQL.csproj b/src/Schemio.SQL/Motley - Backup (49).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (49).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (5).SQL.csproj b/src/Schemio.SQL/Motley - Backup (5).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (5).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (50).SQL.csproj b/src/Schemio.SQL/Motley - Backup (50).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (50).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (51).SQL.csproj b/src/Schemio.SQL/Motley - Backup (51).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (51).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (52).SQL.csproj b/src/Schemio.SQL/Motley - Backup (52).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (52).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (53).SQL.csproj b/src/Schemio.SQL/Motley - Backup (53).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (53).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (54).SQL.csproj b/src/Schemio.SQL/Motley - Backup (54).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (54).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (55).SQL.csproj b/src/Schemio.SQL/Motley - Backup (55).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (55).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (56).SQL.csproj b/src/Schemio.SQL/Motley - Backup (56).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (56).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (57).SQL.csproj b/src/Schemio.SQL/Motley - Backup (57).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (57).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (58).SQL.csproj b/src/Schemio.SQL/Motley - Backup (58).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (58).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (59).SQL.csproj b/src/Schemio.SQL/Motley - Backup (59).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (59).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (6).SQL.csproj b/src/Schemio.SQL/Motley - Backup (6).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (6).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (60).SQL.csproj b/src/Schemio.SQL/Motley - Backup (60).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (60).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (61).SQL.csproj b/src/Schemio.SQL/Motley - Backup (61).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (61).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (62).SQL.csproj b/src/Schemio.SQL/Motley - Backup (62).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (62).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (63).SQL.csproj b/src/Schemio.SQL/Motley - Backup (63).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (63).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (64).SQL.csproj b/src/Schemio.SQL/Motley - Backup (64).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (64).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (65).SQL.csproj b/src/Schemio.SQL/Motley - Backup (65).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (65).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (66).SQL.csproj b/src/Schemio.SQL/Motley - Backup (66).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (66).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (67).SQL.csproj b/src/Schemio.SQL/Motley - Backup (67).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (67).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (68).SQL.csproj b/src/Schemio.SQL/Motley - Backup (68).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (68).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (69).SQL.csproj b/src/Schemio.SQL/Motley - Backup (69).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (69).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (7).SQL.csproj b/src/Schemio.SQL/Motley - Backup (7).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (7).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (70).SQL.csproj b/src/Schemio.SQL/Motley - Backup (70).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (70).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (71).SQL.csproj b/src/Schemio.SQL/Motley - Backup (71).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (71).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (72).SQL.csproj b/src/Schemio.SQL/Motley - Backup (72).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (72).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (73).SQL.csproj b/src/Schemio.SQL/Motley - Backup (73).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (73).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (74).SQL.csproj b/src/Schemio.SQL/Motley - Backup (74).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (74).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (75).SQL.csproj b/src/Schemio.SQL/Motley - Backup (75).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (75).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (76).SQL.csproj b/src/Schemio.SQL/Motley - Backup (76).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (76).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (77).SQL.csproj b/src/Schemio.SQL/Motley - Backup (77).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (77).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (78).SQL.csproj b/src/Schemio.SQL/Motley - Backup (78).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (78).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (79).SQL.csproj b/src/Schemio.SQL/Motley - Backup (79).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (79).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (8).SQL.csproj b/src/Schemio.SQL/Motley - Backup (8).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (8).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (80).SQL.csproj b/src/Schemio.SQL/Motley - Backup (80).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (80).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (81).SQL.csproj b/src/Schemio.SQL/Motley - Backup (81).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (81).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (82).SQL.csproj b/src/Schemio.SQL/Motley - Backup (82).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (82).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (83).SQL.csproj b/src/Schemio.SQL/Motley - Backup (83).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (83).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (84).SQL.csproj b/src/Schemio.SQL/Motley - Backup (84).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (84).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (85).SQL.csproj b/src/Schemio.SQL/Motley - Backup (85).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (85).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (86).SQL.csproj b/src/Schemio.SQL/Motley - Backup (86).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (86).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (87).SQL.csproj b/src/Schemio.SQL/Motley - Backup (87).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (87).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (88).SQL.csproj b/src/Schemio.SQL/Motley - Backup (88).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (88).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (89).SQL.csproj b/src/Schemio.SQL/Motley - Backup (89).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (89).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (9).SQL.csproj b/src/Schemio.SQL/Motley - Backup (9).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (9).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (90).SQL.csproj b/src/Schemio.SQL/Motley - Backup (90).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (90).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (91).SQL.csproj b/src/Schemio.SQL/Motley - Backup (91).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (91).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (92).SQL.csproj b/src/Schemio.SQL/Motley - Backup (92).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (92).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (93).SQL.csproj b/src/Schemio.SQL/Motley - Backup (93).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (93).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (94).SQL.csproj b/src/Schemio.SQL/Motley - Backup (94).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (94).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (95).SQL.csproj b/src/Schemio.SQL/Motley - Backup (95).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (95).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (96).SQL.csproj b/src/Schemio.SQL/Motley - Backup (96).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (96).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (97).SQL.csproj b/src/Schemio.SQL/Motley - Backup (97).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (97).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (98).SQL.csproj b/src/Schemio.SQL/Motley - Backup (98).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (98).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (99).SQL.csproj b/src/Schemio.SQL/Motley - Backup (99).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (99).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup.SQL.csproj b/src/Schemio.SQL/Motley - Backup.SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup.SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Schemio.SQL.csproj b/src/Schemio.SQL/Schemio.SQL.csproj index 7d4bcbd..14b92f8 100644 --- a/src/Schemio.SQL/Schemio.SQL.csproj +++ b/src/Schemio.SQL/Schemio.SQL.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable true @@ -43,8 +43,8 @@ - - + + diff --git a/tests/Schemio.API.Tests/Schemio.API.Tests.csproj b/tests/Schemio.API.Tests/Schemio.API.Tests.csproj index 5a1ea0b..efbeb65 100644 --- a/tests/Schemio.API.Tests/Schemio.API.Tests.csproj +++ b/tests/Schemio.API.Tests/Schemio.API.Tests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable @@ -10,12 +10,18 @@ - - - - - - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs index 1d77a96..14ae66b 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs @@ -49,7 +49,7 @@ public void TestTransformExecutorForCorrectExecutionOfConfiguredTransforms() Assert.That(orderItemsCollectionTransforms.Count() == 1); Assert.That(orderItemsCollectionTransforms.ElementAt(0).InvocationCount == 1); - Assert.IsNotNull(entity); + Assert.That(entity, Is.Not.Null); } public class MockTransform : BaseTransformer diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs index 48e5ca7..5f23466 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs @@ -44,7 +44,7 @@ public void TestQueryBuilderForCorrectParentQueryList() var result = _queryBuilder.Build(context); - Assert.IsNotNull(result); + Assert.That(result, Is.Not.Null); // returns parent query with filtered out child communication query. @@ -63,7 +63,7 @@ public void TestQueryBuilderForCorrectParentQueryListWithOneChildren() var result = _queryBuilder.Build(context); - Assert.IsNotNull(result); + Assert.That(result, Is.Not.Null); // returns parent query with filtered out child communication query. @@ -85,7 +85,7 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildren() var result = _queryBuilder.Build(context); - Assert.IsNotNull(result); + Assert.That(result, Is.Not.Null); // returns parent query with filtered out children - communication & orders query. @@ -99,8 +99,8 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildren() var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CommunicationQuery)); var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrdersQuery)); - Assert.IsNotNull(communicationChildQuery); - Assert.IsNotNull(ordersChildQuery); + Assert.That(communicationChildQuery, Is.Not.Null); + Assert.That(ordersChildQuery, Is.Not.Null); // nested child query for order item not included as order items are excluded from paths Assert.That(ordersChildQuery.Children.Count, Is.EqualTo(0)); @@ -113,7 +113,7 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildrenAndOneChildF var result = _queryBuilder.Build(context); - Assert.IsNotNull(result); + Assert.That(result, Is.Not.Null); // returns parent query with filtered out children - communication & orders query. @@ -127,14 +127,14 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildrenAndOneChildF var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CommunicationQuery)); var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrdersQuery)); - Assert.IsNotNull(communicationChildQuery); - Assert.IsNotNull(ordersChildQuery); + Assert.That(communicationChildQuery, Is.Not.Null); + Assert.That(ordersChildQuery, Is.Not.Null); // nested child query for order item in order query children as order items are included in paths Assert.That(ordersChildQuery.Children.Count, Is.EqualTo(1)); var orderItemsChildQuery = ordersChildQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrderItemsQuery)); - Assert.IsNotNull(orderItemsChildQuery); + Assert.That(orderItemsChildQuery, Is.Not.Null); } } } \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj b/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj index 5e102b1..efd5bc7 100644 --- a/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj +++ b/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable @@ -9,12 +9,18 @@ - - - - - - + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index a9dec25..c44f222 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -1,3 +1,4 @@ +using System; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Schemio.Core; @@ -50,7 +51,8 @@ public void Setup() [OneTimeTearDown] public void TearDown() { - _serviceProvider = null; + if (_serviceProvider is IDisposable disposable) + disposable.Dispose(); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/Schemio.EntityFramework.Tests.csproj b/tests/Schemio.EntityFramework.Tests/Schemio.EntityFramework.Tests.csproj index 36e3bce..7aa3bf6 100644 --- a/tests/Schemio.EntityFramework.Tests/Schemio.EntityFramework.Tests.csproj +++ b/tests/Schemio.EntityFramework.Tests/Schemio.EntityFramework.Tests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable @@ -10,14 +10,20 @@ - - - - - - - - + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index f701f36..009bfba 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -1,3 +1,4 @@ +using System; using System.Data.Common; using Microsoft.Data.Sqlite; using Microsoft.Extensions.DependencyInjection; @@ -54,7 +55,8 @@ public void Setup() [OneTimeTearDown] public void TearDown() { - _serviceProvider = null; + if (_serviceProvider is IDisposable disposable) + disposable.Dispose(); } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/Schemio.SQL.Tests.csproj b/tests/Schemio.SQL.Tests/Schemio.SQL.Tests.csproj index da8f385..82a43e1 100644 --- a/tests/Schemio.SQL.Tests/Schemio.SQL.Tests.csproj +++ b/tests/Schemio.SQL.Tests/Schemio.SQL.Tests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable @@ -10,15 +10,21 @@ - - - - - - - - - + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + From af29b515b95e3f47e73c4024ff1f6d947e69635b Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 22:35:15 +0000 Subject: [PATCH 29/64] - Update ReadMe --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e1c287c..4591607 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Master-Build](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml) [![GitHub Release](https://img.shields.io/github/v/release/CodeShayk/Schemio?logo=github&sort=semver)](https://github.com/CodeShayk/Schemio/releases/latest) [![Master-CodeQL](https://github.com/CodeShayk/Schemio/actions/workflows/Master-CodeQL.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Master-CodeQL.yml) -[![.Net 8.0](https://img.shields.io/badge/.Net-8.0-blue)](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) +[![.Net 9.0](https://img.shields.io/badge/.Net-9.0-blue)](https://dotnet.microsoft.com/en-us/download/dotnet/9.0) -- #### Nuget Packages | Package | Latest | Details | From 5aec9ffe35a932404ec400b5f42f4557dfe67ab3 Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 23:11:42 +0000 Subject: [PATCH 30/64] - Update version on assemblies --- src/Schemio.API/IWebQuery.cs | 2 + src/Schemio.API/QueryEngine.cs | 2 + src/Schemio.API/Schemio.API.csproj | 37 ++++++++++++++++++- src/Schemio.API/WebHeaderResult.cs | 1 + src/Schemio.API/WebQuery.cs | 6 +++ src/Schemio.Core/Schemio.Core.csproj | 1 + .../Schemio.EntityFramework.csproj | 1 + src/Schemio.SQL/Schemio.SQL.csproj | 1 + 8 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/Schemio.API/IWebQuery.cs b/src/Schemio.API/IWebQuery.cs index 1c50a43..81fc2d3 100644 --- a/src/Schemio.API/IWebQuery.cs +++ b/src/Schemio.API/IWebQuery.cs @@ -1,3 +1,5 @@ +using System.Net.Http; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Schemio.Core; diff --git a/src/Schemio.API/QueryEngine.cs b/src/Schemio.API/QueryEngine.cs index 2ea14c9..c6326b1 100644 --- a/src/Schemio.API/QueryEngine.cs +++ b/src/Schemio.API/QueryEngine.cs @@ -1,3 +1,5 @@ +using System.Net.Http; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Schemio.Core; using Schemio.Core.Helpers; diff --git a/src/Schemio.API/Schemio.API.csproj b/src/Schemio.API/Schemio.API.csproj index fe22f30..31f291e 100644 --- a/src/Schemio.API/Schemio.API.csproj +++ b/src/Schemio.API/Schemio.API.csproj @@ -2,15 +2,48 @@ net9.0 - enable + true enable + Schemio with EntityFramework + Code Shayk + Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Web API using HttpClient. + Copyright (c) 2024 Code Shayk + https://github.com/CodeShayk/Schemio/wiki/i.-Home + ninja-icon-16.png + README.md + https://github.com/CodeShayk/Schemio + git + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch schemio-Api HttpCliet + LICENSE.md + True + True + snupkg + True + 2.0.0 + + + + True - + + True + \ + + + True + \ + + + True + \ + + diff --git a/src/Schemio.API/WebHeaderResult.cs b/src/Schemio.API/WebHeaderResult.cs index d2ef135..00f798b 100644 --- a/src/Schemio.API/WebHeaderResult.cs +++ b/src/Schemio.API/WebHeaderResult.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using Schemio.Core; namespace Schemio.API diff --git a/src/Schemio.API/WebQuery.cs b/src/Schemio.API/WebQuery.cs index 99c3e95..ad6b34b 100644 --- a/src/Schemio.API/WebQuery.cs +++ b/src/Schemio.API/WebQuery.cs @@ -1,3 +1,9 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Schemio.Core; using Schemio.Core.Helpers; diff --git a/src/Schemio.Core/Schemio.Core.csproj b/src/Schemio.Core/Schemio.Core.csproj index 8579bc0..578a7ac 100644 --- a/src/Schemio.Core/Schemio.Core.csproj +++ b/src/Schemio.Core/Schemio.Core.csproj @@ -21,6 +21,7 @@ True snupkg True + 2.0.0 diff --git a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj index a7c656c..b9dcc86 100644 --- a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj +++ b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj @@ -21,6 +21,7 @@ True snupkg True + 2.0.0 diff --git a/src/Schemio.SQL/Schemio.SQL.csproj b/src/Schemio.SQL/Schemio.SQL.csproj index 14b92f8..1946be3 100644 --- a/src/Schemio.SQL/Schemio.SQL.csproj +++ b/src/Schemio.SQL/Schemio.SQL.csproj @@ -21,6 +21,7 @@ True snupkg True + 2.0.0 From 0e0cf664266ee668521a92acfcb9a2a05c2e10fe Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 23:32:21 +0000 Subject: [PATCH 31/64] - Realse v2.0.0 --- README.md | 4 ++-- src/Schemio.Core/Schemio.Core.csproj | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4591607..930a33f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ninja Schemio v2.0 +# Schemio v2.0 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/CodeShayk/Schemio/blob/master/LICENSE.md) [![Master-Build](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml) [![GitHub Release](https://img.shields.io/github/v/release/CodeShayk/Schemio?logo=github&sort=semver)](https://github.com/CodeShayk/Schemio/releases/latest) @@ -66,7 +66,7 @@ The main branch is now on .NET 8.0. The following previous versions are availabl | Version | Release Notes | Developer Guide | | -------- | --------|--------| | [`v1.0.0`](https://github.com/CodeShayk/Schemio/tree/v1.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v1.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v1.0.0/index.md) | -| [`Pre-Release v2.0.0`](https://github.com/CodeShayk/Schemio/tree/v2.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v2.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v2.0.0/index.md) | +| [`v2.0.0`](https://github.com/CodeShayk/Schemio/tree/v2.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v2.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v2.0.0/index.md) | ## Credits Thank you for reading. Please fork, explore, contribute and report. Happy Coding !! :) diff --git a/src/Schemio.Core/Schemio.Core.csproj b/src/Schemio.Core/Schemio.Core.csproj index 578a7ac..3157a7e 100644 --- a/src/Schemio.Core/Schemio.Core.csproj +++ b/src/Schemio.Core/Schemio.Core.csproj @@ -22,6 +22,12 @@ snupkg True 2.0.0 + Changes +- `Entity Schema` renamed to `Entity Configuration` and requires implementing `EntityContfiguration<TEntity>`. +- `IRootQuery`, `IChildQuery`, `BaseRootQuery<TParameter, TResult>` & `BaseChildQuery<TParameter,TResult>` removed. +- Both Parent and child queries need to implement `BaseQuery<TResult>` and provide override for `isContextResolved()` and `ResolveQuery()` methods. +- `IoC` registration streamlined with `fluent interface` for container configuration. +- Renamed `IEntityContext` to `IEntityRequest`. From 2e0851b994104b8cbc2835ea96e67869ecc4a708 Mon Sep 17 00:00:00 2001 From: Ninja Date: Sat, 9 Nov 2024 15:26:32 +0000 Subject: [PATCH 32/64] - Checkpoint: Initial v2.0 changes --- .github/workflows/PullRequest-CI.yml | 26 ++-- GitVersion.yml | 2 +- LICENSE | 21 +++ Schemio.sln | 44 +++--- src/{Schemio => Schemio.Core}/AssemblyInfo.cs | 3 +- .../BaseEntitySchema.cs | 2 +- src/{Schemio => Schemio.Core}/BaseQuery.cs | 19 ++- .../BaseTransformer.cs | 2 +- .../CacheResultAttribute.cs | 2 +- .../ChildrenQueries.cs | 2 +- src/Schemio.Core/CollectionResult.cs | 9 ++ src/{Schemio => Schemio.Core}/CreateSchema.cs | 2 +- src/{Schemio => Schemio.Core}/DataContext.cs | 2 +- .../Helpers/ArrayUtil.cs | 2 +- .../Helpers/EnumerableExtentions.cs | 2 +- .../Helpers/StringExtensions.cs | 2 +- .../Helpers/Xml/XDocumentExts.cs | 2 +- .../Helpers/Xml/XmlHelper.cs | 2 +- .../Helpers/Xml/XmlSanitizer.cs | 2 +- src/{Schemio => Schemio.Core}/IDataContext.cs | 2 +- .../IDataProvider.cs | 2 +- src/{Schemio => Schemio.Core}/IEntity.cs | 2 +- src/Schemio.Core/IEntityBuilder.cs | 7 + .../IEntityContext.cs | 2 +- .../IEntityContextCache.cs | 2 +- .../IEntityContextValidator.cs | 2 +- .../IEntitySchema.cs | 4 +- src/Schemio.Core/IEntitySchema1.cs | 6 + .../IPolymorphicResult.cs | 2 +- src/Schemio.Core/IQuery.cs | 21 +++ .../IQueryBuilder.cs | 2 +- src/{Schemio => Schemio.Core}/IQueryEngine.cs | 8 +- .../IQueryExecutor.cs | 2 +- src/{Schemio => Schemio.Core}/IQueryList.cs | 2 +- .../IQueryParameter.cs | 2 +- src/{Schemio => Schemio.Core}/IQueryResult.cs | 2 +- .../ISchemaPathMatcher.cs | 2 +- src/{Schemio => Schemio.Core}/ITransformer.cs | 2 +- .../ITransformerContext.cs | 2 +- .../ITransformerQueryResult.cs | 2 +- .../Impl/DataProvider.cs | 30 +++-- .../Impl/EntityBuilder.cs} | 8 +- .../Impl/EventPublisher.cs} | 6 +- .../Impl/EventSubscriber.cs | 10 +- .../Impl/QueryBuilder.cs | 17 ++- .../Impl/QueryExecutor.cs | 23 ++-- src/Schemio.Core/Motley - Backup.Core.csproj | 46 +++++++ .../PathMatchers/JPathMatcher.cs | 4 +- .../PathMatchers/XPathMatcher.cs | 2 +- .../QueryComparer.cs | 2 +- src/{Schemio => Schemio.Core}/QueryList.cs | 2 +- .../Schemio.Core.csproj | 7 +- src/Schemio.Core/ServicesExtensions.cs | 37 +++++ .../XML/XMLDataProvider.cs | 4 +- .../{BaseSQLChildQuery.cs => BaseSQLQuery.cs} | 7 +- .../BaseSQLRootQuery.cs | 17 --- src/Schemio.EntityFramework/ISQLQuery.cs | 3 +- src/Schemio.EntityFramework/QueryEngine.cs | 18 +-- .../Schemio.EntityFramework.csproj | 8 +- src/Schemio.SQL/BaseSQLChildQuery.cs | 9 -- src/Schemio.SQL/BaseSQLQuery.cs | 9 +- src/Schemio.SQL/BaseSQLRootQuery.cs | 9 -- src/Schemio.SQL/ISQLQuery.cs | 3 +- .../Motley - Backup (1).SQL.csproj | 55 ++++++++ .../Motley - Backup (10).SQL.csproj | 55 ++++++++ .../Motley - Backup (100).SQL.csproj | 55 ++++++++ .../Motley - Backup (101).SQL.csproj | 55 ++++++++ .../Motley - Backup (102).SQL.csproj | 55 ++++++++ .../Motley - Backup (103).SQL.csproj | 55 ++++++++ .../Motley - Backup (104).SQL.csproj | 55 ++++++++ .../Motley - Backup (105).SQL.csproj | 55 ++++++++ .../Motley - Backup (106).SQL.csproj | 55 ++++++++ .../Motley - Backup (107).SQL.csproj | 55 ++++++++ .../Motley - Backup (108).SQL.csproj | 55 ++++++++ .../Motley - Backup (109).SQL.csproj | 55 ++++++++ .../Motley - Backup (11).SQL.csproj | 55 ++++++++ .../Motley - Backup (110).SQL.csproj | 55 ++++++++ .../Motley - Backup (111).SQL.csproj | 55 ++++++++ .../Motley - Backup (112).SQL.csproj | 55 ++++++++ .../Motley - Backup (113).SQL.csproj | 55 ++++++++ .../Motley - Backup (114).SQL.csproj | 55 ++++++++ .../Motley - Backup (115).SQL.csproj | 55 ++++++++ .../Motley - Backup (116).SQL.csproj | 55 ++++++++ .../Motley - Backup (117).SQL.csproj | 55 ++++++++ .../Motley - Backup (118).SQL.csproj | 55 ++++++++ .../Motley - Backup (119).SQL.csproj | 55 ++++++++ .../Motley - Backup (12).SQL.csproj | 55 ++++++++ .../Motley - Backup (120).SQL.csproj | 55 ++++++++ .../Motley - Backup (121).SQL.csproj | 55 ++++++++ .../Motley - Backup (122).SQL.csproj | 55 ++++++++ .../Motley - Backup (123).SQL.csproj | 55 ++++++++ .../Motley - Backup (124).SQL.csproj | 55 ++++++++ .../Motley - Backup (125).SQL.csproj | 55 ++++++++ .../Motley - Backup (126).SQL.csproj | 55 ++++++++ .../Motley - Backup (127).SQL.csproj | 55 ++++++++ .../Motley - Backup (128).SQL.csproj | 55 ++++++++ .../Motley - Backup (129).SQL.csproj | 55 ++++++++ .../Motley - Backup (13).SQL.csproj | 55 ++++++++ .../Motley - Backup (130).SQL.csproj | 55 ++++++++ .../Motley - Backup (131).SQL.csproj | 55 ++++++++ .../Motley - Backup (132).SQL.csproj | 55 ++++++++ .../Motley - Backup (133).SQL.csproj | 55 ++++++++ .../Motley - Backup (134).SQL.csproj | 55 ++++++++ .../Motley - Backup (135).SQL.csproj | 55 ++++++++ .../Motley - Backup (136).SQL.csproj | 55 ++++++++ .../Motley - Backup (137).SQL.csproj | 55 ++++++++ .../Motley - Backup (138).SQL.csproj | 55 ++++++++ .../Motley - Backup (139).SQL.csproj | 55 ++++++++ .../Motley - Backup (14).SQL.csproj | 55 ++++++++ .../Motley - Backup (140).SQL.csproj | 55 ++++++++ .../Motley - Backup (141).SQL.csproj | 55 ++++++++ .../Motley - Backup (142).SQL.csproj | 55 ++++++++ .../Motley - Backup (143).SQL.csproj | 55 ++++++++ .../Motley - Backup (144).SQL.csproj | 55 ++++++++ .../Motley - Backup (145).SQL.csproj | 55 ++++++++ .../Motley - Backup (146).SQL.csproj | 55 ++++++++ .../Motley - Backup (147).SQL.csproj | 55 ++++++++ .../Motley - Backup (148).SQL.csproj | 55 ++++++++ .../Motley - Backup (149).SQL.csproj | 55 ++++++++ .../Motley - Backup (15).SQL.csproj | 55 ++++++++ .../Motley - Backup (150).SQL.csproj | 55 ++++++++ .../Motley - Backup (151).SQL.csproj | 55 ++++++++ .../Motley - Backup (152).SQL.csproj | 55 ++++++++ .../Motley - Backup (153).SQL.csproj | 55 ++++++++ .../Motley - Backup (154).SQL.csproj | 55 ++++++++ .../Motley - Backup (155).SQL.csproj | 55 ++++++++ .../Motley - Backup (156).SQL.csproj | 55 ++++++++ .../Motley - Backup (157).SQL.csproj | 55 ++++++++ .../Motley - Backup (158).SQL.csproj | 55 ++++++++ .../Motley - Backup (159).SQL.csproj | 55 ++++++++ .../Motley - Backup (16).SQL.csproj | 55 ++++++++ .../Motley - Backup (160).SQL.csproj | 55 ++++++++ .../Motley - Backup (161).SQL.csproj | 55 ++++++++ .../Motley - Backup (162).SQL.csproj | 55 ++++++++ .../Motley - Backup (163).SQL.csproj | 55 ++++++++ .../Motley - Backup (164).SQL.csproj | 55 ++++++++ .../Motley - Backup (165).SQL.csproj | 55 ++++++++ .../Motley - Backup (166).SQL.csproj | 55 ++++++++ .../Motley - Backup (167).SQL.csproj | 55 ++++++++ .../Motley - Backup (168).SQL.csproj | 55 ++++++++ .../Motley - Backup (169).SQL.csproj | 55 ++++++++ .../Motley - Backup (17).SQL.csproj | 55 ++++++++ .../Motley - Backup (170).SQL.csproj | 55 ++++++++ .../Motley - Backup (171).SQL.csproj | 55 ++++++++ .../Motley - Backup (172).SQL.csproj | 55 ++++++++ .../Motley - Backup (173).SQL.csproj | 55 ++++++++ .../Motley - Backup (174).SQL.csproj | 55 ++++++++ .../Motley - Backup (175).SQL.csproj | 55 ++++++++ .../Motley - Backup (176).SQL.csproj | 55 ++++++++ .../Motley - Backup (177).SQL.csproj | 55 ++++++++ .../Motley - Backup (178).SQL.csproj | 55 ++++++++ .../Motley - Backup (179).SQL.csproj | 55 ++++++++ .../Motley - Backup (18).SQL.csproj | 55 ++++++++ .../Motley - Backup (180).SQL.csproj | 55 ++++++++ .../Motley - Backup (181).SQL.csproj | 55 ++++++++ .../Motley - Backup (182).SQL.csproj | 55 ++++++++ .../Motley - Backup (183).SQL.csproj | 55 ++++++++ .../Motley - Backup (184).SQL.csproj | 55 ++++++++ .../Motley - Backup (185).SQL.csproj | 55 ++++++++ .../Motley - Backup (186).SQL.csproj | 55 ++++++++ .../Motley - Backup (187).SQL.csproj | 55 ++++++++ .../Motley - Backup (188).SQL.csproj | 55 ++++++++ .../Motley - Backup (189).SQL.csproj | 55 ++++++++ .../Motley - Backup (19).SQL.csproj | 55 ++++++++ .../Motley - Backup (190).SQL.csproj | 55 ++++++++ .../Motley - Backup (191).SQL.csproj | 55 ++++++++ .../Motley - Backup (192).SQL.csproj | 55 ++++++++ .../Motley - Backup (193).SQL.csproj | 55 ++++++++ .../Motley - Backup (194).SQL.csproj | 55 ++++++++ .../Motley - Backup (195).SQL.csproj | 55 ++++++++ .../Motley - Backup (196).SQL.csproj | 55 ++++++++ .../Motley - Backup (197).SQL.csproj | 55 ++++++++ .../Motley - Backup (198).SQL.csproj | 55 ++++++++ .../Motley - Backup (199).SQL.csproj | 55 ++++++++ .../Motley - Backup (2).SQL.csproj | 55 ++++++++ .../Motley - Backup (20).SQL.csproj | 55 ++++++++ .../Motley - Backup (200).SQL.csproj | 55 ++++++++ .../Motley - Backup (201).SQL.csproj | 55 ++++++++ .../Motley - Backup (202).SQL.csproj | 55 ++++++++ .../Motley - Backup (203).SQL.csproj | 55 ++++++++ .../Motley - Backup (204).SQL.csproj | 55 ++++++++ .../Motley - Backup (205).SQL.csproj | 55 ++++++++ .../Motley - Backup (206).SQL.csproj | 55 ++++++++ .../Motley - Backup (207).SQL.csproj | 55 ++++++++ .../Motley - Backup (208).SQL.csproj | 55 ++++++++ .../Motley - Backup (209).SQL.csproj | 55 ++++++++ .../Motley - Backup (21).SQL.csproj | 55 ++++++++ .../Motley - Backup (210).SQL.csproj | 55 ++++++++ .../Motley - Backup (211).SQL.csproj | 55 ++++++++ .../Motley - Backup (212).SQL.csproj | 55 ++++++++ .../Motley - Backup (213).SQL.csproj | 55 ++++++++ .../Motley - Backup (214).SQL.csproj | 55 ++++++++ .../Motley - Backup (215).SQL.csproj | 55 ++++++++ .../Motley - Backup (216).SQL.csproj | 55 ++++++++ .../Motley - Backup (217).SQL.csproj | 55 ++++++++ .../Motley - Backup (218).SQL.csproj | 55 ++++++++ .../Motley - Backup (219).SQL.csproj | 55 ++++++++ .../Motley - Backup (22).SQL.csproj | 55 ++++++++ .../Motley - Backup (220).SQL.csproj | 55 ++++++++ .../Motley - Backup (221).SQL.csproj | 55 ++++++++ .../Motley - Backup (222).SQL.csproj | 54 ++++++++ .../Motley - Backup (23).SQL.csproj | 55 ++++++++ .../Motley - Backup (24).SQL.csproj | 55 ++++++++ .../Motley - Backup (25).SQL.csproj | 55 ++++++++ .../Motley - Backup (26).SQL.csproj | 55 ++++++++ .../Motley - Backup (27).SQL.csproj | 55 ++++++++ .../Motley - Backup (28).SQL.csproj | 55 ++++++++ .../Motley - Backup (29).SQL.csproj | 55 ++++++++ .../Motley - Backup (3).SQL.csproj | 55 ++++++++ .../Motley - Backup (30).SQL.csproj | 55 ++++++++ .../Motley - Backup (31).SQL.csproj | 55 ++++++++ .../Motley - Backup (32).SQL.csproj | 55 ++++++++ .../Motley - Backup (33).SQL.csproj | 55 ++++++++ .../Motley - Backup (34).SQL.csproj | 55 ++++++++ .../Motley - Backup (35).SQL.csproj | 55 ++++++++ .../Motley - Backup (36).SQL.csproj | 55 ++++++++ .../Motley - Backup (37).SQL.csproj | 55 ++++++++ .../Motley - Backup (38).SQL.csproj | 55 ++++++++ .../Motley - Backup (39).SQL.csproj | 55 ++++++++ .../Motley - Backup (4).SQL.csproj | 55 ++++++++ .../Motley - Backup (40).SQL.csproj | 55 ++++++++ .../Motley - Backup (41).SQL.csproj | 55 ++++++++ .../Motley - Backup (42).SQL.csproj | 55 ++++++++ .../Motley - Backup (43).SQL.csproj | 55 ++++++++ .../Motley - Backup (44).SQL.csproj | 55 ++++++++ .../Motley - Backup (45).SQL.csproj | 55 ++++++++ .../Motley - Backup (46).SQL.csproj | 55 ++++++++ .../Motley - Backup (47).SQL.csproj | 55 ++++++++ .../Motley - Backup (48).SQL.csproj | 55 ++++++++ .../Motley - Backup (49).SQL.csproj | 55 ++++++++ .../Motley - Backup (5).SQL.csproj | 55 ++++++++ .../Motley - Backup (50).SQL.csproj | 55 ++++++++ .../Motley - Backup (51).SQL.csproj | 55 ++++++++ .../Motley - Backup (52).SQL.csproj | 55 ++++++++ .../Motley - Backup (53).SQL.csproj | 55 ++++++++ .../Motley - Backup (54).SQL.csproj | 55 ++++++++ .../Motley - Backup (55).SQL.csproj | 55 ++++++++ .../Motley - Backup (56).SQL.csproj | 55 ++++++++ .../Motley - Backup (57).SQL.csproj | 55 ++++++++ .../Motley - Backup (58).SQL.csproj | 55 ++++++++ .../Motley - Backup (59).SQL.csproj | 55 ++++++++ .../Motley - Backup (6).SQL.csproj | 55 ++++++++ .../Motley - Backup (60).SQL.csproj | 55 ++++++++ .../Motley - Backup (61).SQL.csproj | 55 ++++++++ .../Motley - Backup (62).SQL.csproj | 55 ++++++++ .../Motley - Backup (63).SQL.csproj | 55 ++++++++ .../Motley - Backup (64).SQL.csproj | 55 ++++++++ .../Motley - Backup (65).SQL.csproj | 55 ++++++++ .../Motley - Backup (66).SQL.csproj | 55 ++++++++ .../Motley - Backup (67).SQL.csproj | 55 ++++++++ .../Motley - Backup (68).SQL.csproj | 55 ++++++++ .../Motley - Backup (69).SQL.csproj | 55 ++++++++ .../Motley - Backup (7).SQL.csproj | 55 ++++++++ .../Motley - Backup (70).SQL.csproj | 55 ++++++++ .../Motley - Backup (71).SQL.csproj | 55 ++++++++ .../Motley - Backup (72).SQL.csproj | 55 ++++++++ .../Motley - Backup (73).SQL.csproj | 55 ++++++++ .../Motley - Backup (74).SQL.csproj | 55 ++++++++ .../Motley - Backup (75).SQL.csproj | 55 ++++++++ .../Motley - Backup (76).SQL.csproj | 55 ++++++++ .../Motley - Backup (77).SQL.csproj | 55 ++++++++ .../Motley - Backup (78).SQL.csproj | 55 ++++++++ .../Motley - Backup (79).SQL.csproj | 55 ++++++++ .../Motley - Backup (8).SQL.csproj | 55 ++++++++ .../Motley - Backup (80).SQL.csproj | 55 ++++++++ .../Motley - Backup (81).SQL.csproj | 55 ++++++++ .../Motley - Backup (82).SQL.csproj | 55 ++++++++ .../Motley - Backup (83).SQL.csproj | 55 ++++++++ .../Motley - Backup (84).SQL.csproj | 55 ++++++++ .../Motley - Backup (85).SQL.csproj | 55 ++++++++ .../Motley - Backup (86).SQL.csproj | 55 ++++++++ .../Motley - Backup (87).SQL.csproj | 55 ++++++++ .../Motley - Backup (88).SQL.csproj | 55 ++++++++ .../Motley - Backup (89).SQL.csproj | 55 ++++++++ .../Motley - Backup (9).SQL.csproj | 55 ++++++++ .../Motley - Backup (90).SQL.csproj | 55 ++++++++ .../Motley - Backup (91).SQL.csproj | 55 ++++++++ .../Motley - Backup (92).SQL.csproj | 55 ++++++++ .../Motley - Backup (93).SQL.csproj | 55 ++++++++ .../Motley - Backup (94).SQL.csproj | 55 ++++++++ .../Motley - Backup (95).SQL.csproj | 55 ++++++++ .../Motley - Backup (96).SQL.csproj | 55 ++++++++ .../Motley - Backup (97).SQL.csproj | 55 ++++++++ .../Motley - Backup (98).SQL.csproj | 55 ++++++++ .../Motley - Backup (99).SQL.csproj | 55 ++++++++ src/Schemio.SQL/Motley - Backup.SQL.csproj | 55 ++++++++ src/Schemio.SQL/QueryEngine.cs | 30 ++--- src/Schemio.SQL/Schemio.SQL.csproj | 8 +- src/Schemio/BaseChildQuery.cs | 19 --- src/Schemio/BaseRootQuery.cs | 18 --- src/Schemio/CollectionResult.cs | 15 --- src/Schemio/IChildQuery.cs | 15 --- src/Schemio/IQuery.cs | 14 -- src/Schemio/IRootQuery.cs | 10 -- src/Schemio/ITransformExecutor.cs | 7 - src/Schemio/ServicesExtensions.cs | 126 ------------------ .../DataProvider.Tests/DataProviderTests.cs | 16 +-- .../DataProvider.Tests/EntityBuilderTests.cs} | 17 ++- .../DataProvider.Tests/QueryBuilderTests.cs | 16 +-- .../DataProvider.Tests/QueryExecutorTests.cs | 22 +-- .../EntitySetup/CustomerContext.cs | 2 +- .../EntitySetup/Entities/Address.cs | 2 +- .../EntitySetup/Entities/Communication.cs | 2 +- .../EntitySetup/Entities/Customer.cs | 2 +- .../EntitySetup/Entities/EntityDiagram.cd | 0 .../EntitySetup/Entities/Order.cs | 2 +- .../EntitySetup/Entities/OrderItem.cs | 2 +- .../EntitySchemas/CustomerSchema.cs | 8 +- .../Queries/CommunicationResult.cs | 2 +- .../Queries/CustomerCommunicationQuery.cs | 6 +- .../Queries/CustomerOrderItemsQuery.cs | 6 +- .../Queries/CustomerOrdersQuery.cs | 10 ++ .../EntitySetup/Queries/CustomerParameter.cs | 2 +- .../EntitySetup/Queries/CustomerQuery.cs | 6 +- .../EntitySetup/Queries/CustomerResult.cs | 2 +- .../Queries/OrderCollectionResult.cs | 2 +- .../Queries/OrderItemCollectionResult.cs | 2 +- .../EntitySetup/Queries/OrderItemParameter.cs | 2 +- .../CustomerCommunicationTransform.cs | 6 +- .../Transforms/CustomerOrderItemsTransform.cs | 10 +- .../Transforms/CustomerOrdersTransform.cs | 10 +- .../Transforms/CustomerTransform.cs | 6 +- .../Schemio.Core.Tests.csproj} | 4 +- .../UnitTest1.cs | 2 +- .../Usings.cs | 0 .../Schemio.EntityFramework.Tests/BaseTest.cs | 9 +- .../Schemio.EntityFramework.Tests/Customer.db | Bin 32768 -> 32768 bytes .../CustomerDbContext.cs | 3 +- .../E2E.Tests.cs | 4 +- .../EntitySetup/CustomerContext.cs | 2 + .../EntitySetup/Entities/Customer.cs | 2 + .../EntitySchemas/CustomerSchema.cs | 1 + .../Queries/CommunicationResult.cs | 2 + .../Queries/CustomerCommunicationQuery.cs | 14 +- .../Queries/CustomerOrderItemsQuery.cs | 21 +-- .../Queries/CustomerOrderResult.cs | 2 + .../Queries/CustomerOrdersQuery.cs | 12 +- .../Queries/CustomerParameter.cs | 4 +- .../EntitySchemas/Queries/CustomerQuery.cs | 14 +- .../EntitySchemas/Queries/CustomerResult.cs | 2 + .../Queries/OrderItemParameter.cs | 3 +- .../EntitySchemas/Queries/OrderItemResult.cs | 2 + .../CustomerCommunicationTransform.cs | 1 + .../Transforms/CustomerOrderItemsTransform.cs | 3 +- .../Transforms/CustomerOrdersTransform.cs | 3 +- .../Transforms/CustomerTransform.cs | 1 + tests/Schemio.SQL.Tests/BaseTest.cs | 8 +- tests/Schemio.SQL.Tests/Customer.db | Bin 32768 -> 32768 bytes tests/Schemio.SQL.Tests/E2E.Tests.cs | 7 +- .../EntitySetup/CustomerContext.cs | 2 + .../EntitySetup/Entities/Customer.cs | 2 + .../EntitySchemas/CustomerSchema.cs | 7 +- .../Queries/CommunicationResult.cs | 2 + .../Queries/CustomerCommunicationQuery.cs | 9 +- .../Queries/CustomerOrderItemsQuery.cs | 15 ++- .../Queries/CustomerOrdersQuery.cs | 11 +- .../Queries/CustomerParameter.cs | 4 +- .../EntitySchemas/Queries/CustomerQuery.cs | 9 +- .../EntitySchemas/Queries/CustomerResult.cs | 2 + .../Queries/OrderItemParameter.cs | 3 +- .../EntitySchemas/Queries/OrderItemResult.cs | 2 + .../EntitySchemas/Queries/OrderResult.cs | 2 + ...Transform.cs => CommunicationTransform.cs} | 3 +- .../Transforms/CustomerOrderItemsTransform.cs | 27 ---- .../Transforms/CustomerOrdersTransform.cs | 26 ---- .../Transforms/CustomerTransform.cs | 1 + .../Transforms/OrderItemsTransform.cs | 31 +++++ .../Transforms/OrdersTransform.cs | 30 +++++ .../Queries/CustomerOrdersQuery.cs | 10 -- 369 files changed, 12891 insertions(+), 629 deletions(-) create mode 100644 LICENSE rename src/{Schemio => Schemio.Core}/AssemblyInfo.cs (88%) rename src/{Schemio => Schemio.Core}/BaseEntitySchema.cs (96%) rename src/{Schemio => Schemio.Core}/BaseQuery.cs (58%) rename src/{Schemio => Schemio.Core}/BaseTransformer.cs (98%) rename src/{Schemio => Schemio.Core}/CacheResultAttribute.cs (72%) rename src/{Schemio => Schemio.Core}/ChildrenQueries.cs (87%) create mode 100644 src/Schemio.Core/CollectionResult.cs rename src/{Schemio => Schemio.Core}/CreateSchema.cs (99%) rename src/{Schemio => Schemio.Core}/DataContext.cs (93%) rename src/{Schemio => Schemio.Core}/Helpers/ArrayUtil.cs (95%) rename src/{Schemio => Schemio.Core}/Helpers/EnumerableExtentions.cs (96%) rename src/{Schemio => Schemio.Core}/Helpers/StringExtensions.cs (83%) rename src/{Schemio => Schemio.Core}/Helpers/Xml/XDocumentExts.cs (96%) rename src/{Schemio => Schemio.Core}/Helpers/Xml/XmlHelper.cs (94%) rename src/{Schemio => Schemio.Core}/Helpers/Xml/XmlSanitizer.cs (96%) rename src/{Schemio => Schemio.Core}/IDataContext.cs (82%) rename src/{Schemio => Schemio.Core}/IDataProvider.cs (85%) rename src/{Schemio => Schemio.Core}/IEntity.cs (89%) create mode 100644 src/Schemio.Core/IEntityBuilder.cs rename src/{Schemio => Schemio.Core}/IEntityContext.cs (89%) rename src/{Schemio => Schemio.Core}/IEntityContextCache.cs (91%) rename src/{Schemio => Schemio.Core}/IEntityContextValidator.cs (83%) rename src/{Schemio => Schemio.Core}/IEntitySchema.cs (75%) create mode 100644 src/Schemio.Core/IEntitySchema1.cs rename src/{Schemio => Schemio.Core}/IPolymorphicResult.cs (75%) create mode 100644 src/Schemio.Core/IQuery.cs rename src/{Schemio => Schemio.Core}/IQueryBuilder.cs (81%) rename src/{Schemio => Schemio.Core}/IQueryEngine.cs (66%) rename src/{Schemio => Schemio.Core}/IQueryExecutor.cs (84%) rename src/{Schemio => Schemio.Core}/IQueryList.cs (94%) rename src/{Schemio => Schemio.Core}/IQueryParameter.cs (69%) rename src/{Schemio => Schemio.Core}/IQueryResult.cs (68%) rename src/{Schemio => Schemio.Core}/ISchemaPathMatcher.cs (82%) rename src/{Schemio => Schemio.Core}/ITransformer.cs (95%) rename src/{Schemio => Schemio.Core}/ITransformerContext.cs (93%) rename src/{Schemio => Schemio.Core}/ITransformerQueryResult.cs (92%) rename src/{Schemio => Schemio.Core}/Impl/DataProvider.cs (71%) rename src/{Schemio/Impl/TransformExecutor.cs => Schemio.Core/Impl/EntityBuilder.cs} (87%) rename src/{Schemio/Impl/EventAggregator.cs => Schemio.Core/Impl/EventPublisher.cs} (82%) rename src/{Schemio => Schemio.Core}/Impl/EventSubscriber.cs (88%) rename src/{Schemio => Schemio.Core}/Impl/QueryBuilder.cs (82%) rename src/{Schemio => Schemio.Core}/Impl/QueryExecutor.cs (78%) create mode 100644 src/Schemio.Core/Motley - Backup.Core.csproj rename src/{Schemio => Schemio.Core}/PathMatchers/JPathMatcher.cs (84%) rename src/{Schemio => Schemio.Core}/PathMatchers/XPathMatcher.cs (95%) rename src/{Schemio => Schemio.Core}/QueryComparer.cs (92%) rename src/{Schemio => Schemio.Core}/QueryList.cs (98%) rename src/{Schemio => Schemio.Core}/Schemio.Core.csproj (90%) create mode 100644 src/Schemio.Core/ServicesExtensions.cs rename src/{Schemio => Schemio.Core}/XML/XMLDataProvider.cs (97%) rename src/Schemio.EntityFramework/{BaseSQLChildQuery.cs => BaseSQLQuery.cs} (65%) delete mode 100644 src/Schemio.EntityFramework/BaseSQLRootQuery.cs delete mode 100644 src/Schemio.SQL/BaseSQLChildQuery.cs delete mode 100644 src/Schemio.SQL/BaseSQLRootQuery.cs create mode 100644 src/Schemio.SQL/Motley - Backup (1).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (10).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (100).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (101).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (102).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (103).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (104).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (105).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (106).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (107).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (108).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (109).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (11).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (110).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (111).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (112).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (113).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (114).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (115).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (116).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (117).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (118).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (119).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (12).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (120).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (121).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (122).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (123).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (124).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (125).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (126).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (127).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (128).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (129).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (13).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (130).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (131).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (132).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (133).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (134).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (135).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (136).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (137).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (138).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (139).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (14).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (140).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (141).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (142).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (143).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (144).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (145).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (146).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (147).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (148).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (149).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (15).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (150).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (151).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (152).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (153).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (154).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (155).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (156).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (157).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (158).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (159).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (16).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (160).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (161).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (162).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (163).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (164).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (165).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (166).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (167).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (168).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (169).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (17).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (170).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (171).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (172).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (173).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (174).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (175).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (176).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (177).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (178).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (179).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (18).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (180).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (181).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (182).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (183).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (184).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (185).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (186).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (187).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (188).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (189).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (19).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (190).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (191).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (192).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (193).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (194).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (195).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (196).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (197).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (198).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (199).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (2).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (20).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (200).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (201).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (202).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (203).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (204).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (205).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (206).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (207).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (208).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (209).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (21).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (210).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (211).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (212).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (213).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (214).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (215).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (216).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (217).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (218).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (219).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (22).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (220).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (221).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (222).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (23).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (24).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (25).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (26).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (27).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (28).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (29).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (3).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (30).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (31).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (32).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (33).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (34).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (35).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (36).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (37).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (38).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (39).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (4).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (40).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (41).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (42).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (43).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (44).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (45).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (46).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (47).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (48).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (49).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (5).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (50).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (51).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (52).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (53).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (54).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (55).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (56).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (57).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (58).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (59).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (6).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (60).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (61).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (62).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (63).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (64).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (65).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (66).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (67).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (68).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (69).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (7).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (70).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (71).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (72).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (73).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (74).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (75).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (76).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (77).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (78).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (79).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (8).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (80).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (81).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (82).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (83).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (84).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (85).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (86).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (87).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (88).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (89).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (9).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (90).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (91).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (92).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (93).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (94).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (95).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (96).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (97).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (98).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup (99).SQL.csproj create mode 100644 src/Schemio.SQL/Motley - Backup.SQL.csproj delete mode 100644 src/Schemio/BaseChildQuery.cs delete mode 100644 src/Schemio/BaseRootQuery.cs delete mode 100644 src/Schemio/CollectionResult.cs delete mode 100644 src/Schemio/IChildQuery.cs delete mode 100644 src/Schemio/IQuery.cs delete mode 100644 src/Schemio/IRootQuery.cs delete mode 100644 src/Schemio/ITransformExecutor.cs delete mode 100644 src/Schemio/ServicesExtensions.cs rename tests/{Schemio.Tests => Schemio.Core.Tests}/DataProvider.Tests/DataProviderTests.cs (68%) rename tests/{Schemio.Tests/DataProvider.Tests/TransformExecutorTests.cs => Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs} (88%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/DataProvider.Tests/QueryBuilderTests.cs (95%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/DataProvider.Tests/QueryExecutorTests.cs (70%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/CustomerContext.cs (79%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/Address.cs (85%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/Communication.cs (81%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/Customer.cs (84%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/EntityDiagram.cd (100%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/Order.cs (80%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Entities/OrderItem.cs (76%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/EntitySchemas/CustomerSchema.cs (81%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CommunicationResult.cs (89%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CustomerCommunicationQuery.cs (51%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CustomerOrderItemsQuery.cs (54%) create mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CustomerParameter.cs (68%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CustomerQuery.cs (54%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/CustomerResult.cs (80%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/OrderCollectionResult.cs (87%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/OrderItemCollectionResult.cs (85%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Queries/OrderItemParameter.cs (69%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Transforms/CustomerCommunicationTransform.cs (85%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Transforms/CustomerOrderItemsTransform.cs (69%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Transforms/CustomerOrdersTransform.cs (64%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/EntitySetup/Transforms/CustomerTransform.cs (73%) rename tests/{Schemio.Tests/Schemio.Tests.csproj => Schemio.Core.Tests/Schemio.Core.Tests.csproj} (89%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/UnitTest1.cs (86%) rename tests/{Schemio.Tests => Schemio.Core.Tests}/Usings.cs (100%) rename tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/{CustomerCommunicationTransform.cs => CommunicationTransform.cs} (89%) delete mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs delete mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs create mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs create mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs delete mode 100644 tests/Schemio.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs diff --git a/.github/workflows/PullRequest-CI.yml b/.github/workflows/PullRequest-CI.yml index cd8dfb2..6d47951 100644 --- a/.github/workflows/PullRequest-CI.yml +++ b/.github/workflows/PullRequest-CI.yml @@ -10,7 +10,7 @@ jobs: Run-Lint: runs-on: ubuntu-latest env: - github-token: '${{ secrets.GITHUB_TOKEN }}' + github-token: '${{ secrets.GH_Packages }}' steps: - name: Step-01 Checkout code uses: actions/checkout@v3 @@ -30,7 +30,7 @@ jobs: beta_Version: ${{ steps.gitversion.outputs.nuGetVersion }} branchName: ${{ steps.gitversion.outputs.branchName }} env: - working-directory: /home/runner/work/Schemio/Schemio + working-directory: /home/runner/work/Motley/Motley steps: - name: Step-01 Install GitVersion @@ -85,9 +85,9 @@ jobs: outputs: semVersion: ${{ needs.Build-Release.outputs.semVersion }} env: - github-token: '${{ secrets.GITHUB_TOKEN }}' + github-token: '${{ secrets.GH_Packages }}' nuget-token: '${{ secrets.NUGET_API_KEY }}' - working-directory: /home/runner/work/Schemio/Schemio + working-directory: /home/runner/work/Motley/Motley steps: - name: Step-01 Retrieve Build Artifacts uses: actions/download-artifact@v3 @@ -100,16 +100,16 @@ jobs: - name: Step-03 Publish to Github Packages run: find -name "*.nupkg" -print -exec gpr push -k ${{env.github-token}} {} \; - - - name: Step-03 Release to Nuget Org - if: ${{ startsWith(github.head_ref, 'release/')}} - run: dotnet nuget push ${{env.working-directory}}/src/Schemio/bin/Release/*.nupkg --skip-duplicate --api-key ${{ env.nuget-token }} --source https://api.nuget.org/v3/index.json Release: name: Release to Nuget needs: [Package] if: ${{ startsWith(github.head_ref, 'release/')}} runs-on: ubuntu-latest + env: + github-token: '${{ secrets.GH_Packages }}' + nuget-token: '${{ secrets.NUGET_API_KEY }}' + working-directory: /home/runner/work/Motley/Motley steps: - uses: actions/checkout@v2 @@ -119,15 +119,15 @@ jobs: # dotnet-version: '6.0.x' # Publish - - name: publish Schemio package + - name: publish Motley package id: publish_nuget uses: Rebel028/publish-nuget@v2.8.0 with: # Filepath of the project to be packaged, relative to root of repository - PROJECT_FILE_PATH: Schemio/Schemio.csproj + PROJECT_FILE_PATH: Motley/Motley.csproj # NuGet package id, used for version detection & defaults to project name - PACKAGE_NAME: Schemio + PACKAGE_NAME: Motley # Filepath with version info, relative to root of repository & defaults to PROJECT_FILE_PATH # VERSION_FILE_PATH: Directory.Build.props @@ -145,10 +145,10 @@ jobs: # TAG_FORMAT: v* # API key to authenticate with NuGet server, or a token, issued for GITHUB_USER if you use GPR - # NUGET_KEY: ${{secrets.NUGET_API_KEY}} + NUGET_KEY: ${{secrets.NUGET_API_KEY}} # NuGet server uri hosting the packages, defaults to https://api.nuget.org - # NUGET_SOURCE: https://api.nuget.org + NUGET_SOURCE: https://api.nuget.org/v3/index.json # Flag to toggle pushing symbols along with nuget package to the server, disabled by default # INCLUDE_SYMBOLS: false diff --git a/GitVersion.yml b/GitVersion.yml index 89b0a62..280505f 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -1,4 +1,4 @@ -next-version: 1.0.0 +next-version: 2.0.0 tag-prefix: '[vV]' mode: ContinuousDeployment branches: diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..daf3b65 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Code Shayk + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Schemio.sln b/Schemio.sln index 837bcd6..dc87320 100644 --- a/Schemio.sln +++ b/Schemio.sln @@ -5,8 +5,6 @@ VisualStudioVersion = 17.5.33516.290 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F41DA3D8-A0E9-4A05-8A35-78313C0F5804}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio", "src\Schemio\Schemio.Core.csproj", "{6F017146-B95A-4081-9CC0-B0245F78D72B}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{07BAE427-96CF-4F9B-80A9-48CFB0A89CF3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{AF995FEF-BB94-48D0-B02B-6671DA73056B}" @@ -16,11 +14,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{AF README.md = README.md EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL", "src\Schemio.SQL\Schemio.SQL.csproj", "{1A0CB973-23C9-4A17-905E-59510CD18932}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework", "src\Schemio.EntityFramework\Schemio.EntityFramework.csproj", "{6B92CC17-B7DB-446F-BF2F-A93696D48B5D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.Tests", "tests\Schemio.Tests\Schemio.Tests.csproj", "{B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.Core.Tests", "tests\Schemio.Core.Tests\Schemio.Core.Tests.csproj", "{B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL.Tests", "tests\Schemio.SQL.Tests\Schemio.SQL.Tests.csproj", "{1E319404-8EF0-40A1-A9D7-A404A71A98C4}" EndProject @@ -35,24 +29,18 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "github", "github", "{39FD80 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework.Tests", "tests\Schemio.EntityFramework.Tests\Schemio.EntityFramework.Tests.csproj", "{FE039675-00BE-4DC5-945F-14E7625170D0}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.Core", "src\Schemio.Core\Schemio.Core.csproj", "{4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework", "src\Schemio.EntityFramework\Schemio.EntityFramework.csproj", "{E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL", "src\Schemio.SQL\Schemio.SQL.csproj", "{52986844-698F-486B-AEC9-846AAF50CF46}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6F017146-B95A-4081-9CC0-B0245F78D72B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6F017146-B95A-4081-9CC0-B0245F78D72B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6F017146-B95A-4081-9CC0-B0245F78D72B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6F017146-B95A-4081-9CC0-B0245F78D72B}.Release|Any CPU.Build.0 = Release|Any CPU - {1A0CB973-23C9-4A17-905E-59510CD18932}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1A0CB973-23C9-4A17-905E-59510CD18932}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1A0CB973-23C9-4A17-905E-59510CD18932}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1A0CB973-23C9-4A17-905E-59510CD18932}.Release|Any CPU.Build.0 = Release|Any CPU - {6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6B92CC17-B7DB-446F-BF2F-A93696D48B5D}.Release|Any CPU.Build.0 = Release|Any CPU {B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}.Debug|Any CPU.Build.0 = Debug|Any CPU {B09236CB-BBD2-4DCF-A698-74CCCAB29FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -65,18 +53,30 @@ Global {FE039675-00BE-4DC5-945F-14E7625170D0}.Debug|Any CPU.Build.0 = Debug|Any CPU {FE039675-00BE-4DC5-945F-14E7625170D0}.Release|Any CPU.ActiveCfg = Release|Any CPU {FE039675-00BE-4DC5-945F-14E7625170D0}.Release|Any CPU.Build.0 = Release|Any CPU + {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C}.Release|Any CPU.Build.0 = Release|Any CPU + {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB}.Release|Any CPU.Build.0 = Release|Any CPU + {52986844-698F-486B-AEC9-846AAF50CF46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {52986844-698F-486B-AEC9-846AAF50CF46}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52986844-698F-486B-AEC9-846AAF50CF46}.Release|Any CPU.ActiveCfg = Release|Any CPU + {52986844-698F-486B-AEC9-846AAF50CF46}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {6F017146-B95A-4081-9CC0-B0245F78D72B} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} - {1A0CB973-23C9-4A17-905E-59510CD18932} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} - {6B92CC17-B7DB-446F-BF2F-A93696D48B5D} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} {B09236CB-BBD2-4DCF-A698-74CCCAB29FFB} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3} {1E319404-8EF0-40A1-A9D7-A404A71A98C4} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3} {39FD806A-D320-43C9-800F-E9D9BCC90623} = {AF995FEF-BB94-48D0-B02B-6671DA73056B} {FE039675-00BE-4DC5-945F-14E7625170D0} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3} + {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} + {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} + {52986844-698F-486B-AEC9-846AAF50CF46} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C0FF62D6-1374-4939-A546-432862338528} diff --git a/src/Schemio/AssemblyInfo.cs b/src/Schemio.Core/AssemblyInfo.cs similarity index 88% rename from src/Schemio/AssemblyInfo.cs rename to src/Schemio.Core/AssemblyInfo.cs index 4005317..462744b 100644 --- a/src/Schemio/AssemblyInfo.cs +++ b/src/Schemio.Core/AssemblyInfo.cs @@ -11,8 +11,9 @@ // attribute to true on that type. [assembly: ComVisible(false)] -[assembly: InternalsVisibleTo("Schemio.Tests")] +[assembly: InternalsVisibleTo("Schemio.Core.Tests")] [assembly: InternalsVisibleTo("Schemio.SQL.Tests")] +[assembly: InternalsVisibleTo("Schemio.EntityFramework.Tests")] // The following GUID is for the ID of the typelib if this project is exposed to COM. diff --git a/src/Schemio/BaseEntitySchema.cs b/src/Schemio.Core/BaseEntitySchema.cs similarity index 96% rename from src/Schemio/BaseEntitySchema.cs rename to src/Schemio.Core/BaseEntitySchema.cs index d4b1b42..e013e9a 100644 --- a/src/Schemio/BaseEntitySchema.cs +++ b/src/Schemio.Core/BaseEntitySchema.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement to configure schema path mappings for an Entity. diff --git a/src/Schemio/BaseQuery.cs b/src/Schemio.Core/BaseQuery.cs similarity index 58% rename from src/Schemio/BaseQuery.cs rename to src/Schemio.Core/BaseQuery.cs index 9d82dfa..4cd8fb3 100644 --- a/src/Schemio/BaseQuery.cs +++ b/src/Schemio.Core/BaseQuery.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement this base class to create a data provider query. @@ -32,5 +32,22 @@ public Type ResultType /// /// public bool IsContextResolved() => QueryParameter != null; + + /// + /// Implement to resolve query parameter. + /// + /// data context passed to the data provider. + /// query result from parent query (when configured as nested query). Can be null. + public abstract void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult); + + /// + /// Run query with supporting IQueryEngine instance. + /// + /// IQueryEngine Instance + /// Instance of IQueryResult + public Task Run(IQueryEngine engine) + { + return engine.Execute(this); + } } } \ No newline at end of file diff --git a/src/Schemio/BaseTransformer.cs b/src/Schemio.Core/BaseTransformer.cs similarity index 98% rename from src/Schemio/BaseTransformer.cs rename to src/Schemio.Core/BaseTransformer.cs index 4bb2176..3669abf 100644 --- a/src/Schemio/BaseTransformer.cs +++ b/src/Schemio.Core/BaseTransformer.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public abstract class BaseTransformer : ITransformer, ITransformerContext, ITransformerQueryResult diff --git a/src/Schemio/CacheResultAttribute.cs b/src/Schemio.Core/CacheResultAttribute.cs similarity index 72% rename from src/Schemio/CacheResultAttribute.cs rename to src/Schemio.Core/CacheResultAttribute.cs index 0b32eb8..d989780 100644 --- a/src/Schemio/CacheResultAttribute.cs +++ b/src/Schemio.Core/CacheResultAttribute.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public class CacheResultAttribute : Attribute { } diff --git a/src/Schemio/ChildrenQueries.cs b/src/Schemio.Core/ChildrenQueries.cs similarity index 87% rename from src/Schemio/ChildrenQueries.cs rename to src/Schemio.Core/ChildrenQueries.cs index 42b30d9..9906175 100644 --- a/src/Schemio/ChildrenQueries.cs +++ b/src/Schemio.Core/ChildrenQueries.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public class ChildrenQueries { diff --git a/src/Schemio.Core/CollectionResult.cs b/src/Schemio.Core/CollectionResult.cs new file mode 100644 index 0000000..bd7c28d --- /dev/null +++ b/src/Schemio.Core/CollectionResult.cs @@ -0,0 +1,9 @@ +namespace Schemio.Core +{ + public class CollectionResult : List, IQueryResult + { + public CollectionResult(IEnumerable list) : base(list) + { + } + } +} \ No newline at end of file diff --git a/src/Schemio/CreateSchema.cs b/src/Schemio.Core/CreateSchema.cs similarity index 99% rename from src/Schemio/CreateSchema.cs rename to src/Schemio.Core/CreateSchema.cs index 309e324..43e9ff0 100644 --- a/src/Schemio/CreateSchema.cs +++ b/src/Schemio.Core/CreateSchema.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { #region Helpers diff --git a/src/Schemio/DataContext.cs b/src/Schemio.Core/DataContext.cs similarity index 93% rename from src/Schemio/DataContext.cs rename to src/Schemio.Core/DataContext.cs index edb4020..140e743 100644 --- a/src/Schemio/DataContext.cs +++ b/src/Schemio.Core/DataContext.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { internal class DataContext : IDataContext { diff --git a/src/Schemio/Helpers/ArrayUtil.cs b/src/Schemio.Core/Helpers/ArrayUtil.cs similarity index 95% rename from src/Schemio/Helpers/ArrayUtil.cs rename to src/Schemio.Core/Helpers/ArrayUtil.cs index 01d6bd8..b9a7ae6 100644 --- a/src/Schemio/Helpers/ArrayUtil.cs +++ b/src/Schemio.Core/Helpers/ArrayUtil.cs @@ -1,4 +1,4 @@ -namespace Schemio.Helpers +namespace Schemio.Core.Helpers { public static class ArrayUtil { diff --git a/src/Schemio/Helpers/EnumerableExtentions.cs b/src/Schemio.Core/Helpers/EnumerableExtentions.cs similarity index 96% rename from src/Schemio/Helpers/EnumerableExtentions.cs rename to src/Schemio.Core/Helpers/EnumerableExtentions.cs index 5e7f7b8..d455d10 100644 --- a/src/Schemio/Helpers/EnumerableExtentions.cs +++ b/src/Schemio.Core/Helpers/EnumerableExtentions.cs @@ -1,6 +1,6 @@ using System.Text; -namespace Schemio.Helpers +namespace Schemio.Core.Helpers { public static class EnumerableExtentions { diff --git a/src/Schemio/Helpers/StringExtensions.cs b/src/Schemio.Core/Helpers/StringExtensions.cs similarity index 83% rename from src/Schemio/Helpers/StringExtensions.cs rename to src/Schemio.Core/Helpers/StringExtensions.cs index cce4dbf..2cefe2d 100644 --- a/src/Schemio/Helpers/StringExtensions.cs +++ b/src/Schemio.Core/Helpers/StringExtensions.cs @@ -1,4 +1,4 @@ -namespace Schemio.Helpers +namespace Schemio.Core.Helpers { public static class StringExtensions { diff --git a/src/Schemio/Helpers/Xml/XDocumentExts.cs b/src/Schemio.Core/Helpers/Xml/XDocumentExts.cs similarity index 96% rename from src/Schemio/Helpers/Xml/XDocumentExts.cs rename to src/Schemio.Core/Helpers/Xml/XDocumentExts.cs index ad04e7d..936e178 100644 --- a/src/Schemio/Helpers/Xml/XDocumentExts.cs +++ b/src/Schemio.Core/Helpers/Xml/XDocumentExts.cs @@ -1,6 +1,6 @@ using System.Xml.Linq; -namespace Schemio.Helpers.Xml +namespace Schemio.Core.Helpers.Xml { public static class XDocumentExts { diff --git a/src/Schemio/Helpers/Xml/XmlHelper.cs b/src/Schemio.Core/Helpers/Xml/XmlHelper.cs similarity index 94% rename from src/Schemio/Helpers/Xml/XmlHelper.cs rename to src/Schemio.Core/Helpers/Xml/XmlHelper.cs index 1f1f9a4..b38db24 100644 --- a/src/Schemio/Helpers/Xml/XmlHelper.cs +++ b/src/Schemio.Core/Helpers/Xml/XmlHelper.cs @@ -2,7 +2,7 @@ using System.Xml; using System.Xml.Serialization; -namespace Schemio.Helpers.Xml +namespace Schemio.Core.Helpers.Xml { public static class XmlHelper { diff --git a/src/Schemio/Helpers/Xml/XmlSanitizer.cs b/src/Schemio.Core/Helpers/Xml/XmlSanitizer.cs similarity index 96% rename from src/Schemio/Helpers/Xml/XmlSanitizer.cs rename to src/Schemio.Core/Helpers/Xml/XmlSanitizer.cs index 4b16ef1..24f3b1a 100644 --- a/src/Schemio/Helpers/Xml/XmlSanitizer.cs +++ b/src/Schemio.Core/Helpers/Xml/XmlSanitizer.cs @@ -2,7 +2,7 @@ using System.Text.RegularExpressions; using System.Xml; -namespace Schemio.Helpers.Xml +namespace Schemio.Core.Helpers.Xml { public static class XmlSanitizer { diff --git a/src/Schemio/IDataContext.cs b/src/Schemio.Core/IDataContext.cs similarity index 82% rename from src/Schemio/IDataContext.cs rename to src/Schemio.Core/IDataContext.cs index d86f11f..151268f 100644 --- a/src/Schemio/IDataContext.cs +++ b/src/Schemio.Core/IDataContext.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IDataContext : IEntityContextCache { diff --git a/src/Schemio/IDataProvider.cs b/src/Schemio.Core/IDataProvider.cs similarity index 85% rename from src/Schemio/IDataProvider.cs rename to src/Schemio.Core/IDataProvider.cs index cb6c7ba..12329e8 100644 --- a/src/Schemio/IDataProvider.cs +++ b/src/Schemio.Core/IDataProvider.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IDataProvider where TEntity : IEntity { diff --git a/src/Schemio/IEntity.cs b/src/Schemio.Core/IEntity.cs similarity index 89% rename from src/Schemio/IEntity.cs rename to src/Schemio.Core/IEntity.cs index 6319a64..efe74ed 100644 --- a/src/Schemio/IEntity.cs +++ b/src/Schemio.Core/IEntity.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement Entity required to be hydrated (using query/transformer). diff --git a/src/Schemio.Core/IEntityBuilder.cs b/src/Schemio.Core/IEntityBuilder.cs new file mode 100644 index 0000000..d375e1b --- /dev/null +++ b/src/Schemio.Core/IEntityBuilder.cs @@ -0,0 +1,7 @@ +namespace Schemio.Core +{ + public interface IEntityBuilder where TEntity : IEntity + { + TEntity Build(IDataContext context, IList results); + } +} \ No newline at end of file diff --git a/src/Schemio/IEntityContext.cs b/src/Schemio.Core/IEntityContext.cs similarity index 89% rename from src/Schemio/IEntityContext.cs rename to src/Schemio.Core/IEntityContext.cs index f15c465..1e85b70 100644 --- a/src/Schemio/IEntityContext.cs +++ b/src/Schemio.Core/IEntityContext.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IEntityContext { diff --git a/src/Schemio/IEntityContextCache.cs b/src/Schemio.Core/IEntityContextCache.cs similarity index 91% rename from src/Schemio/IEntityContextCache.cs rename to src/Schemio.Core/IEntityContextCache.cs index 60a5955..b4bbd9a 100644 --- a/src/Schemio/IEntityContextCache.cs +++ b/src/Schemio.Core/IEntityContextCache.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IEntityContextCache { diff --git a/src/Schemio/IEntityContextValidator.cs b/src/Schemio.Core/IEntityContextValidator.cs similarity index 83% rename from src/Schemio/IEntityContextValidator.cs rename to src/Schemio.Core/IEntityContextValidator.cs index 9622b23..f1accbe 100644 --- a/src/Schemio/IEntityContextValidator.cs +++ b/src/Schemio.Core/IEntityContextValidator.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IEntityContextValidator { diff --git a/src/Schemio/IEntitySchema.cs b/src/Schemio.Core/IEntitySchema.cs similarity index 75% rename from src/Schemio/IEntitySchema.cs rename to src/Schemio.Core/IEntitySchema.cs index aa96154..11de773 100644 --- a/src/Schemio/IEntitySchema.cs +++ b/src/Schemio.Core/IEntitySchema.cs @@ -1,10 +1,10 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement to configure schema path mappings for an Entity. /// /// Entity type - public interface IEntitySchema where TEntity : IEntity + public interface IEntitySchema : IEntitySchema where TEntity : IEntity { /// /// Entity schema mappings. diff --git a/src/Schemio.Core/IEntitySchema1.cs b/src/Schemio.Core/IEntitySchema1.cs new file mode 100644 index 0000000..6bd2ed7 --- /dev/null +++ b/src/Schemio.Core/IEntitySchema1.cs @@ -0,0 +1,6 @@ +namespace Schemio.Core +{ + public interface IEntitySchema + { + } +} \ No newline at end of file diff --git a/src/Schemio/IPolymorphicResult.cs b/src/Schemio.Core/IPolymorphicResult.cs similarity index 75% rename from src/Schemio/IPolymorphicResult.cs rename to src/Schemio.Core/IPolymorphicResult.cs index 6e0181c..7d505a5 100644 --- a/src/Schemio/IPolymorphicResult.cs +++ b/src/Schemio.Core/IPolymorphicResult.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IPolymorphicResult : IQueryResult { diff --git a/src/Schemio.Core/IQuery.cs b/src/Schemio.Core/IQuery.cs new file mode 100644 index 0000000..bd6478c --- /dev/null +++ b/src/Schemio.Core/IQuery.cs @@ -0,0 +1,21 @@ +namespace Schemio.Core +{ + /// + /// Implement IQuery to fetch data using API or database. + /// + public interface IQuery : IQueryRunner + { + List Children { get; set; } + + Type ResultType { get; } + + bool IsContextResolved(); + + void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult = null); + } + + public interface IQueryRunner + { + Task Run(IQueryEngine engine); + } +} \ No newline at end of file diff --git a/src/Schemio/IQueryBuilder.cs b/src/Schemio.Core/IQueryBuilder.cs similarity index 81% rename from src/Schemio/IQueryBuilder.cs rename to src/Schemio.Core/IQueryBuilder.cs index 61223cc..8d7686d 100644 --- a/src/Schemio/IQueryBuilder.cs +++ b/src/Schemio.Core/IQueryBuilder.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryBuilder { diff --git a/src/Schemio/IQueryEngine.cs b/src/Schemio.Core/IQueryEngine.cs similarity index 66% rename from src/Schemio/IQueryEngine.cs rename to src/Schemio.Core/IQueryEngine.cs index a2e2535..acfb7cb 100644 --- a/src/Schemio/IQueryEngine.cs +++ b/src/Schemio.Core/IQueryEngine.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryEngine { @@ -12,8 +12,8 @@ public interface IQueryEngine /// /// Executes a list of queries returning a list of aggregated results. /// - /// List of IQuery instances. - /// List of query results. Instances of IQueryResult. - IEnumerable Execute(IEnumerable queries); + /// Instance of IQuery. + /// Instance of IQueryResult. + Task Execute(IQuery query); } } \ No newline at end of file diff --git a/src/Schemio/IQueryExecutor.cs b/src/Schemio.Core/IQueryExecutor.cs similarity index 84% rename from src/Schemio/IQueryExecutor.cs rename to src/Schemio.Core/IQueryExecutor.cs index 3085279..13ee57a 100644 --- a/src/Schemio/IQueryExecutor.cs +++ b/src/Schemio.Core/IQueryExecutor.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryExecutor { diff --git a/src/Schemio/IQueryList.cs b/src/Schemio.Core/IQueryList.cs similarity index 94% rename from src/Schemio/IQueryList.cs rename to src/Schemio.Core/IQueryList.cs index 82794d8..31c9244 100644 --- a/src/Schemio/IQueryList.cs +++ b/src/Schemio.Core/IQueryList.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryList { diff --git a/src/Schemio/IQueryParameter.cs b/src/Schemio.Core/IQueryParameter.cs similarity index 69% rename from src/Schemio/IQueryParameter.cs rename to src/Schemio.Core/IQueryParameter.cs index 68c0ed0..eda20dd 100644 --- a/src/Schemio/IQueryParameter.cs +++ b/src/Schemio.Core/IQueryParameter.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryParameter { diff --git a/src/Schemio/IQueryResult.cs b/src/Schemio.Core/IQueryResult.cs similarity index 68% rename from src/Schemio/IQueryResult.cs rename to src/Schemio.Core/IQueryResult.cs index fbfa3a6..41f1ba4 100644 --- a/src/Schemio/IQueryResult.cs +++ b/src/Schemio.Core/IQueryResult.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface IQueryResult { diff --git a/src/Schemio/ISchemaPathMatcher.cs b/src/Schemio.Core/ISchemaPathMatcher.cs similarity index 82% rename from src/Schemio/ISchemaPathMatcher.cs rename to src/Schemio.Core/ISchemaPathMatcher.cs index 4c54ded..c52ef0f 100644 --- a/src/Schemio/ISchemaPathMatcher.cs +++ b/src/Schemio.Core/ISchemaPathMatcher.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public interface ISchemaPathMatcher { diff --git a/src/Schemio/ITransformer.cs b/src/Schemio.Core/ITransformer.cs similarity index 95% rename from src/Schemio/ITransformer.cs rename to src/Schemio.Core/ITransformer.cs index 9bbbb0b..76ae8ef 100644 --- a/src/Schemio/ITransformer.cs +++ b/src/Schemio.Core/ITransformer.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement transformer to map data from supported query result to entity in context. diff --git a/src/Schemio/ITransformerContext.cs b/src/Schemio.Core/ITransformerContext.cs similarity index 93% rename from src/Schemio/ITransformerContext.cs rename to src/Schemio.Core/ITransformerContext.cs index dee4f46..df6a1a9 100644 --- a/src/Schemio/ITransformerContext.cs +++ b/src/Schemio.Core/ITransformerContext.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement to set transform with data context. diff --git a/src/Schemio/ITransformerQueryResult.cs b/src/Schemio.Core/ITransformerQueryResult.cs similarity index 92% rename from src/Schemio/ITransformerQueryResult.cs rename to src/Schemio.Core/ITransformerQueryResult.cs index c9758c5..893fce6 100644 --- a/src/Schemio/ITransformerQueryResult.cs +++ b/src/Schemio.Core/ITransformerQueryResult.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { /// /// Implement to get supported Query result. diff --git a/src/Schemio/Impl/DataProvider.cs b/src/Schemio.Core/Impl/DataProvider.cs similarity index 71% rename from src/Schemio/Impl/DataProvider.cs rename to src/Schemio.Core/Impl/DataProvider.cs index 9fe3c2a..c23555f 100644 --- a/src/Schemio/Impl/DataProvider.cs +++ b/src/Schemio.Core/Impl/DataProvider.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Logging; -using Schemio.PathMatchers; +using Schemio.Core.PathMatchers; -namespace Schemio.Impl +namespace Schemio.Core.Impl { public class DataProvider : IDataProvider where TEntity : IEntity, new() @@ -9,13 +9,13 @@ public class DataProvider : IDataProvider private readonly ILogger> logger; private readonly IQueryExecutor queryExecutor; private readonly IQueryBuilder queryBuilder; - private readonly ITransformExecutor transformExecutor; + private readonly IEntityBuilder entityBuilder; public DataProvider( IEntitySchema entitySchema, params IQueryEngine[] queryEngines) : this(null, new QueryBuilder(entitySchema, new XPathMatcher()), - new QueryExecutor(queryEngines), new TransformExecutor(entitySchema)) + new QueryExecutor(queryEngines), new EntityBuilder(entitySchema)) { } @@ -25,7 +25,7 @@ public DataProvider( ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) : this(logger, new QueryBuilder(entitySchema, schemaPathMatcher), - new QueryExecutor(queryEngines), new TransformExecutor(entitySchema)) + new QueryExecutor(queryEngines), new EntityBuilder(entitySchema)) { } @@ -33,12 +33,12 @@ public DataProvider( ILogger> logger, IQueryBuilder queryBuilder, IQueryExecutor queryExecutor, - ITransformExecutor transformExecutor) + IEntityBuilder entityBuilder) { this.logger = logger; this.queryBuilder = queryBuilder; this.queryExecutor = queryExecutor; - this.transformExecutor = transformExecutor; + this.entityBuilder = entityBuilder; } public TEntity GetData(IEntityContext entityContext) @@ -52,6 +52,20 @@ internal TEntity GetData(IDataContext context) // Build queries for the data source based on the included xPaths var watch = System.Diagnostics.Stopwatch.StartNew(); var queries = queryBuilder.Build(context); + + //foreach (var item in queries.Queries) + //{ + // Console.WriteLine("L1 Query To Execute: " + item.GetType().Name); + + // foreach (var item2 in item.Children) + // { + // Console.WriteLine("L2 Query To Execute: " + item2.GetType().Name); + + // foreach (var item3 in item2.Children) + // Console.WriteLine("L3 Query To Execute: " + item3.GetType().Name); + // } + //} + watch.Stop(); logger?.LogInformation("Query builder executed in " + watch.ElapsedMilliseconds + " ms"); @@ -63,7 +77,7 @@ internal TEntity GetData(IDataContext context) // Executes configured transformers to map query results to target entity watch = System.Diagnostics.Stopwatch.StartNew(); - var entity = transformExecutor.Execute(context, results); + var entity = entityBuilder.Build(context, results); watch.Stop(); logger?.LogInformation("Transform executor executed in " + watch.ElapsedMilliseconds + " ms"); diff --git a/src/Schemio/Impl/TransformExecutor.cs b/src/Schemio.Core/Impl/EntityBuilder.cs similarity index 87% rename from src/Schemio/Impl/TransformExecutor.cs rename to src/Schemio.Core/Impl/EntityBuilder.cs index ed55eb0..b799dd0 100644 --- a/src/Schemio/Impl/TransformExecutor.cs +++ b/src/Schemio.Core/Impl/EntityBuilder.cs @@ -1,10 +1,10 @@ -namespace Schemio.Impl +namespace Schemio.Core.Impl { - public class TransformExecutor : ITransformExecutor where T : IEntity, new() + public class EntityBuilder : IEntityBuilder where T : IEntity, new() { private readonly IEntitySchema entitySchema; - public TransformExecutor(IEntitySchema entitySchema) + public EntityBuilder(IEntitySchema entitySchema) { this.entitySchema = entitySchema; } @@ -15,7 +15,7 @@ public TransformExecutor(IEntitySchema entitySchema) /// Entity Context /// List of Query results /// - public T Execute(IDataContext context, IList queryResults) + public T Build(IDataContext context, IList queryResults) { var entity = new T { /*Version = entitySchemaMapping.Version*/ }; diff --git a/src/Schemio/Impl/EventAggregator.cs b/src/Schemio.Core/Impl/EventPublisher.cs similarity index 82% rename from src/Schemio/Impl/EventAggregator.cs rename to src/Schemio.Core/Impl/EventPublisher.cs index 4628367..f135e55 100644 --- a/src/Schemio/Impl/EventAggregator.cs +++ b/src/Schemio.Core/Impl/EventPublisher.cs @@ -1,10 +1,10 @@ -namespace Schemio.Impl +namespace Schemio.Core.Impl { - public class EventAggregator + public class EventPublisher { private readonly ISubscriber subscriber; - public EventAggregator(ISubscriber subscriber) + public EventPublisher(ISubscriber subscriber) { this.subscriber = subscriber; } diff --git a/src/Schemio/Impl/EventSubscriber.cs b/src/Schemio.Core/Impl/EventSubscriber.cs similarity index 88% rename from src/Schemio/Impl/EventSubscriber.cs rename to src/Schemio.Core/Impl/EventSubscriber.cs index 33baf8e..9390e0a 100644 --- a/src/Schemio/Impl/EventSubscriber.cs +++ b/src/Schemio.Core/Impl/EventSubscriber.cs @@ -1,4 +1,4 @@ -namespace Schemio.Impl +namespace Schemio.Core.Impl { public class EventSubscriber : ISubscriber { @@ -28,8 +28,8 @@ public void OnEventHandler(IDataContext context, ExecutorResultArgs args) if (unresolved.ParentQueryResultType != result.GetType()) continue; - foreach (var query in unresolved.Queries.Cast()) - query.ResolveChildQueryParameter(context, queryResult); + foreach (var query in unresolved.Queries) + query.ResolveQueryParameter(context, queryResult); } } @@ -48,8 +48,8 @@ public void OnEventHandler(IDataContext context, ExecutorResultArgs args) !unresolved.ParentQueryResultType.IsAssignableFrom(result.GetType())) continue; - foreach (var query in unresolved.Queries.Cast()) - query.ResolveChildQueryParameter(context, queryResult); + foreach (var query in unresolved.Queries) + query.ResolveQueryParameter(context, queryResult); } } } diff --git a/src/Schemio/Impl/QueryBuilder.cs b/src/Schemio.Core/Impl/QueryBuilder.cs similarity index 82% rename from src/Schemio/Impl/QueryBuilder.cs rename to src/Schemio.Core/Impl/QueryBuilder.cs index c79f3c2..90f56f0 100644 --- a/src/Schemio/Impl/QueryBuilder.cs +++ b/src/Schemio.Core/Impl/QueryBuilder.cs @@ -1,4 +1,4 @@ -namespace Schemio.Impl +namespace Schemio.Core.Impl { public class QueryBuilder : IQueryBuilder where T : IEntity { @@ -18,10 +18,12 @@ public QueryBuilder(IEntitySchema entitySchema, ISchemaPathMatcher schemaPath /// public IQueryList Build(IDataContext context) { - var queries = GetMappedQueries(entitySchema.Mappings.ToList(), context); + var mappings = entitySchema.Mappings.ToList(); - foreach (var query in queries.Queries.Cast()) - query.ResolveRootQueryParameter(context); + var queries = GetMappedQueries(mappings, context); + + foreach (var query in queries.Queries) + query.ResolveQueryParameter(context); return new QueryList(queries.Queries); } @@ -32,16 +34,17 @@ private QueryList GetMappedQueries(IReadOnlyCollection> for (var index = 1; index <= queryDependencyDepth; index++) { - var maps = mappings.Where(x => x.Order == index); + var maps = mappings.Where(x => x.Order == index).ToList(); foreach (var map in maps) { var dependentQueries = mappings.Where(x => x.Order == index + 1 && x.DependentOn != null && x.DependentOn.GetType() == map.Query.GetType()).ToList(); - map.Query.Children ??= new List(); + map.Query.Children = new List(); - map.Query.Children.AddRange(FilterByPaths(context, dependentQueries)); + var filtered = FilterByPaths(context, dependentQueries); + map.Query.Children.AddRange(filtered); } } diff --git a/src/Schemio/Impl/QueryExecutor.cs b/src/Schemio.Core/Impl/QueryExecutor.cs similarity index 78% rename from src/Schemio/Impl/QueryExecutor.cs rename to src/Schemio.Core/Impl/QueryExecutor.cs index 41bbbdf..87c92e0 100644 --- a/src/Schemio/Impl/QueryExecutor.cs +++ b/src/Schemio.Core/Impl/QueryExecutor.cs @@ -1,4 +1,4 @@ -namespace Schemio.Impl +namespace Schemio.Core.Impl { public class QueryExecutor : IQueryExecutor { @@ -24,7 +24,7 @@ public IList Execute(IDataContext context, IQueryList queries) private IQueryList Process(IDataContext context, IQueryList queries, List globalResults) { var subscriber = new EventSubscriber(queries.GetChildrenQueries()); - var eventAggregator = new EventAggregator(subscriber); + var eventAggregator = new EventPublisher(subscriber); var results = RunQueries(queries); @@ -55,12 +55,19 @@ private List RunQueries(IQueryList queryList) foreach (var engine in queryEngines) { - var queries = queryList.Queries.Where(x => engine.CanExecute(x)); - - var results = engine.Execute(queries); - - if (results != null) - output.AddRange(results); + var tasks = queryList.Queries + .Where(x => engine.CanExecute(x)) + .Select(s => s.Run(engine)) + .ToList(); + + Task.WhenAll(tasks); + + foreach (var task in tasks) + { + var result = task.Result; + if (result != null) + output.Add(result); + } } return output; diff --git a/src/Schemio.Core/Motley - Backup.Core.csproj b/src/Schemio.Core/Motley - Backup.Core.csproj new file mode 100644 index 0000000..8d8a202 --- /dev/null +++ b/src/Schemio.Core/Motley - Backup.Core.csproj @@ -0,0 +1,46 @@ + + + + net8.0 + enable + enable + true + Code Shayk + Code Shayk + Copyright (c) 2024 Code Shayk + https://github.com/CodeShayk/Schemio + git + README.md + ninja-icon-16.png + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley motley-core + https://github.com/CodeShayk/Schemio/wiki/i.-Home + LICENSE.md + Schemio (No Query Engine Provided) + True + True + snupkg + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + diff --git a/src/Schemio/PathMatchers/JPathMatcher.cs b/src/Schemio.Core/PathMatchers/JPathMatcher.cs similarity index 84% rename from src/Schemio/PathMatchers/JPathMatcher.cs rename to src/Schemio.Core/PathMatchers/JPathMatcher.cs index 56c9946..a24b1b2 100644 --- a/src/Schemio/PathMatchers/JPathMatcher.cs +++ b/src/Schemio.Core/PathMatchers/JPathMatcher.cs @@ -1,6 +1,6 @@ -using Schemio.Helpers; +using Schemio.Core.Helpers; -namespace Schemio.PathMatchers +namespace Schemio.Core.PathMatchers { public class JPathMatcher : ISchemaPathMatcher { diff --git a/src/Schemio/PathMatchers/XPathMatcher.cs b/src/Schemio.Core/PathMatchers/XPathMatcher.cs similarity index 95% rename from src/Schemio/PathMatchers/XPathMatcher.cs rename to src/Schemio.Core/PathMatchers/XPathMatcher.cs index b22fc2f..77e18d0 100644 --- a/src/Schemio/PathMatchers/XPathMatcher.cs +++ b/src/Schemio.Core/PathMatchers/XPathMatcher.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; -namespace Schemio.PathMatchers +namespace Schemio.Core.PathMatchers { public class XPathMatcher : ISchemaPathMatcher { diff --git a/src/Schemio/QueryComparer.cs b/src/Schemio.Core/QueryComparer.cs similarity index 92% rename from src/Schemio/QueryComparer.cs rename to src/Schemio.Core/QueryComparer.cs index 463eab4..85a1e11 100644 --- a/src/Schemio/QueryComparer.cs +++ b/src/Schemio.Core/QueryComparer.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public class QueryComparer : IEqualityComparer { diff --git a/src/Schemio/QueryList.cs b/src/Schemio.Core/QueryList.cs similarity index 98% rename from src/Schemio/QueryList.cs rename to src/Schemio.Core/QueryList.cs index 8b9c732..bc9422b 100644 --- a/src/Schemio/QueryList.cs +++ b/src/Schemio.Core/QueryList.cs @@ -1,4 +1,4 @@ -namespace Schemio +namespace Schemio.Core { public class QueryList : IQueryList { diff --git a/src/Schemio/Schemio.Core.csproj b/src/Schemio.Core/Schemio.Core.csproj similarity index 90% rename from src/Schemio/Schemio.Core.csproj rename to src/Schemio.Core/Schemio.Core.csproj index bc47a73..00fcd1a 100644 --- a/src/Schemio/Schemio.Core.csproj +++ b/src/Schemio.Core/Schemio.Core.csproj @@ -1,11 +1,10 @@ - + net8.0 enable enable true - True Code Shayk Code Shayk Copyright (c) 2024 Code Shayk @@ -18,6 +17,10 @@ https://github.com/CodeShayk/Schemio/wiki/i.-Home LICENSE.md Schemio (No Query Engine Provided) + True + True + snupkg + True diff --git a/src/Schemio.Core/ServicesExtensions.cs b/src/Schemio.Core/ServicesExtensions.cs new file mode 100644 index 0000000..bdf3ce8 --- /dev/null +++ b/src/Schemio.Core/ServicesExtensions.cs @@ -0,0 +1,37 @@ +using Microsoft.Extensions.DependencyInjection; +using Schemio.Core.Impl; +using Schemio.Core.PathMatchers; + +namespace Schemio.Core +{ + public static class ServicesExtensions + { + public static IServiceCollection UseSchemio(this IServiceCollection services, + ISchemaPathMatcher schemaPathMatcher = null, + params Func[] queryEngines + ) + { + services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); + services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); + services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); + + services.AddTransient(); + services.AddTransient(c => schemaPathMatcher ?? new XPathMatcher()); + + if (queryEngines != null && queryEngines.Length > 0) + foreach (var engine in queryEngines) + services.AddTransient(c => engine(c)); + + return services; + } + + public static IServiceCollection AddEntitySchema(this IServiceCollection services) + where TEntity : IEntity + where TSchema : IEntitySchema + { + services.AddTransient(typeof(IEntitySchema), typeof(TSchema)); + + return services; + } + } +} \ No newline at end of file diff --git a/src/Schemio/XML/XMLDataProvider.cs b/src/Schemio.Core/XML/XMLDataProvider.cs similarity index 97% rename from src/Schemio/XML/XMLDataProvider.cs rename to src/Schemio.Core/XML/XMLDataProvider.cs index 2aab53e..d4e859d 100644 --- a/src/Schemio/XML/XMLDataProvider.cs +++ b/src/Schemio.Core/XML/XMLDataProvider.cs @@ -2,9 +2,9 @@ using System.Xml.Linq; using System.Xml.Serialization; using Microsoft.Extensions.Logging; -using Schemio.Helpers.Xml; +using Schemio.Core.Helpers.Xml; -namespace Schemio.XML +namespace Schemio.Core.XML { internal class XMLDataProvider where T : IEntity { diff --git a/src/Schemio.EntityFramework/BaseSQLChildQuery.cs b/src/Schemio.EntityFramework/BaseSQLQuery.cs similarity index 65% rename from src/Schemio.EntityFramework/BaseSQLChildQuery.cs rename to src/Schemio.EntityFramework/BaseSQLQuery.cs index 134d310..029b8a1 100644 --- a/src/Schemio.EntityFramework/BaseSQLChildQuery.cs +++ b/src/Schemio.EntityFramework/BaseSQLQuery.cs @@ -1,9 +1,10 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; namespace Schemio.EntityFramework { - public abstract class BaseSQLChildQuery - : BaseChildQuery, ISQLQuery + public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery where TQueryParameter : IQueryParameter where TQueryResult : IQueryResult { @@ -12,6 +13,6 @@ public abstract class BaseSQLChildQuery /// Delegate returns a collection from db. /// /// Func> - public abstract IEnumerable Run(DbContext dbContext); + public abstract Task Run(DbContext dbContext); } } \ No newline at end of file diff --git a/src/Schemio.EntityFramework/BaseSQLRootQuery.cs b/src/Schemio.EntityFramework/BaseSQLRootQuery.cs deleted file mode 100644 index c682126..0000000 --- a/src/Schemio.EntityFramework/BaseSQLRootQuery.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace Schemio.EntityFramework -{ - public abstract class BaseSQLRootQuery - : BaseRootQuery, ISQLQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// Func> - public abstract IEnumerable Run(DbContext dbContext); - } -} \ No newline at end of file diff --git a/src/Schemio.EntityFramework/ISQLQuery.cs b/src/Schemio.EntityFramework/ISQLQuery.cs index a8240e5..137e8de 100644 --- a/src/Schemio.EntityFramework/ISQLQuery.cs +++ b/src/Schemio.EntityFramework/ISQLQuery.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; namespace Schemio.EntityFramework { @@ -9,6 +10,6 @@ public interface ISQLQuery /// Delegate returns a collection from db. /// /// Func> - IEnumerable Run(DbContext dbContext); + Task Run(DbContext dbContext); } } \ No newline at end of file diff --git a/src/Schemio.EntityFramework/QueryEngine.cs b/src/Schemio.EntityFramework/QueryEngine.cs index 1aff4c1..acd2b2b 100644 --- a/src/Schemio.EntityFramework/QueryEngine.cs +++ b/src/Schemio.EntityFramework/QueryEngine.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; namespace Schemio.EntityFramework { @@ -13,23 +14,12 @@ public QueryEngine(IDbContextFactory _dbContextFactory) public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; - public IEnumerable Execute(IEnumerable queries) + public Task Execute(IQuery query) { - var output = new List(); - using (var dbcontext = _dbContextFactory.CreateDbContext()) { - foreach (var query in queries) - { - var results = ((ISQLQuery)query).Run(dbcontext); - - if (results == null) - continue; - - output.AddRange(results); - } - - return output.ToArray(); + var result = ((ISQLQuery)query).Run(dbcontext); + return result; } } } diff --git a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj index ff8fc03..3635f2d 100644 --- a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj +++ b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj @@ -19,6 +19,12 @@ LICENSE.md True True + snupkg + True + + + + True @@ -41,7 +47,7 @@ - + diff --git a/src/Schemio.SQL/BaseSQLChildQuery.cs b/src/Schemio.SQL/BaseSQLChildQuery.cs deleted file mode 100644 index b293575..0000000 --- a/src/Schemio.SQL/BaseSQLChildQuery.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Schemio.SQL -{ - public abstract class BaseSQLChildQuery : BaseSQLQuery, IChildQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - public abstract void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult); - } -} \ No newline at end of file diff --git a/src/Schemio.SQL/BaseSQLQuery.cs b/src/Schemio.SQL/BaseSQLQuery.cs index 98e6f26..96c29d5 100644 --- a/src/Schemio.SQL/BaseSQLQuery.cs +++ b/src/Schemio.SQL/BaseSQLQuery.cs @@ -1,6 +1,5 @@ -using System.Collections.Generic; using System.Data; -using Dapper; +using Schemio.Core; namespace Schemio.SQL { @@ -8,11 +7,11 @@ public abstract class BaseSQLQuery : BaseQuery Execute(IDbConnection conn); + public abstract Task Run(IDbConnection conn); - public IEnumerable Run(IDbConnection conn) + async Task ISQLQuery.Run(IDbConnection conn) { - return (IEnumerable)Execute(conn); + return await Run(conn); } } } \ No newline at end of file diff --git a/src/Schemio.SQL/BaseSQLRootQuery.cs b/src/Schemio.SQL/BaseSQLRootQuery.cs deleted file mode 100644 index 3573f88..0000000 --- a/src/Schemio.SQL/BaseSQLRootQuery.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Schemio.SQL -{ - public abstract class BaseSQLRootQuery : BaseSQLQuery, IRootQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - public abstract void ResolveRootQueryParameter(IDataContext context); - } -} \ No newline at end of file diff --git a/src/Schemio.SQL/ISQLQuery.cs b/src/Schemio.SQL/ISQLQuery.cs index 3445994..7292752 100644 --- a/src/Schemio.SQL/ISQLQuery.cs +++ b/src/Schemio.SQL/ISQLQuery.cs @@ -1,9 +1,10 @@ using System.Data; +using Schemio.Core; namespace Schemio.SQL { public interface ISQLQuery : IQuery { - IEnumerable Run(IDbConnection conn); + Task Run(IDbConnection conn); } } \ No newline at end of file diff --git a/src/Schemio.SQL/Motley - Backup (1).SQL.csproj b/src/Schemio.SQL/Motley - Backup (1).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (1).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (10).SQL.csproj b/src/Schemio.SQL/Motley - Backup (10).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (10).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (100).SQL.csproj b/src/Schemio.SQL/Motley - Backup (100).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (100).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (101).SQL.csproj b/src/Schemio.SQL/Motley - Backup (101).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (101).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (102).SQL.csproj b/src/Schemio.SQL/Motley - Backup (102).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (102).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (103).SQL.csproj b/src/Schemio.SQL/Motley - Backup (103).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (103).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (104).SQL.csproj b/src/Schemio.SQL/Motley - Backup (104).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (104).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (105).SQL.csproj b/src/Schemio.SQL/Motley - Backup (105).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (105).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (106).SQL.csproj b/src/Schemio.SQL/Motley - Backup (106).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (106).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (107).SQL.csproj b/src/Schemio.SQL/Motley - Backup (107).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (107).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (108).SQL.csproj b/src/Schemio.SQL/Motley - Backup (108).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (108).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (109).SQL.csproj b/src/Schemio.SQL/Motley - Backup (109).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (109).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (11).SQL.csproj b/src/Schemio.SQL/Motley - Backup (11).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (11).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (110).SQL.csproj b/src/Schemio.SQL/Motley - Backup (110).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (110).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (111).SQL.csproj b/src/Schemio.SQL/Motley - Backup (111).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (111).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (112).SQL.csproj b/src/Schemio.SQL/Motley - Backup (112).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (112).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (113).SQL.csproj b/src/Schemio.SQL/Motley - Backup (113).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (113).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (114).SQL.csproj b/src/Schemio.SQL/Motley - Backup (114).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (114).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (115).SQL.csproj b/src/Schemio.SQL/Motley - Backup (115).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (115).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (116).SQL.csproj b/src/Schemio.SQL/Motley - Backup (116).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (116).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (117).SQL.csproj b/src/Schemio.SQL/Motley - Backup (117).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (117).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (118).SQL.csproj b/src/Schemio.SQL/Motley - Backup (118).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (118).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (119).SQL.csproj b/src/Schemio.SQL/Motley - Backup (119).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (119).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (12).SQL.csproj b/src/Schemio.SQL/Motley - Backup (12).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (12).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (120).SQL.csproj b/src/Schemio.SQL/Motley - Backup (120).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (120).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (121).SQL.csproj b/src/Schemio.SQL/Motley - Backup (121).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (121).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (122).SQL.csproj b/src/Schemio.SQL/Motley - Backup (122).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (122).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (123).SQL.csproj b/src/Schemio.SQL/Motley - Backup (123).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (123).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (124).SQL.csproj b/src/Schemio.SQL/Motley - Backup (124).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (124).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (125).SQL.csproj b/src/Schemio.SQL/Motley - Backup (125).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (125).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (126).SQL.csproj b/src/Schemio.SQL/Motley - Backup (126).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (126).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (127).SQL.csproj b/src/Schemio.SQL/Motley - Backup (127).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (127).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (128).SQL.csproj b/src/Schemio.SQL/Motley - Backup (128).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (128).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (129).SQL.csproj b/src/Schemio.SQL/Motley - Backup (129).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (129).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (13).SQL.csproj b/src/Schemio.SQL/Motley - Backup (13).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (13).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (130).SQL.csproj b/src/Schemio.SQL/Motley - Backup (130).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (130).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (131).SQL.csproj b/src/Schemio.SQL/Motley - Backup (131).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (131).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (132).SQL.csproj b/src/Schemio.SQL/Motley - Backup (132).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (132).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (133).SQL.csproj b/src/Schemio.SQL/Motley - Backup (133).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (133).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (134).SQL.csproj b/src/Schemio.SQL/Motley - Backup (134).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (134).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (135).SQL.csproj b/src/Schemio.SQL/Motley - Backup (135).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (135).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (136).SQL.csproj b/src/Schemio.SQL/Motley - Backup (136).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (136).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (137).SQL.csproj b/src/Schemio.SQL/Motley - Backup (137).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (137).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (138).SQL.csproj b/src/Schemio.SQL/Motley - Backup (138).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (138).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (139).SQL.csproj b/src/Schemio.SQL/Motley - Backup (139).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (139).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (14).SQL.csproj b/src/Schemio.SQL/Motley - Backup (14).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (14).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (140).SQL.csproj b/src/Schemio.SQL/Motley - Backup (140).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (140).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (141).SQL.csproj b/src/Schemio.SQL/Motley - Backup (141).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (141).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (142).SQL.csproj b/src/Schemio.SQL/Motley - Backup (142).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (142).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (143).SQL.csproj b/src/Schemio.SQL/Motley - Backup (143).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (143).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (144).SQL.csproj b/src/Schemio.SQL/Motley - Backup (144).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (144).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (145).SQL.csproj b/src/Schemio.SQL/Motley - Backup (145).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (145).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (146).SQL.csproj b/src/Schemio.SQL/Motley - Backup (146).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (146).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (147).SQL.csproj b/src/Schemio.SQL/Motley - Backup (147).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (147).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (148).SQL.csproj b/src/Schemio.SQL/Motley - Backup (148).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (148).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (149).SQL.csproj b/src/Schemio.SQL/Motley - Backup (149).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (149).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (15).SQL.csproj b/src/Schemio.SQL/Motley - Backup (15).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (15).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (150).SQL.csproj b/src/Schemio.SQL/Motley - Backup (150).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (150).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (151).SQL.csproj b/src/Schemio.SQL/Motley - Backup (151).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (151).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (152).SQL.csproj b/src/Schemio.SQL/Motley - Backup (152).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (152).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (153).SQL.csproj b/src/Schemio.SQL/Motley - Backup (153).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (153).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (154).SQL.csproj b/src/Schemio.SQL/Motley - Backup (154).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (154).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (155).SQL.csproj b/src/Schemio.SQL/Motley - Backup (155).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (155).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (156).SQL.csproj b/src/Schemio.SQL/Motley - Backup (156).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (156).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (157).SQL.csproj b/src/Schemio.SQL/Motley - Backup (157).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (157).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (158).SQL.csproj b/src/Schemio.SQL/Motley - Backup (158).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (158).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (159).SQL.csproj b/src/Schemio.SQL/Motley - Backup (159).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (159).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (16).SQL.csproj b/src/Schemio.SQL/Motley - Backup (16).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (16).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (160).SQL.csproj b/src/Schemio.SQL/Motley - Backup (160).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (160).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (161).SQL.csproj b/src/Schemio.SQL/Motley - Backup (161).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (161).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (162).SQL.csproj b/src/Schemio.SQL/Motley - Backup (162).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (162).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (163).SQL.csproj b/src/Schemio.SQL/Motley - Backup (163).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (163).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (164).SQL.csproj b/src/Schemio.SQL/Motley - Backup (164).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (164).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (165).SQL.csproj b/src/Schemio.SQL/Motley - Backup (165).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (165).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (166).SQL.csproj b/src/Schemio.SQL/Motley - Backup (166).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (166).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (167).SQL.csproj b/src/Schemio.SQL/Motley - Backup (167).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (167).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (168).SQL.csproj b/src/Schemio.SQL/Motley - Backup (168).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (168).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (169).SQL.csproj b/src/Schemio.SQL/Motley - Backup (169).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (169).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (17).SQL.csproj b/src/Schemio.SQL/Motley - Backup (17).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (17).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (170).SQL.csproj b/src/Schemio.SQL/Motley - Backup (170).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (170).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (171).SQL.csproj b/src/Schemio.SQL/Motley - Backup (171).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (171).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (172).SQL.csproj b/src/Schemio.SQL/Motley - Backup (172).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (172).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (173).SQL.csproj b/src/Schemio.SQL/Motley - Backup (173).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (173).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (174).SQL.csproj b/src/Schemio.SQL/Motley - Backup (174).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (174).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (175).SQL.csproj b/src/Schemio.SQL/Motley - Backup (175).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (175).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (176).SQL.csproj b/src/Schemio.SQL/Motley - Backup (176).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (176).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (177).SQL.csproj b/src/Schemio.SQL/Motley - Backup (177).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (177).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (178).SQL.csproj b/src/Schemio.SQL/Motley - Backup (178).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (178).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (179).SQL.csproj b/src/Schemio.SQL/Motley - Backup (179).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (179).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (18).SQL.csproj b/src/Schemio.SQL/Motley - Backup (18).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (18).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (180).SQL.csproj b/src/Schemio.SQL/Motley - Backup (180).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (180).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (181).SQL.csproj b/src/Schemio.SQL/Motley - Backup (181).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (181).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (182).SQL.csproj b/src/Schemio.SQL/Motley - Backup (182).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (182).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (183).SQL.csproj b/src/Schemio.SQL/Motley - Backup (183).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (183).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (184).SQL.csproj b/src/Schemio.SQL/Motley - Backup (184).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (184).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (185).SQL.csproj b/src/Schemio.SQL/Motley - Backup (185).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (185).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (186).SQL.csproj b/src/Schemio.SQL/Motley - Backup (186).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (186).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (187).SQL.csproj b/src/Schemio.SQL/Motley - Backup (187).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (187).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (188).SQL.csproj b/src/Schemio.SQL/Motley - Backup (188).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (188).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (189).SQL.csproj b/src/Schemio.SQL/Motley - Backup (189).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (189).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (19).SQL.csproj b/src/Schemio.SQL/Motley - Backup (19).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (19).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (190).SQL.csproj b/src/Schemio.SQL/Motley - Backup (190).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (190).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (191).SQL.csproj b/src/Schemio.SQL/Motley - Backup (191).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (191).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (192).SQL.csproj b/src/Schemio.SQL/Motley - Backup (192).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (192).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (193).SQL.csproj b/src/Schemio.SQL/Motley - Backup (193).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (193).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (194).SQL.csproj b/src/Schemio.SQL/Motley - Backup (194).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (194).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (195).SQL.csproj b/src/Schemio.SQL/Motley - Backup (195).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (195).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (196).SQL.csproj b/src/Schemio.SQL/Motley - Backup (196).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (196).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (197).SQL.csproj b/src/Schemio.SQL/Motley - Backup (197).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (197).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (198).SQL.csproj b/src/Schemio.SQL/Motley - Backup (198).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (198).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (199).SQL.csproj b/src/Schemio.SQL/Motley - Backup (199).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (199).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (2).SQL.csproj b/src/Schemio.SQL/Motley - Backup (2).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (2).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (20).SQL.csproj b/src/Schemio.SQL/Motley - Backup (20).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (20).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (200).SQL.csproj b/src/Schemio.SQL/Motley - Backup (200).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (200).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (201).SQL.csproj b/src/Schemio.SQL/Motley - Backup (201).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (201).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (202).SQL.csproj b/src/Schemio.SQL/Motley - Backup (202).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (202).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (203).SQL.csproj b/src/Schemio.SQL/Motley - Backup (203).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (203).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (204).SQL.csproj b/src/Schemio.SQL/Motley - Backup (204).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (204).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (205).SQL.csproj b/src/Schemio.SQL/Motley - Backup (205).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (205).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (206).SQL.csproj b/src/Schemio.SQL/Motley - Backup (206).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (206).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (207).SQL.csproj b/src/Schemio.SQL/Motley - Backup (207).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (207).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (208).SQL.csproj b/src/Schemio.SQL/Motley - Backup (208).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (208).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (209).SQL.csproj b/src/Schemio.SQL/Motley - Backup (209).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (209).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (21).SQL.csproj b/src/Schemio.SQL/Motley - Backup (21).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (21).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (210).SQL.csproj b/src/Schemio.SQL/Motley - Backup (210).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (210).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (211).SQL.csproj b/src/Schemio.SQL/Motley - Backup (211).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (211).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (212).SQL.csproj b/src/Schemio.SQL/Motley - Backup (212).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (212).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (213).SQL.csproj b/src/Schemio.SQL/Motley - Backup (213).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (213).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (214).SQL.csproj b/src/Schemio.SQL/Motley - Backup (214).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (214).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (215).SQL.csproj b/src/Schemio.SQL/Motley - Backup (215).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (215).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (216).SQL.csproj b/src/Schemio.SQL/Motley - Backup (216).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (216).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (217).SQL.csproj b/src/Schemio.SQL/Motley - Backup (217).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (217).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (218).SQL.csproj b/src/Schemio.SQL/Motley - Backup (218).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (218).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (219).SQL.csproj b/src/Schemio.SQL/Motley - Backup (219).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (219).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (22).SQL.csproj b/src/Schemio.SQL/Motley - Backup (22).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (22).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (220).SQL.csproj b/src/Schemio.SQL/Motley - Backup (220).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (220).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (221).SQL.csproj b/src/Schemio.SQL/Motley - Backup (221).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (221).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (222).SQL.csproj b/src/Schemio.SQL/Motley - Backup (222).SQL.csproj new file mode 100644 index 0000000..f8e4eb3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (222).SQL.csproj @@ -0,0 +1,54 @@ + + + + net8.0 + enable + enable + true + Schemio with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Schemio + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Schemio/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (23).SQL.csproj b/src/Schemio.SQL/Motley - Backup (23).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (23).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (24).SQL.csproj b/src/Schemio.SQL/Motley - Backup (24).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (24).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (25).SQL.csproj b/src/Schemio.SQL/Motley - Backup (25).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (25).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (26).SQL.csproj b/src/Schemio.SQL/Motley - Backup (26).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (26).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (27).SQL.csproj b/src/Schemio.SQL/Motley - Backup (27).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (27).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (28).SQL.csproj b/src/Schemio.SQL/Motley - Backup (28).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (28).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (29).SQL.csproj b/src/Schemio.SQL/Motley - Backup (29).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (29).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (3).SQL.csproj b/src/Schemio.SQL/Motley - Backup (3).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (3).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (30).SQL.csproj b/src/Schemio.SQL/Motley - Backup (30).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (30).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (31).SQL.csproj b/src/Schemio.SQL/Motley - Backup (31).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (31).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (32).SQL.csproj b/src/Schemio.SQL/Motley - Backup (32).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (32).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (33).SQL.csproj b/src/Schemio.SQL/Motley - Backup (33).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (33).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (34).SQL.csproj b/src/Schemio.SQL/Motley - Backup (34).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (34).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (35).SQL.csproj b/src/Schemio.SQL/Motley - Backup (35).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (35).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (36).SQL.csproj b/src/Schemio.SQL/Motley - Backup (36).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (36).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (37).SQL.csproj b/src/Schemio.SQL/Motley - Backup (37).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (37).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (38).SQL.csproj b/src/Schemio.SQL/Motley - Backup (38).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (38).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (39).SQL.csproj b/src/Schemio.SQL/Motley - Backup (39).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (39).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (4).SQL.csproj b/src/Schemio.SQL/Motley - Backup (4).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (4).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (40).SQL.csproj b/src/Schemio.SQL/Motley - Backup (40).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (40).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (41).SQL.csproj b/src/Schemio.SQL/Motley - Backup (41).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (41).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (42).SQL.csproj b/src/Schemio.SQL/Motley - Backup (42).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (42).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (43).SQL.csproj b/src/Schemio.SQL/Motley - Backup (43).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (43).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (44).SQL.csproj b/src/Schemio.SQL/Motley - Backup (44).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (44).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (45).SQL.csproj b/src/Schemio.SQL/Motley - Backup (45).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (45).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (46).SQL.csproj b/src/Schemio.SQL/Motley - Backup (46).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (46).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (47).SQL.csproj b/src/Schemio.SQL/Motley - Backup (47).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (47).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (48).SQL.csproj b/src/Schemio.SQL/Motley - Backup (48).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (48).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (49).SQL.csproj b/src/Schemio.SQL/Motley - Backup (49).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (49).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (5).SQL.csproj b/src/Schemio.SQL/Motley - Backup (5).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (5).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (50).SQL.csproj b/src/Schemio.SQL/Motley - Backup (50).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (50).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (51).SQL.csproj b/src/Schemio.SQL/Motley - Backup (51).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (51).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (52).SQL.csproj b/src/Schemio.SQL/Motley - Backup (52).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (52).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (53).SQL.csproj b/src/Schemio.SQL/Motley - Backup (53).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (53).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (54).SQL.csproj b/src/Schemio.SQL/Motley - Backup (54).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (54).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (55).SQL.csproj b/src/Schemio.SQL/Motley - Backup (55).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (55).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (56).SQL.csproj b/src/Schemio.SQL/Motley - Backup (56).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (56).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (57).SQL.csproj b/src/Schemio.SQL/Motley - Backup (57).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (57).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (58).SQL.csproj b/src/Schemio.SQL/Motley - Backup (58).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (58).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (59).SQL.csproj b/src/Schemio.SQL/Motley - Backup (59).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (59).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (6).SQL.csproj b/src/Schemio.SQL/Motley - Backup (6).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (6).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (60).SQL.csproj b/src/Schemio.SQL/Motley - Backup (60).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (60).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (61).SQL.csproj b/src/Schemio.SQL/Motley - Backup (61).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (61).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (62).SQL.csproj b/src/Schemio.SQL/Motley - Backup (62).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (62).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (63).SQL.csproj b/src/Schemio.SQL/Motley - Backup (63).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (63).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (64).SQL.csproj b/src/Schemio.SQL/Motley - Backup (64).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (64).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (65).SQL.csproj b/src/Schemio.SQL/Motley - Backup (65).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (65).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (66).SQL.csproj b/src/Schemio.SQL/Motley - Backup (66).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (66).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (67).SQL.csproj b/src/Schemio.SQL/Motley - Backup (67).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (67).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (68).SQL.csproj b/src/Schemio.SQL/Motley - Backup (68).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (68).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (69).SQL.csproj b/src/Schemio.SQL/Motley - Backup (69).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (69).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (7).SQL.csproj b/src/Schemio.SQL/Motley - Backup (7).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (7).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (70).SQL.csproj b/src/Schemio.SQL/Motley - Backup (70).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (70).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (71).SQL.csproj b/src/Schemio.SQL/Motley - Backup (71).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (71).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (72).SQL.csproj b/src/Schemio.SQL/Motley - Backup (72).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (72).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (73).SQL.csproj b/src/Schemio.SQL/Motley - Backup (73).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (73).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (74).SQL.csproj b/src/Schemio.SQL/Motley - Backup (74).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (74).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (75).SQL.csproj b/src/Schemio.SQL/Motley - Backup (75).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (75).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (76).SQL.csproj b/src/Schemio.SQL/Motley - Backup (76).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (76).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (77).SQL.csproj b/src/Schemio.SQL/Motley - Backup (77).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (77).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (78).SQL.csproj b/src/Schemio.SQL/Motley - Backup (78).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (78).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (79).SQL.csproj b/src/Schemio.SQL/Motley - Backup (79).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (79).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (8).SQL.csproj b/src/Schemio.SQL/Motley - Backup (8).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (8).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (80).SQL.csproj b/src/Schemio.SQL/Motley - Backup (80).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (80).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (81).SQL.csproj b/src/Schemio.SQL/Motley - Backup (81).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (81).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (82).SQL.csproj b/src/Schemio.SQL/Motley - Backup (82).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (82).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (83).SQL.csproj b/src/Schemio.SQL/Motley - Backup (83).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (83).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (84).SQL.csproj b/src/Schemio.SQL/Motley - Backup (84).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (84).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (85).SQL.csproj b/src/Schemio.SQL/Motley - Backup (85).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (85).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (86).SQL.csproj b/src/Schemio.SQL/Motley - Backup (86).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (86).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (87).SQL.csproj b/src/Schemio.SQL/Motley - Backup (87).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (87).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (88).SQL.csproj b/src/Schemio.SQL/Motley - Backup (88).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (88).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (89).SQL.csproj b/src/Schemio.SQL/Motley - Backup (89).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (89).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (9).SQL.csproj b/src/Schemio.SQL/Motley - Backup (9).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (9).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (90).SQL.csproj b/src/Schemio.SQL/Motley - Backup (90).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (90).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (91).SQL.csproj b/src/Schemio.SQL/Motley - Backup (91).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (91).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (92).SQL.csproj b/src/Schemio.SQL/Motley - Backup (92).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (92).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (93).SQL.csproj b/src/Schemio.SQL/Motley - Backup (93).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (93).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (94).SQL.csproj b/src/Schemio.SQL/Motley - Backup (94).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (94).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (95).SQL.csproj b/src/Schemio.SQL/Motley - Backup (95).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (95).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (96).SQL.csproj b/src/Schemio.SQL/Motley - Backup (96).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (96).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (97).SQL.csproj b/src/Schemio.SQL/Motley - Backup (97).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (97).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (98).SQL.csproj b/src/Schemio.SQL/Motley - Backup (98).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (98).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup (99).SQL.csproj b/src/Schemio.SQL/Motley - Backup (99).SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup (99).SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/Motley - Backup.SQL.csproj b/src/Schemio.SQL/Motley - Backup.SQL.csproj new file mode 100644 index 0000000..cfdd0b3 --- /dev/null +++ b/src/Schemio.SQL/Motley - Backup.SQL.csproj @@ -0,0 +1,55 @@ + + + + net8.0 + enable + enable + true + Motley with SQL + Code Shayk + Code Shayk + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper + https://github.com/CodeShayk/Motley + git + README.md + ninja-icon-16.png + https://github.com/CodeShayk/Motley/wiki/i.-Home + Copyright (c) 2024 Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. + LICENSE.md + True + True + snupkg + True + + + + True + + + + + True + \ + + + True + \ + + + True + \ + + + + + + + + + + + + + + diff --git a/src/Schemio.SQL/QueryEngine.cs b/src/Schemio.SQL/QueryEngine.cs index ac0739a..ad5d168 100644 --- a/src/Schemio.SQL/QueryEngine.cs +++ b/src/Schemio.SQL/QueryEngine.cs @@ -1,4 +1,5 @@ using System.Data.Common; +using Schemio.Core; namespace Schemio.SQL { @@ -19,33 +20,22 @@ public QueryEngine(SQLConfiguration sqlConfiguration) public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; - public IEnumerable Execute(IEnumerable queries) + public Task Execute(IQuery query) { var factory = DbProviderFactories.GetFactory(sqlConfiguration.ConnectionSettings.ProviderName) ?? throw new InvalidOperationException($"Provider: {sqlConfiguration.ConnectionSettings.ProviderName} is not supported. Please register entry in DbProviderFactories "); - var batches = queries.Chunk(sqlConfiguration.QuerySettings?.QueryBatchSize ?? 10); + using (var connection = factory.CreateConnection()) + { + if (connection == null) + throw new Exception($"Failed to create connection with Provider: {sqlConfiguration.ConnectionSettings.ProviderName}. Please check the connection settings."); - var output = new List(); + connection.ConnectionString = sqlConfiguration.ConnectionSettings.ConnectionString; - foreach (var batch in batches) - using (var connection = factory.CreateConnection()) - { - if (connection == null) - throw new Exception($"Failed to create connection with Provider: {sqlConfiguration.ConnectionSettings.ProviderName}. Please check the connection settings."); + var result = ((ISQLQuery)query).Run(connection); - connection.ConnectionString = sqlConfiguration.ConnectionSettings.ConnectionString; - - foreach (var query in batch.Cast()) - { - var results = query.Run(connection); - - if (results != null && results.Any()) - output.AddRange(results); - } - } - - return output.ToArray(); + return result; + } } } } \ No newline at end of file diff --git a/src/Schemio.SQL/Schemio.SQL.csproj b/src/Schemio.SQL/Schemio.SQL.csproj index af22bed..7d4bcbd 100644 --- a/src/Schemio.SQL/Schemio.SQL.csproj +++ b/src/Schemio.SQL/Schemio.SQL.csproj @@ -19,6 +19,12 @@ LICENSE.md True True + snupkg + True + + + + True @@ -42,7 +48,7 @@ - + diff --git a/src/Schemio/BaseChildQuery.cs b/src/Schemio/BaseChildQuery.cs deleted file mode 100644 index 6bbb761..0000000 --- a/src/Schemio/BaseChildQuery.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Schemio -{ - /// - /// Implement this base class to create a dependent or child query. - /// - /// Parameter type of the query. - /// Result type of the query. - public abstract class BaseChildQuery : BaseQuery, IChildQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Implement to resolve query parameter using parent query's result. - /// - /// Data context passed in. - /// Parent Query's result. - public abstract void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult); - } -} \ No newline at end of file diff --git a/src/Schemio/BaseRootQuery.cs b/src/Schemio/BaseRootQuery.cs deleted file mode 100644 index 2d17301..0000000 --- a/src/Schemio/BaseRootQuery.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Schemio -{ - /// - /// Implement this base class to create a root (or level 1) query. - /// - /// Parameter type of the query. - /// Result type of the query. - public abstract class BaseRootQuery : BaseQuery, IRootQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Implement to resolve query parameter using data context. - /// - /// Data context. - public abstract void ResolveRootQueryParameter(IDataContext context); - } -} \ No newline at end of file diff --git a/src/Schemio/CollectionResult.cs b/src/Schemio/CollectionResult.cs deleted file mode 100644 index 02dba67..0000000 --- a/src/Schemio/CollectionResult.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Schemio -{ - public class CollectionResult : IQueryResult - { - private List list; - - public CollectionResult(List list) - { - this.list = list; - } - - public List Items - { get { return list; } } - } -} \ No newline at end of file diff --git a/src/Schemio/IChildQuery.cs b/src/Schemio/IChildQuery.cs deleted file mode 100644 index 0df26e9..0000000 --- a/src/Schemio/IChildQuery.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Schemio -{ - /// - /// Implement to create a child query. - /// - public interface IChildQuery : IQuery - { - /// - /// Implement to resolve query parameter using parent query's result. - /// - /// - /// - void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult); - } -} \ No newline at end of file diff --git a/src/Schemio/IQuery.cs b/src/Schemio/IQuery.cs deleted file mode 100644 index 5da4225..0000000 --- a/src/Schemio/IQuery.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Schemio -{ - /// - /// Implement IQuery to fetch data using API or database. - /// - public interface IQuery - { - List Children { get; set; } - - Type ResultType { get; } - - bool IsContextResolved(); - } -} \ No newline at end of file diff --git a/src/Schemio/IRootQuery.cs b/src/Schemio/IRootQuery.cs deleted file mode 100644 index 7ed12d2..0000000 --- a/src/Schemio/IRootQuery.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Schemio -{ - /// - /// Implement to create root query. - /// - public interface IRootQuery : IQuery - { - void ResolveRootQueryParameter(IDataContext context); - } -} \ No newline at end of file diff --git a/src/Schemio/ITransformExecutor.cs b/src/Schemio/ITransformExecutor.cs deleted file mode 100644 index c7f7adb..0000000 --- a/src/Schemio/ITransformExecutor.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Schemio -{ - public interface ITransformExecutor where TEntity : IEntity - { - TEntity Execute(IDataContext context, IList results); - } -} \ No newline at end of file diff --git a/src/Schemio/ServicesExtensions.cs b/src/Schemio/ServicesExtensions.cs deleted file mode 100644 index 9f2434e..0000000 --- a/src/Schemio/ServicesExtensions.cs +++ /dev/null @@ -1,126 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Schemio.Impl; -using Schemio.PathMatchers; - -namespace Schemio -{ - public static class ServicesExtensions - { - public static IServiceCollection UseSchemio(this IServiceCollection services, - ISchemioOption options) - where TEntity : IEntity, new() - { - services.AddTransient, QueryBuilder>(); - services.AddTransient, TransformExecutor>(); - services.AddTransient(); - - var schemioOptions = options?.SchemioOptions; - - if (schemioOptions?.EntitySchema == null) - throw new ArgumentException("Cannot find configured Entity Schema definition. Please pass in implementation of IEntitySchema where T is IEntity."); - - services.AddTransient(c => schemioOptions.EntitySchema(c)); - - services.AddTransient(typeof(ISchemaPathMatcher), c => schemioOptions?.SchemaPathMatcher != null ? schemioOptions?.SchemaPathMatcher(c) : new XPathMatcher()); - - if (schemioOptions?.QueryEngines == null || !schemioOptions.QueryEngines.Any()) - throw new ArgumentException("Cannot find configured Query Engines. Please pass in implementation of IQueryEngine."); - - foreach (var engine in schemioOptions.QueryEngines) - { - services.AddTransient(c => engine(c)); - } - - if (schemioOptions?.Logger != null) - services.AddTransient(typeof(ILogger>), c => schemioOptions.Logger(c)); - - // Register data provider with dependencies. - services.AddTransient>(c => - new DataProvider - ( - schemioOptions?.Logger != null ? c.GetService>>() : null, - c.GetService>(), - c.GetService(), - c.GetService>() - )); - - return services; - } - } - - public class SchemioOptions where TEntity : IEntity, new() - { - public SchemioOptions() - { - QueryEngines = new List>(); - } - - /// - /// Implementation of IEntitySchema for schema definition. - /// - public Func> EntitySchema { get; set; } - - /// - /// Custom ISchemaPathMatcher Implementation for schema path matching. Default is XPathMatcher if not provided. - /// - public Func SchemaPathMatcher { get; set; } - - /// - /// Supported query engines. List of type IQueryEngine implementation. - /// - public List> QueryEngines { get; set; } - - /// - /// Supported query engines. List of type IQueryEngine implementation. - /// - public Func>> Logger { get; set; } - } - - public class SchemioOptionsBuilder : ISchemioLogger, ISchemioEngine, ISchemioOption - where TEntity : IEntity, new() - { - public SchemioOptions SchemioOptions { get; set; } - - public ISchemioEngine AddEngine(Func queryEngine) - { - SchemioOptions.QueryEngines.Add(queryEngine); - return this; - } - - public ISchemioLogger LogWith(Func>> logger) - { - SchemioOptions.Logger = logger; - return this; - } - } - - public interface ISchemioLogger : ISchemioOption - where TEntity : IEntity, new() - { - ISchemioLogger LogWith(Func>> logger); - } - - public interface ISchemioEngine : ISchemioOption - where TEntity : IEntity, new() - { - ISchemioEngine AddEngine(Func queryEngine); - - ISchemioLogger LogWith(Func>> logger); - } - - public interface ISchemioOption where TEntity : IEntity, new() - { - SchemioOptions SchemioOptions { get; set; } - } - - public static class With - { - public static ISchemioEngine Schema(Func> entitySchema, Func schemaPathMatcher = null) where TEntity : IEntity, new() - { - var builder = new SchemioOptionsBuilder(); - builder.SchemioOptions = new SchemioOptions { EntitySchema = entitySchema, SchemaPathMatcher = schemaPathMatcher }; - return builder; - } - } -} \ No newline at end of file diff --git a/tests/Schemio.Tests/DataProvider.Tests/DataProviderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/DataProviderTests.cs similarity index 68% rename from tests/Schemio.Tests/DataProvider.Tests/DataProviderTests.cs rename to tests/Schemio.Core.Tests/DataProvider.Tests/DataProviderTests.cs index b0830a1..e8ce3c8 100644 --- a/tests/Schemio.Tests/DataProvider.Tests/DataProviderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/DataProviderTests.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.Logging; using Moq; -using Schemio.Impl; -using Schemio.Tests.EntitySetup; -using Schemio.Tests.EntitySetup.Entities; +using Schemio.Core.Impl; +using Schemio.Core.Tests.EntitySetup; +using Schemio.Core.Tests.EntitySetup.Entities; -namespace Schemio.Tests.DataProvider.Tests +namespace Schemio.Core.Tests.DataProvider.Tests { [TestFixture] internal class DataProviderTests @@ -13,7 +13,7 @@ internal class DataProviderTests private Mock>> _logger; private Mock> _queryBuilder; private Mock _queryExecutor; - private Mock> _transformExecutor; + private Mock> _entityBuilder; [SetUp] public void Setup() @@ -21,9 +21,9 @@ public void Setup() _logger = new Mock>>(); _queryBuilder = new Mock>(); _queryExecutor = new Mock(); - _transformExecutor = new Mock>(); + _entityBuilder = new Mock>(); - _provider = new DataProvider(_logger.Object, _queryBuilder.Object, _queryExecutor.Object, _transformExecutor.Object); + _provider = new DataProvider(_logger.Object, _queryBuilder.Object, _queryExecutor.Object, _entityBuilder.Object); } [Test] @@ -35,7 +35,7 @@ public void TestDataProvider() _queryBuilder.Verify(x => x.Build(It.IsAny()), Times.Once); _queryExecutor.Verify(x => x.Execute(It.IsAny(), It.IsAny()), Times.Once); - _transformExecutor.Verify(x => x.Execute(It.IsAny(), It.IsAny>()), Times.Once); + _entityBuilder.Verify(x => x.Build(It.IsAny(), It.IsAny>()), Times.Once); } } } \ No newline at end of file diff --git a/tests/Schemio.Tests/DataProvider.Tests/TransformExecutorTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs similarity index 88% rename from tests/Schemio.Tests/DataProvider.Tests/TransformExecutorTests.cs rename to tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs index 507397d..9c8aa10 100644 --- a/tests/Schemio.Tests/DataProvider.Tests/TransformExecutorTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs @@ -1,14 +1,13 @@ -using Schemio.Tests.EntitySetup; -using Schemio.Impl; -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; +using Schemio.Core.Impl; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Tests.DataProvider.Tests +namespace Schemio.Core.Tests.DataProvider.Tests { [TestFixture] - internal class TransformExecutorTests + internal class EntityBuilderTests { - private TransformExecutor _transformExecutor; + private EntityBuilder _entityBuilder; private IEntitySchema _entitySchema; private static List<(Type result, int InvocationCount)> TransformerInvocations; @@ -17,7 +16,7 @@ internal class TransformExecutorTests public void Setup() { _entitySchema = new MockCustomerSchema(); - _transformExecutor = new TransformExecutor(_entitySchema); + _entityBuilder = new EntityBuilder(_entitySchema); TransformerInvocations = new List<(Type result, int InvocationCount)>(); } @@ -32,7 +31,7 @@ public void TestTransformExecutorForCorrectExecutionOfConfiguredTransforms() new OrderItemCollectionResult() }; - var entity = _transformExecutor.Execute(new DataContext(new EntityContext()), queryList); + var entity = _entityBuilder.Build(new DataContext(new EntityContext()), queryList); var customerTransforms = TransformerInvocations.Where(x => x.result == typeof(CustomerResult)); Assert.That(customerTransforms.Count() == 1); diff --git a/tests/Schemio.Tests/DataProvider.Tests/QueryBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs similarity index 95% rename from tests/Schemio.Tests/DataProvider.Tests/QueryBuilderTests.cs rename to tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs index c5db662..8838c45 100644 --- a/tests/Schemio.Tests/DataProvider.Tests/QueryBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs @@ -1,11 +1,11 @@ -using Schemio.Impl; -using Schemio.PathMatchers; -using Schemio.Tests.EntitySetup; -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.EntitySchemas; -using Schemio.Tests.EntitySetup.Queries; - -namespace Schemio.Tests.DataProvider.Tests +using Schemio.Core.Impl; +using Schemio.Core.PathMatchers; +using Schemio.Core.Tests.EntitySetup; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.EntitySchemas; +using Schemio.Core.Tests.EntitySetup.Queries; + +namespace Schemio.Core.Tests.DataProvider.Tests { [TestFixture] internal class QueryBuilderTests diff --git a/tests/Schemio.Tests/DataProvider.Tests/QueryExecutorTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs similarity index 70% rename from tests/Schemio.Tests/DataProvider.Tests/QueryExecutorTests.cs rename to tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs index ede3cd3..fe87bf5 100644 --- a/tests/Schemio.Tests/DataProvider.Tests/QueryExecutorTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs @@ -1,12 +1,12 @@ using Moq; -using Schemio.Impl; -using Schemio.PathMatchers; -using Schemio.Tests.EntitySetup; -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.EntitySchemas; -using Schemio.Tests.EntitySetup.Queries; - -namespace Schemio.Tests.DataProvider.Tests +using Schemio.Core.Impl; +using Schemio.Core.PathMatchers; +using Schemio.Core.Tests.EntitySetup; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.EntitySchemas; +using Schemio.Core.Tests.EntitySetup.Queries; + +namespace Schemio.Core.Tests.DataProvider.Tests { [TestFixture] internal class QueryExecutorTests @@ -28,7 +28,7 @@ public void TestQueryExecutorToReturnWhenNoQueries() { _queryExecutor.Execute(new DataContext(new EntityContext()), new QueryList()); - _queryEngine.Verify(x => x.Execute(It.IsAny>()), Times.Never()); + _queryEngine.Verify(x => x.Execute(It.IsAny()), Times.Never()); } [Test] @@ -36,7 +36,7 @@ public void TestQueryExecutorToCallEngineWhenQueriesExistForExecution() { _queryExecutor.Execute(new DataContext(new EntityContext()), new QueryList(new[] { new CustomerQuery() }) { }); - _queryEngine.Verify(x => x.Execute(It.IsAny>()), Times.Once()); + _queryEngine.Verify(x => x.Execute(It.IsAny()), Times.Once()); } [Test] // TODO - All sequence assertions @@ -47,7 +47,7 @@ public void TestQueryExecutorToExecuteConfiguredQueriesInCorrectOrder() _queryExecutor.Execute(new DataContext(new EntityContext()), querList); - _queryEngine.Verify(x => x.Execute(It.IsAny>()), Times.Once()); + _queryEngine.Verify(x => x.Execute(It.IsAny()), Times.Once()); } } } \ No newline at end of file diff --git a/tests/Schemio.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs similarity index 79% rename from tests/Schemio.Tests/EntitySetup/CustomerContext.cs rename to tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs index 65fdaba..9a98422 100644 --- a/tests/Schemio.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup +namespace Schemio.Core.Tests.EntitySetup { internal class CustomerContext : IEntityContext { diff --git a/tests/Schemio.Tests/EntitySetup/Entities/Address.cs b/tests/Schemio.Core.Tests/EntitySetup/Entities/Address.cs similarity index 85% rename from tests/Schemio.Tests/EntitySetup/Entities/Address.cs rename to tests/Schemio.Core.Tests/EntitySetup/Entities/Address.cs index 76d5b62..db8a8c9 100644 --- a/tests/Schemio.Tests/EntitySetup/Entities/Address.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Entities/Address.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Entities +namespace Schemio.Core.Tests.EntitySetup.Entities { public class Address { diff --git a/tests/Schemio.Tests/EntitySetup/Entities/Communication.cs b/tests/Schemio.Core.Tests/EntitySetup/Entities/Communication.cs similarity index 81% rename from tests/Schemio.Tests/EntitySetup/Entities/Communication.cs rename to tests/Schemio.Core.Tests/EntitySetup/Entities/Communication.cs index 16dd320..68a39d9 100644 --- a/tests/Schemio.Tests/EntitySetup/Entities/Communication.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Entities/Communication.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Entities +namespace Schemio.Core.Tests.EntitySetup.Entities { public class Communication { diff --git a/tests/Schemio.Tests/EntitySetup/Entities/Customer.cs b/tests/Schemio.Core.Tests/EntitySetup/Entities/Customer.cs similarity index 84% rename from tests/Schemio.Tests/EntitySetup/Entities/Customer.cs rename to tests/Schemio.Core.Tests/EntitySetup/Entities/Customer.cs index 00c37b9..66b751f 100644 --- a/tests/Schemio.Tests/EntitySetup/Entities/Customer.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Entities/Customer.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Entities +namespace Schemio.Core.Tests.EntitySetup.Entities { public class Customer : IEntity { diff --git a/tests/Schemio.Tests/EntitySetup/Entities/EntityDiagram.cd b/tests/Schemio.Core.Tests/EntitySetup/Entities/EntityDiagram.cd similarity index 100% rename from tests/Schemio.Tests/EntitySetup/Entities/EntityDiagram.cd rename to tests/Schemio.Core.Tests/EntitySetup/Entities/EntityDiagram.cd diff --git a/tests/Schemio.Tests/EntitySetup/Entities/Order.cs b/tests/Schemio.Core.Tests/EntitySetup/Entities/Order.cs similarity index 80% rename from tests/Schemio.Tests/EntitySetup/Entities/Order.cs rename to tests/Schemio.Core.Tests/EntitySetup/Entities/Order.cs index 7daffaf..9f3a70e 100644 --- a/tests/Schemio.Tests/EntitySetup/Entities/Order.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Entities/Order.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Entities +namespace Schemio.Core.Tests.EntitySetup.Entities { public class Order { diff --git a/tests/Schemio.Tests/EntitySetup/Entities/OrderItem.cs b/tests/Schemio.Core.Tests/EntitySetup/Entities/OrderItem.cs similarity index 76% rename from tests/Schemio.Tests/EntitySetup/Entities/OrderItem.cs rename to tests/Schemio.Core.Tests/EntitySetup/Entities/OrderItem.cs index aaad668..99616a1 100644 --- a/tests/Schemio.Tests/EntitySetup/Entities/OrderItem.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Entities/OrderItem.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Entities +namespace Schemio.Core.Tests.EntitySetup.Entities { public class OrderItem { diff --git a/tests/Schemio.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs similarity index 81% rename from tests/Schemio.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs rename to tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 8e856d2..80e0148 100644 --- a/tests/Schemio.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -1,8 +1,8 @@ -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; -using Schemio.Tests.EntitySetup.Transforms; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Transforms; -namespace Schemio.Tests.EntitySetup.EntitySchemas +namespace Schemio.Core.Tests.EntitySetup.EntitySchemas { internal class CustomerSchema : BaseEntitySchema { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CommunicationResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs similarity index 89% rename from tests/Schemio.Tests/EntitySetup/Queries/CommunicationResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs index 9b01aed..e001516 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CommunicationResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { public class CommunicationResult : IQueryResult { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs similarity index 51% rename from tests/Schemio.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs index 8eafe6c..a478296 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs @@ -1,8 +1,8 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { - internal class CustomerCommunicationQuery : BaseChildQuery + internal class CustomerCommunicationQuery : BaseQuery { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs similarity index 54% rename from tests/Schemio.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs index d1c3f8c..1143919 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs @@ -1,8 +1,8 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { - internal class CustomerOrderItemsQuery : BaseChildQuery> + internal class CustomerOrderItemsQuery : BaseQuery> { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. var ordersResult = (OrderCollectionResult)parentQueryResult; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs new file mode 100644 index 0000000..59c5b0c --- /dev/null +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs @@ -0,0 +1,10 @@ +namespace Schemio.Core.Tests.EntitySetup.Queries +{ + internal class CustomerOrdersQuery : BaseQuery> + { + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + { + // Does not execute as child to any query. + } + } +} \ No newline at end of file diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerParameter.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs similarity index 68% rename from tests/Schemio.Tests/EntitySetup/Queries/CustomerParameter.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs index 364e1e9..89b0ec0 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerParameter.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { public class CustomerParameter : IQueryParameter { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs similarity index 54% rename from tests/Schemio.Tests/EntitySetup/Queries/CustomerQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs index dd726ed..ad35bb6 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs @@ -1,8 +1,8 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { - public class CustomerQuery : BaseRootQuery + public class CustomerQuery : BaseQuery { - public override void ResolveRootQueryParameter(IDataContext context) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs similarity index 80% rename from tests/Schemio.Tests/EntitySetup/Queries/CustomerResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs index 3a59062..83c141d 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { public class CustomerResult : IQueryResult { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/OrderCollectionResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs similarity index 87% rename from tests/Schemio.Tests/EntitySetup/Queries/OrderCollectionResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs index 11a5c45..6642402 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/OrderCollectionResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { public class OrderCollectionResult : IQueryResult { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs similarity index 85% rename from tests/Schemio.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs index 74f2c51..11fc936 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { public class OrderItemCollectionResult : IQueryResult { diff --git a/tests/Schemio.Tests/EntitySetup/Queries/OrderItemParameter.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs similarity index 69% rename from tests/Schemio.Tests/EntitySetup/Queries/OrderItemParameter.cs rename to tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs index 31bf45a..cd287fe 100644 --- a/tests/Schemio.Tests/EntitySetup/Queries/OrderItemParameter.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Queries { internal class OrderItemParameter : IQueryParameter { diff --git a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs similarity index 85% rename from tests/Schemio.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs index 8b11ff7..df2bce9 100644 --- a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs @@ -1,7 +1,7 @@ -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Transforms { public class CustomerCommunicationTransform : BaseTransformer { diff --git a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs similarity index 69% rename from tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs index d784624..7e60442 100644 --- a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs @@ -1,16 +1,16 @@ -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Transforms { public class CustomerOrderItemsTransform : BaseTransformer, Customer> { public override void Transform(CollectionResult queryResult, Customer entity) { - if (queryResult?.Items == null || entity?.Orders == null) + if (queryResult == null || entity?.Orders == null) return; - foreach (var item in queryResult.Items.Where(x => x.Items != null)) + foreach (var item in queryResult.Where(x => x.Items != null)) foreach (var order in entity.Orders) if (order.OrderId == item.OrderId) order.Items = item.Items.Select(x => new OrderItem diff --git a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs similarity index 64% rename from tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs index 0fa7f47..40fda5a 100644 --- a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs @@ -1,17 +1,17 @@ -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Transforms { public class CustomerOrdersTransform : BaseTransformer, Customer> { public override void Transform(CollectionResult queryResult, Customer entity) { - if (queryResult?.Items == null) + if (queryResult == null) return; var customer = entity ?? new Customer(); - customer.Orders = queryResult.Items.Select(x => new Order + customer.Orders = queryResult.Select(x => new Order { Date = x.Date, OrderId = x.OrderId, diff --git a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs similarity index 73% rename from tests/Schemio.Tests/EntitySetup/Transforms/CustomerTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs index 4b29529..86c8377 100644 --- a/tests/Schemio.Tests/EntitySetup/Transforms/CustomerTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs @@ -1,7 +1,7 @@ -using Schemio.Tests.EntitySetup.Entities; -using Schemio.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Entities; +using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Transforms { public class CustomerTransform : BaseTransformer { diff --git a/tests/Schemio.Tests/Schemio.Tests.csproj b/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj similarity index 89% rename from tests/Schemio.Tests/Schemio.Tests.csproj rename to tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj index dcc5ad6..5e102b1 100644 --- a/tests/Schemio.Tests/Schemio.Tests.csproj +++ b/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj @@ -18,8 +18,10 @@ - + + + diff --git a/tests/Schemio.Tests/UnitTest1.cs b/tests/Schemio.Core.Tests/UnitTest1.cs similarity index 86% rename from tests/Schemio.Tests/UnitTest1.cs rename to tests/Schemio.Core.Tests/UnitTest1.cs index 8ed042a..460dce4 100644 --- a/tests/Schemio.Tests/UnitTest1.cs +++ b/tests/Schemio.Core.Tests/UnitTest1.cs @@ -1,4 +1,4 @@ -namespace Schemio.Tests +namespace Schemio.Core.Tests { public class Tests { diff --git a/tests/Schemio.Tests/Usings.cs b/tests/Schemio.Core.Tests/Usings.cs similarity index 100% rename from tests/Schemio.Tests/Usings.cs rename to tests/Schemio.Core.Tests/Usings.cs diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index 5f852bc..7c77be4 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; +using Schemio.Core; +using Schemio.Core.PathMatchers; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas; @@ -22,9 +23,9 @@ public void Setup() services.AddLogging(); - services.UseSchemio(With.Schema(c => new CustomerSchema()) - .AddEngine(c => new QueryEngine(c.GetService>())) - .LogWith(c => new Logger>(c.GetService()))); + services.UseSchemio(new XPathMatcher(), + c => new QueryEngine(c.GetService>())) + .AddEntitySchema(); // 4. Build the service provider _serviceProvider = services.BuildServiceProvider(); diff --git a/tests/Schemio.EntityFramework.Tests/Customer.db b/tests/Schemio.EntityFramework.Tests/Customer.db index 59c0139840748d01184570b908e222f5ce6518f9..1d5c292d0c3996d1828f44ae5327d6939d33cd48 100644 GIT binary patch delta 96 zcmZo@U}|V!njp<6IZ?)$QF3F#GJUpC2?Xvt_`X<=?=YGQ0; tn46iGmzk _provider; @@ -23,7 +25,7 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() }); Assert.IsNotNull(customer); - Assert.That("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@schemio.com\",\"Address\":{\"AddressId\":1,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"2021-10-22T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}", Is.EqualTo(customer.ToJson())); + Assert.That("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@gmail.com\",\"Address\":{\"AddressId\":1,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"2021-10-22T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}", Is.EqualTo(customer.ToJson())); } [Test] diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs index 00b33f5..9339619 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup { internal class CustomerContext : IEntityContext diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/Entities/Customer.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/Entities/Customer.cs index 8f3c8d7..4cce91d 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/Entities/Customer.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/Entities/Customer.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup.Entities { public class Customer : IEntity diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 5e030f2..48f4494 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -1,3 +1,4 @@ +using Schemio.Core; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs index 815f7f4..97746a9 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { [CacheResult] diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs index b7fe417..2761d62 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs @@ -1,11 +1,12 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; using Schemio.EntityFramework.Tests.Domain; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerCommunicationQuery : BaseSQLChildQuery + internal class CustomerCommunicationQuery : BaseSQLQuery { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; @@ -15,9 +16,9 @@ public override void ResolveChildQueryParameter(IDataContext context, IQueryResu }; } - public override IEnumerable Run(DbContext dbContext) + public override Task Run(DbContext dbContext) { - return dbContext.Set() + var result = dbContext.Set() .Where(p => p.Customer.Id == QueryParameter.CustomerId) .Select(c => new CommunicationResult { @@ -30,8 +31,9 @@ public override IEnumerable Run(DbContext dbContext) Region = c.Address.Region, PostalCode = c.Address.PostalCode, Country = c.Address.Country - }); - ; + }).FirstOrDefault(); + + return Task.FromResult((IQueryResult)result); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs index ed5799d..c245074 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs @@ -1,22 +1,25 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; using Schemio.EntityFramework.Tests.Domain; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrderItemsQuery : BaseSQLChildQuery + internal class CustomerOrderItemsQuery : BaseSQLQuery> { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. - var ordersResult = (CustomerOrderResult)parentQueryResult; + var ordersResults = (CollectionResult)parentQueryResult; QueryParameter ??= new OrderItemParameter(); - QueryParameter.OrderIds.Add(ordersResult.OrderId); + var orderIds = ordersResults?.Select(o => o.OrderId); + if (orderIds != null) + QueryParameter.OrderIds.AddRange(orderIds); } - public override IEnumerable Run(DbContext dbContext) + public override Task Run(DbContext dbContext) { - return dbContext.Set() + var items = dbContext.Set() .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) .Select(c => new OrderItemResult { @@ -24,8 +27,10 @@ public override IEnumerable Run(DbContext dbContext) Name = c.Name, Cost = c.Cost, OrderId = c.Order.OrderId - }); - ; + }) + .ToList(); + + return Task.FromResult((IQueryResult)new CollectionResult(items)); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs index ae22cdb..65769c5 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { public class CustomerOrderResult : IQueryResult diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs index 23383c3..e775e0f 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs @@ -1,11 +1,12 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; using Schemio.EntityFramework.Tests.Domain; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrdersQuery : BaseSQLChildQuery + internal class CustomerOrdersQuery : BaseSQLQuery> { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; @@ -15,9 +16,9 @@ public override void ResolveChildQueryParameter(IDataContext context, IQueryResu }; } - public override IEnumerable Run(DbContext dbContext) + public override Task Run(DbContext dbContext) { - return dbContext.Set() + var items = dbContext.Set() .Where(p => p.Customer.Id == QueryParameter.CustomerId) .Select(c => new CustomerOrderResult { @@ -26,7 +27,8 @@ public override IEnumerable Run(DbContext dbContext) Date = c.Date, OrderNo = c.OrderNo }); - ; + + return Task.FromResult((IQueryResult)new CollectionResult(items)); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs index a36544f..314ffec 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs @@ -1,4 +1,6 @@ -namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries +using Schemio.Core; + +namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { public class CustomerParameter : IQueryParameter { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index 2540252..0a90b2f 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -1,11 +1,12 @@ using Microsoft.EntityFrameworkCore; +using Schemio.Core; using Schemio.EntityFramework.Tests.Domain; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLRootQuery + public class CustomerQuery : BaseSQLQuery { - public override void ResolveRootQueryParameter(IDataContext context) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; @@ -15,16 +16,19 @@ public override void ResolveRootQueryParameter(IDataContext context) }; } - public override IEnumerable Run(DbContext dbContext) + public override Task Run(DbContext dbContext) { - return dbContext.Set() + var result = dbContext.Set() .Where(c => c.Id == QueryParameter.CustomerId) .Select(c => new CustomerResult { Id = c.Id, Name = c.Name, Code = c.Code - }); + }) + .FirstOrDefault(); + + return Task.FromResult((IQueryResult)result); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs index 34df022..1260b75 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { public class CustomerResult : IQueryResult diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs index 76f4cbd..7150937 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs @@ -1,4 +1,5 @@ -using Schemio.Helpers; +using Schemio.Core; +using Schemio.Core.Helpers; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs index f4c2bbe..ccb1406 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { public class OrderItemResult : IQueryResult diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs index 5eae75d..fd7c1bb 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs @@ -1,3 +1,4 @@ +using Schemio.Core; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs index 091f021..1f944c1 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs @@ -1,6 +1,7 @@ +using Schemio.Core; +using Schemio.Core.Helpers; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; -using Schemio.Helpers; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs index d46456d..9996c27 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs @@ -1,6 +1,7 @@ +using Schemio.Core; +using Schemio.Core.Helpers; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; -using Schemio.Helpers; namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs index e970e19..dd05b2f 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs @@ -1,3 +1,4 @@ +using Schemio.Core; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index 885502a..a6ae7f3 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -1,7 +1,8 @@ using System.Data.Common; using Microsoft.Data.Sqlite; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; +using Schemio.Core; +using Schemio.Core.PathMatchers; using Schemio.SQL; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas; @@ -26,9 +27,8 @@ public void Setup() services.AddLogging(); - services.UseSchemio(With.Schema(c => new CustomerSchema()) - .AddEngine(c => new QueryEngine(configuration)) - .LogWith(c => new Logger>(c.GetService()))); + services.UseSchemio(new XPathMatcher(), c => new QueryEngine(configuration)) + .AddEntitySchema(); // 4. Build the service provider _serviceProvider = services.BuildServiceProvider(); diff --git a/tests/Schemio.SQL.Tests/Customer.db b/tests/Schemio.SQL.Tests/Customer.db index 59c0139840748d01184570b908e222f5ce6518f9..1d5c292d0c3996d1828f44ae5327d6939d33cd48 100644 GIT binary patch delta 96 zcmZo@U}|V!njp<6IZ?)$QF3F#GJUpC2?Xvt_`X<=?=YGQ0; tn46iGmzk)_provider).GetData(context); Assert.IsNotNull(customer); - Assert.That(customer.ToJson(), Is.EqualTo("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@schemio.com\",\"Address\":{\"AddressId\":0,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"0001-01-01T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}")); + Assert.That(customer.ToJson(), Is.EqualTo("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@gmail.com\",\"Address\":{\"AddressId\":0,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"0001-01-01T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}")); Assert.That(context.Cache, Is.Not.Null); Assert.That(context.Cache.Count, Is.EqualTo(1)); diff --git a/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs index c9975bb..08db7e7 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup { internal class CustomerContext : IEntityContext diff --git a/tests/Schemio.SQL.Tests/EntitySetup/Entities/Customer.cs b/tests/Schemio.SQL.Tests/EntitySetup/Entities/Customer.cs index c46d25b..772c668 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/Entities/Customer.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/Entities/Customer.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup.Entities { public class Customer : IEntity diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 8c55751..e039c96 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -1,3 +1,4 @@ +using Schemio.Core; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms; @@ -11,10 +12,10 @@ public override IEnumerable> GetSchema() return CreateSchema.For() .Map(For.Paths("customer"), customer => customer.Dependents - .Map(For.Paths("customer/communication")) - .Map(For.Paths("customer/orders"), + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents - .Map(For.Paths("customer/orders/order/items"))) + .Map(For.Paths("customer/orders/order/items"))) ).Create(); } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs index 9080774..f19348b 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { [CacheResult] diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs index f9b9263..83ebd33 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs @@ -1,11 +1,12 @@ using System.Data; using Dapper; +using Schemio.Core; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerCommunicationQuery : BaseSQLChildQuery + internal class CustomerCommunicationQuery : BaseSQLQuery { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; @@ -15,9 +16,9 @@ public override void ResolveChildQueryParameter(IDataContext context, IQueryResu }; } - public override IEnumerable Execute(IDbConnection conn) + public override Task Run(IDbConnection conn) { - return conn.Query(new CommandDefinition + return conn.QueryFirstOrDefaultAsync(new CommandDefinition ( "select c.CommunicationId as Id, " + "c.Phone as Telephone, " + diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs index 8542c78..c2d3b98 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs @@ -1,22 +1,23 @@ using System.Data; using Dapper; +using Schemio.Core; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrderItemsQuery : BaseSQLChildQuery + internal class CustomerOrderItemsQuery : BaseSQLQuery> { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child query to order query taking OrderResult to resolve query parameter. - var ordersResult = (OrderResult)parentQueryResult; + var ordersResult = (CollectionResult)parentQueryResult; QueryParameter ??= new OrderItemParameter(); - QueryParameter.OrderIds.Add(ordersResult.OrderId); + QueryParameter.OrderIds.AddRange(ordersResult.Select(o => o.OrderId)); } - public override IEnumerable Execute(IDbConnection conn) + public override async Task> Run(IDbConnection conn) { - return conn.Query(new CommandDefinition + var items = await conn.QueryAsync(new CommandDefinition ( "select OrderId, " + "OrderItemId as ItemId, " + @@ -24,6 +25,8 @@ public override IEnumerable Execute(IDbConnection conn) "Cost " + $"from TOrderItem where OrderId in ({QueryParameter.ToCsv()})" )); + + return new CollectionResult(items); } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs index b76f4de..3e4fbf3 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs @@ -1,11 +1,12 @@ using System.Data; using Dapper; +using Schemio.Core; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrdersQuery : BaseSQLChildQuery + internal class CustomerOrdersQuery : BaseSQLQuery> { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; @@ -15,9 +16,9 @@ public override void ResolveChildQueryParameter(IDataContext context, IQueryResu }; } - public override IEnumerable Execute(IDbConnection conn) + public override async Task> Run(IDbConnection conn) { - return conn.Query(new CommandDefinition + var items = await conn.QueryAsync(new CommandDefinition ( "select OrderId, " + "OrderNo, " + @@ -25,6 +26,8 @@ public override IEnumerable Execute(IDbConnection conn) "from TOrder " + $"where customerId={QueryParameter.CustomerId}" )); + + return new CollectionResult(items); } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs index 94c68e8..1a0c34d 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs @@ -1,4 +1,6 @@ -namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries +using Schemio.Core; + +namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { public class CustomerParameter : IQueryParameter { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index 3b7d18a..ddefdbc 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -1,11 +1,12 @@ using System.Data; using Dapper; +using Schemio.Core; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLRootQuery + public class CustomerQuery : BaseSQLQuery { - public override void ResolveRootQueryParameter(IDataContext context) + public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; @@ -15,9 +16,9 @@ public override void ResolveRootQueryParameter(IDataContext context) }; } - public override IEnumerable Execute(IDbConnection conn) + public override Task Run(IDbConnection conn) { - return conn.Query(new CommandDefinition + return conn.QueryFirstOrDefaultAsync(new CommandDefinition ( "select CustomerId as Id, " + "Customer_Name as Name," + diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs index 34e9064..78891f1 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { public class CustomerResult : IQueryResult diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs index 5dc9249..4a07efb 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs @@ -1,4 +1,5 @@ -using Schemio.Helpers; +using Schemio.Core; +using Schemio.Core.Helpers; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs index e4605c6..58baec3 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { public class OrderItemResult : IQueryResult diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs index d04050e..5cba520 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs @@ -1,3 +1,5 @@ +using Schemio.Core; + namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { public class OrderResult : IQueryResult diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs similarity index 89% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs index 94c5beb..40a8f30 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs @@ -1,9 +1,10 @@ +using Schemio.Core; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms { - public class CustomerCommunicationTransform : BaseTransformer + public class CommunicationTransform : BaseTransformer { public override void Transform(CommunicationResult queryResult, Customer entity) { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs deleted file mode 100644 index 99098fe..0000000 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Schemio.Helpers; -using Schemio.SQL.Tests.EntitySetup.Entities; -using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; - -namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms -{ - public class CustomerOrderItemsTransform : BaseTransformer - { - public override void Transform(OrderItemResult queryResult, Customer entity) - { - if (queryResult == null || entity?.Orders == null) - return; - - foreach (var order in entity.Orders) - if (order.OrderId == queryResult.OrderId) - { - order.Items = ArrayUtil.EnsureAndResizeArray(order.Items, out var index); - order.Items[index] = new OrderItem - { - ItemId = queryResult.ItemId, - Name = queryResult.Name, - Cost = queryResult.Cost - }; - } - } - } -} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs deleted file mode 100644 index c88c789..0000000 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Schemio.Helpers; -using Schemio.SQL.Tests.EntitySetup.Entities; -using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; - -namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms -{ - public class CustomerOrdersTransform : BaseTransformer - { - public override void Transform(OrderResult queryResult, Customer entity) - { - if (queryResult == null) - return; - - var customer = entity ?? new Customer(); - - customer.Orders = ArrayUtil.EnsureAndResizeArray(customer.Orders, out var index); - - customer.Orders[index] = new Order - { - Date = queryResult.Date, - OrderId = queryResult.OrderId, - OrderNo = queryResult.OrderNo - }; - } - } -} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs index 10758db..5866926 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs @@ -1,3 +1,4 @@ +using Schemio.Core; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs new file mode 100644 index 0000000..8d06010 --- /dev/null +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs @@ -0,0 +1,31 @@ +using Schemio.Core; +using Schemio.Core.Helpers; +using Schemio.SQL.Tests.EntitySetup.Entities; +using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; + +namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms +{ + public class OrderItemsTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer customer) + { + if (collectionResult == null || !collectionResult.Any() || customer.Orders == null) + return; + + foreach (var result in collectionResult) + { + var order = customer.Orders.FirstOrDefault(o => o.OrderId == result.OrderId); + if (order == null) + continue; + + order.Items = ArrayUtil.EnsureAndResizeArray(order.Items, out var index); + order.Items[index] = new OrderItem + { + ItemId = result.ItemId, + Name = result.Name, + Cost = result.Cost + }; + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs new file mode 100644 index 0000000..4452dea --- /dev/null +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -0,0 +1,30 @@ +using Schemio.Core; +using Schemio.Core.Helpers; +using Schemio.SQL.Tests.EntitySetup.Entities; +using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; + +namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms +{ + public class OrdersTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer contract) + { + if (collectionResult == null || !collectionResult.Any()) + return; + + var customer = contract ?? new Customer(); + + customer.Orders = new Order[collectionResult.Count]; + + for (var index = 0; index < collectionResult.Count; index++) + { + customer.Orders[index] = new Order + { + Date = collectionResult[index].Date, + OrderId = collectionResult[index].OrderId, + OrderNo = collectionResult[index].OrderNo + }; + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs b/tests/Schemio.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs deleted file mode 100644 index 9f40565..0000000 --- a/tests/Schemio.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Schemio.Tests.EntitySetup.Queries -{ - internal class CustomerOrdersQuery : BaseChildQuery> - { - public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) - { - // Does not execute as child to any query. - } - } -} \ No newline at end of file From 8980a8908bfec99461c9a5537f13c317a217769d Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Sat, 9 Nov 2024 15:50:27 +0000 Subject: [PATCH 33/64] Add files via upload --- DeveloperGuide.md | 537 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 537 insertions(+) create mode 100644 DeveloperGuide.md diff --git a/DeveloperGuide.md b/DeveloperGuide.md new file mode 100644 index 0000000..aeb661e --- /dev/null +++ b/DeveloperGuide.md @@ -0,0 +1,537 @@ +# Developer Guide +## i. Installation +Install the latest nuget package as appropriate. + +`Scemio.Core` - for installing schemio for `bespoke` implementation of query engine. +``` +NuGet\Install-Package Schemio.Core +``` +`Schemio.SQL` - for installing schemio for SQL with `Dapper` engine. +``` +NuGet\Install-Package Schemio.SQL +``` +`Schemio.EntityFramework` - for installing schemio for SQL with `EntityFramework` engine. +``` +NuGet\Install-Package Schemio.EntityFramework +``` +## ii. Implementation: Usingse Schemio + +To use schemio you need to +> Step 1 - Setup the entity to be fetched. +> +> Step 2 - Construct the `DataProvider` with required dependencies. + +### Step 1. Entity Setup +Setting up an entity includes the following. +* Define the `entity` to be fetched using `DataProvider` - which is basically a class with entire object graph (with nested typed properties). +* Define the `entity schema` which is schema path mapping of the entire entity object graph. Each mapping consists of a `query` and `transformer` pair mapped to a sections of object graph (using XPaths or JsonPath for schema paths) + +#### 1.1 Entity +To mark the class as Entity, implement the class from `IEntity` interface. +Bear in mind this is the root entity to be fetched. + +>Below is an example `Customer` entity. +> +> ``` +> public class Customer : IEntity +> { +> public int CustomerId { get; set; } +> public string CustomerCode { get; set; } +> public string CustomerName { get; set; } +> public Communication Communication { get; set; } +> public Order[] Orders { get; set; } +> } +> ``` + +For the customer class, we can see there are three levels of nesting in the object graph. +- Level 1 with paths: `Customer` +- Level 2 with paths: `Customer.Communication` and `Customer.Orders` +- Level 3 with paths: `Customer.Orders.Items` + +If we choose XML Schema Definition (XSD) for the object schema of the above Customer class fo mapping with XPATHs +then below is the Customer XSD and XPaths for different nesting levels. + +> Customer XSD is +> ``` +> Coming soon... +> ``` + +> Schema mappings using XPaths are +> ``` +> - Level 1 with XPath: Customer +> - Level 2 with XPaths: Customer/Communication and Customer/Orders +> - Level 3 with XPath: Customer/Orders/Order/Items/Item + +#### 1.2 Entity Schema Definition +Define entity schema definition for the entity in context. + +* `Entity schema definition` is basically a configuration with hierarchy of `query/transformer` pairs mapped to the schema paths pointing to different levels of the entity's object graph. +* `Query` is an implementation to fetch data for a certain section of object graph from an underlying data storage. +* `Transformer` is an implementation to map the data fetched by the linked query to the relevant sections of the entity's object graph. + +To define Entity schema, implement `BaseEntitySchema` interface where T is entity in context. + +> +Example Entity Schema Definition (using XPaths) +> The `Customer` entity with `three` levels of `nesting` is configured below in `CustomerSchema` definition to show `query/transformer` pairs nested accordingly mapping to object graph using the XPath definitions. +> +> ``` +> internal class CustomerSchema : BaseEntitySchema +> { +> public override IEnumerable> GetSchema() +> { +> return CreateSchema.For() +> .Map(For.Paths("customer"), +> customer => customer.Dependents +> .Map(For.Paths("customer/communication")) +> .Map(For.Paths("customer/orders"), +> customerOrders => customerOrders.Dependents +> .Map(For.Paths("customer/orders/order/items"))) +> ).Create(); +> } +> } +>``` + +##### i. Query/Transformer Mapping +Every `Query` type in the `EntitySchema` definition should have a complementing `Transformer` type. +You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. + +>Below is the snippet from `CustomerSchema` definition. +>``` +> .Map(For.Paths("customer", "customer/code", "customer/name")) +>``` + +##### ii. Nested Query/Transformer Mappings +* You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query paramter. +* The query/transformer mappings can be `nested` to `5` levels down. +* When certain `schema paths` are included in the DataProvider `request` to fetch the Entity, the relevant query and transformer pairs get executed in the order of their nesting to hydrate the entity. + +>Example nesting of Communication query under Customer query. +>``` +> .Map(For.Paths("customer"), -- Parent +> customer => customer.Dependents +> .Map(For.Paths("customer/communication")) -- Child +>``` + + +Please see the execution sequence below for queries and transformers nested in CustomerSchema implemented above. + +image + + +`Please Note:` If you need to support custom schema language for mapping the object graph, then see extending schemio section below. + + +#### 1.2.1 Query Class +The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. + +QueryEngine is an implementation of `IQueryEngine` to execute queries against a supported data storage to return a collection of query results (ie. of type IQueryResult). + +As explained above, You can configure a query in `Parent` or `Child` (nested) mode in nested hierarchies. + +i. Parent Query + +To define a `parent` or `root` query which is usually configured at level 1 to query the root entity, derive from `aseRootQuery` +* `TQueryParameter` is basically the class that holds the `inputs` required by the root query for execution. It is an implementation of `IQueryParameter` type. +* `TQueryResult` is the result that will be returned from executing the root query. It is an implementation of `IQueryResult` type. + +The query parameter needs to be resolved before executing the query with QueryEngine. + +In `parent` mode, the query parameter is resolved using the `IDataContext` parameter passed to data provider class. + + +> See example `CustomerQuery` implemented to be configured and run in parent mode below. +> ``` +>internal class CustomerQuery : BaseRootQuery +> { +> public override void ResolveRootQueryParameter(IDataContext context) +> { +> // Executes as Parent or Level 1 query. +> // The query parameter is resolved using IDataContext parameter of data provider class. +> +> var customer = (CustomerContext)context; +> QueryParameter = new CustomerParameter +> { +> CustomerId = customer.CustomerId +> }; +> } +> } +>``` + +ii. Child Query + +To define a `child` or `dependant` query which is usually configured as child at level below the root query to query, derive from `BaseChildQuery` +* `TQueryParameter` is basically the class that holds the `inputs` required by the child query for execution. It is an implementation of `IQueryParameter` type. +* `TQueryResult` is the result that will be returned by executing the child query. It is an implementation of `IQueryResult` type. + +Similar to Root query, the query parameter of child query needs to be resolved before executing with QueryEngine. + +In `child` mode, the query parameter is resolved using the `query result` of the `parent` query. You can have a maximum of `5` levels of query nestings. + +> See example `CustomerCommunicationQuery` implemented to be configured and run as child or nested query to customer query below. Please see `CustomerSchema` definition above for parent/child configuration setup. +>``` +> internal class CustomerCommunicationQuery : BaseChildQuery +> { +> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Execute as child to customer query. +> // The result from parent customer query is used to resolve the query parameter of the nested communication query. +> +> var customer = (CustomerResult)parentQueryResult; +> QueryParameter = new CustomerParameter +> { +> CustomerId = customer.Id +> }; +> } +> } +>``` + +#### Query Engines + +`Please Note:` The above query implementation examples are with respect to parent/child configuration. The actual storage specific query definition should vary with specific implementation of the QueryEngine. +> Please see supported Query engine implementations below. +- `Schemio.SQL` - provides the implementation of IQueryEngine to execute SQL queries. Uses `Dapper` for SQL data acess. +- `Schemio.EntityFramework` - provides implementation of IQueryEngine to execute `Entity Framework` queries. + +`Query using Schemio.SQL` +The SQL query needs to implement `BaseSQLRootQuery` or `BaseSQLChildQuery` based on parent or child implementation. +And, requires implementing `public abstract CommandDefinition GetCommandDefinition()` method to return `command definition` for query to be executed with `Dapper` supported QueryEngine. + +See below example `CustomerQuery` implemented as Root SQL query +>``` +> internal class CustomerQuery : BaseSQLRootQuery +> { +> public override void ResolveRootQueryParameter(IDataContext context) +> { +> // Executes as root or level 1 query. +> var customer = (CustomerContext)context.Entity; +> QueryParameter = new CustomerParameter +> { +> CustomerId = (int)customer.CustomerId +> }; +> } +> +> public override IEnumerable Execute(IDbConnection conn) +> { +> return conn.Query(new CommandDefinition +> ( +> "select CustomerId as Id, " + +> "Customer_Name as Name," + +> "Customer_Code as Code " + +> $"from TCustomer where customerId={QueryParameter.CustomerId}" +> )); +> } +> } +>``` +> +See below example `CustomerOrderItemsQuery` implemented as child SQL query. +>``` +>internal class CustomerOrderItemsQuery : BaseSQLChildQuery +> { +> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Execute as child query to order query taking OrderResult to resolve query parameter. +> var ordersResult = (OrderResult)parentQueryResult; +> +> QueryParameter ??= new OrderItemParameter(); +> QueryParameter.OrderIds.Add(ordersResult.OrderId); +> } +> +> public override IEnumerable Execute(IDbConnection conn) +> { +> return conn.Query(new CommandDefinition +> ( +> "select OrderId, " + +> "OrderItemId as ItemId, " + +> "Name, " + +> "Cost " + +> $"from TOrderItem where OrderId in ({QueryParameter.ToCsv()})" +> )); +> } +> } +>``` + +`Query using Schemio.EntityFramework` +The SQL query needs to implement `BaseSQLRootQuery` or `BaseSQLChildQuery` based on parent or child implementation. +And, requires implementing `public abstract IEnumerable Run(DbContext dbContext)` method to implement query using `DbContext` using entity framework. + +See below example `CustomerQuery` implemented as Root Entity framework query +>``` +> internal class CustomerQuery : BaseSQLRootQuery +> { +> public override void ResolveRootQueryParameter(IDataContext context) +> { +> // Executes as root or level 1 query. +> var customer = (CustomerContext)context.Entity; +> QueryParameter = new CustomerParameter +> { +> CustomerId = (int)customer.CustomerId +> }; +> } +> +> public override IEnumerable Run(DbContext dbContext) +> { +> return dbContext.Set() +> .Where(c => c.Id == QueryParameter.CustomerId) +> .Select(c => new CustomerResult +> { +> Id = c.Id, +> Name = c.Name, +> Code = c.Code +> }); +> } +> } +>``` +> +See below example `CustomerOrderItemsQuery` implemented as child Entity framework query. +>``` +>internal class CustomerOrderItemsQuery : BaseSQLChildQuery +> { +> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> { +> // Execute as child query to order query taking OrderResult to resolve query parameter. +> var ordersResult = (CustomerOrderResult)parentQueryResult; +> +> QueryParameter ??= new OrderItemParameter(); +> QueryParameter.OrderIds.Add(ordersResult.OrderId); +> } +> +> public override IEnumerable Run(DbContext dbContext) +> { +> return dbContext.Set() +> .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) +> .Select(c => new OrderItemResult +> { +> ItemId = c.ItemId, +> Name = c.Name, +> Cost = c.Cost, +> OrderId = c.Order.OrderId +> }); +> ; +> } +> } +>``` + + +#### 2.2 Tranformer Class +The purpose of the transformer class is to transform the data fetched by the linked query class and mapp to the configured object graph of the entity. + +To define a transformer class, you need to implement `BaseTransformer` +- where TEntity is Entity implementing `IEntity`. eg. Customer. +- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. + +Note: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. + +For the example query/transformer mapping +>``` +> .Map(For.Paths("customer")) +>``` + +The customer transformer maps data only to the `customer` xpath mapped object graph of customer class. +ie. - `customer/id`, `customer/customercode`, `customer/customername` + +In below transformer example, `CustomerTransformer` is implemented to transform entity `Customer` with `CustomerResult` query result obtained from `CustomerQuery` execution. + +> +>``` +>internal class CustomerTransform : BaseTransformer +> { +> public override Customer Transform(CustomerResult queryResult, Customer entity) +> { +> var customer = entity ?? new Customer(); +> customer.CustomerId = queryResult.Id; +> customer.CustomerName = queryResult.CustomerName; +> customer.CustomerCode = queryResult.CustomerCode; +> return customer; +> } +> } +>``` + +### DataProvider Setup +Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. + +- `ILogger>` - logger implementation. default no logger. +- `IEntitySchema` - mandatory entity schema definition for entity's object graph. +- `IQueryEngine` - implementation of query engine to execute queries (of type IQuery) with supported data storage. +- `ISchemaPathMatcher` - implementation of schema path matcher to use custom schema paths with entity schema definition. + +Example constructors: + +i. With `EntitySchema` and `QueryEngine` implementations. + +``` + public DataProvider(IEntitySchema entitySchema, params IQueryEngine[] queryEngines) +``` +ii. With `Logger`, `EntitySchema`, `QueryEngine`, and `SchemaPathmMatcher` for custom schema paths mapping in entity schema definition. +``` + public DataProvider(ILogger> logger, IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) + +``` +#### Schemio.SQL +Construct DataProvider using `Schemio.SQL.QueryEngine` query engine. + +``` +var provider = new DataProvider(new CustomerSchema(), new Schemio.SQL.QueryEngine(new SQLConfiguration())); +``` + +#### Schemio.EntityFramework +Construct DataProvider using `Schemio.EntityFramework.QueryEngine` query engine. + +``` +var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.QueryEngine()); +``` + +### Using IOC for registrations + +With ServiceCollection, you should call the `services.UseSchemio()` method for IoC registration. + +To configure Data provider with SQL Query engine, use fluent registration apis as shown below - + ``` + services.UseSchemio(With.Schema(c => new CustomerSchema()) + .AddEngine(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { + Providername = "System.Data.SqlClient", + ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" + }})) + .LogWith(c => new Logger>(c.GetService()))); +``` + +To configure Data provider with Entity Framework Query engine, use fluent registration apis shown as below - + ``` + services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); + + services.AddLogging(); + + services.UseSchemio(With.Schema(c => new CustomerSchema()) + .AddEngine(c => new QueryEngine(c.GetService>())) + .LogWith(c => new Logger>(c.GetService()))); + +``` + +`Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. + +To use Data provider, Inject IDataProvider using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider<>))` + +## Extend Schemio +### Custom Query Engine +To provide custom query engine and query implementations, you need to extend the base interfaces as depicted below +- IQueryEngine interface to implement the custom query engine to be used with schemio. +``` +public interface IQueryEngine + { + /// + /// Detrmines whether an instance of query can be executed with this engine. + /// + /// instance of IQuery. + /// Boolean; True when supported. + bool CanExecute(IQuery query); + + /// + /// Executes a list of queries returning a list of aggregated results. + /// + /// List of IQuery instances. + /// List of query results. Instances of IQueryResult. + IEnumerable Execute(IEnumerable queries); + } +``` +Example Entity Framework implementation is below +``` +public class QueryEngine : IQueryEngine where T : DbContext + { + private readonly IDbContextFactory _dbContextFactory; + + public QueryEngine(IDbContextFactory _dbContextFactory) + { + this._dbContextFactory = _dbContextFactory; + } + + public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; + + public IEnumerable Execute(IEnumerable queries) + { + var output = new List(); + + using (var dbcontext = _dbContextFactory.CreateDbContext()) + { + foreach (var query in queries) + { + var results = ((ISQLQuery)query).Run(dbcontext); + + if (results == null) + continue; + + output.AddRange(results); + } + + return output.ToArray(); + } + } + } +``` +- Provide base implementation supporting IQuery, IRootQuery & IChildQuery interfaces. +- You can implement the parent and child base class implementations to construct for queries to be executed with custom engine implementation above. + +For Parent Query base implementation, see example below. +``` +public abstract class BaseSQLRootQuery + : BaseRootQuery, ISQLQuery + where TQueryParameter : IQueryParameter + where TQueryResult : IQueryResult + { + /// + /// Get query delegate with implementation to return query result. + /// Delegate returns a collection from db. + /// + /// Func> + public abstract IEnumerable Run(DbContext dbContext); + } +``` +For Child Query implementation, see example below. +``` +public abstract class BaseSQLChildQuery + : BaseChildQuery, ISQLQuery + where TQueryParameter : IQueryParameter + where TQueryResult : IQueryResult + { + /// + /// Get query delegate with implementation to return query result. + /// Delegate returns a collection from db. + /// + /// Func> + public abstract IEnumerable Run(DbContext dbContext); + } +``` +### Custom Schema Language +You can provide your own schema language support for use in entity schema definition to map sections of object graph. + +To do this you need to follow the below steps +* Provide entity schema definition with query/transformer pairs using custom schema language paths +* Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. This matcher is used by query builder to pick queries for matched paths against the configured p in Entity schema definition. +``` +public interface ISchemaPathMatcher + { + bool IsMatch(string inputPath, ISchemaPaths configuredPaths); + } +``` +Example implementation of XPath matcher is below. +``` +public class XPathMatcher : ISchemaPathMatcher + { + private static readonly Regex ancestorRegex = new Regex(@"=ancestor::(?'path'.*?)(/@|\[.*\]/@)", RegexOptions.Compiled); + + public bool IsMatch(string inputXPath, ISchemaPaths configuredXPaths) + { + if (inputXPath == null) + return false; + + if (configuredXPaths.Paths.Any(x => inputXPath.ToLower().Contains(x.ToLower()))) + return true; + + if (configuredXPaths.Paths.Any(x => inputXPath.Contains("ancestor::") + && ancestorRegex.Matches(inputXPath).Select(match => match.Groups["path"].Value).Distinct().Any(match => x.EndsWith(match)))) + return true; + + return false; + } + } +``` + From 88853cfda48450a16b33b652d14c0d25f04c108a Mon Sep 17 00:00:00 2001 From: Ninja Date: Sat, 9 Nov 2024 16:07:45 +0000 Subject: [PATCH 34/64] - Update Developer Guide --- DeveloperGuide.md | 111 ++++++++++++++++++++++------------------------ Schemio.sln | 1 + 2 files changed, 53 insertions(+), 59 deletions(-) diff --git a/DeveloperGuide.md b/DeveloperGuide.md index aeb661e..7cb4a12 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -14,7 +14,7 @@ NuGet\Install-Package Schemio.SQL ``` NuGet\Install-Package Schemio.EntityFramework ``` -## ii. Implementation: Usingse Schemio +## ii. Implementation: Using Schemio To use schemio you need to > Step 1 - Setup the entity to be fetched. @@ -131,7 +131,7 @@ As explained above, You can configure a query in `Parent` or `Child` (nested) mo i. Parent Query -To define a `parent` or `root` query which is usually configured at level 1 to query the root entity, derive from `aseRootQuery` +To define a `parent` or `root` query which is usually configured at level 1 to query the root entity, derive from `BaseQuery` * `TQueryParameter` is basically the class that holds the `inputs` required by the root query for execution. It is an implementation of `IQueryParameter` type. * `TQueryResult` is the result that will be returned from executing the root query. It is an implementation of `IQueryResult` type. @@ -142,12 +142,12 @@ In `parent` mode, the query parameter is resolved using the `IDataContext` param > See example `CustomerQuery` implemented to be configured and run in parent mode below. > ``` ->internal class CustomerQuery : BaseRootQuery +>internal class CustomerQuery : BaseQuery > { -> public override void ResolveRootQueryParameter(IDataContext context) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { > // Executes as Parent or Level 1 query. -> // The query parameter is resolved using IDataContext parameter of data provider class. +> // The query parameter is resolved using IDataContext parameter of data provider class. Parent query result will be null. > > var customer = (CustomerContext)context; > QueryParameter = new CustomerParameter @@ -160,7 +160,7 @@ In `parent` mode, the query parameter is resolved using the `IDataContext` param ii. Child Query -To define a `child` or `dependant` query which is usually configured as child at level below the root query to query, derive from `BaseChildQuery` +To define a `child` or `dependant` query which is usually configured as child at level below the root query to query, derive from `BaseQuery` * `TQueryParameter` is basically the class that holds the `inputs` required by the child query for execution. It is an implementation of `IQueryParameter` type. * `TQueryResult` is the result that will be returned by executing the child query. It is an implementation of `IQueryResult` type. @@ -170,9 +170,9 @@ In `child` mode, the query parameter is resolved using the `query result` of the > See example `CustomerCommunicationQuery` implemented to be configured and run as child or nested query to customer query below. Please see `CustomerSchema` definition above for parent/child configuration setup. >``` -> internal class CustomerCommunicationQuery : BaseChildQuery +> internal class CustomerCommunicationQuery : BaseQuery > { -> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { > // Execute as child to customer query. > // The result from parent customer query is used to resolve the query parameter of the nested communication query. @@ -194,16 +194,16 @@ In `child` mode, the query parameter is resolved using the `query result` of the - `Schemio.EntityFramework` - provides implementation of IQueryEngine to execute `Entity Framework` queries. `Query using Schemio.SQL` -The SQL query needs to implement `BaseSQLRootQuery` or `BaseSQLChildQuery` based on parent or child implementation. +The SQL query needs to implement `BaseSQLQuery`. And, requires implementing `public abstract CommandDefinition GetCommandDefinition()` method to return `command definition` for query to be executed with `Dapper` supported QueryEngine. See below example `CustomerQuery` implemented as Root SQL query >``` -> internal class CustomerQuery : BaseSQLRootQuery +> internal class CustomerQuery : BaseSQLQuery > { -> public override void ResolveRootQueryParameter(IDataContext context) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { -> // Executes as root or level 1 query. +> // Executes as root or level 1 query. parent QueryResult should be null. > var customer = (CustomerContext)context.Entity; > QueryParameter = new CustomerParameter > { @@ -226,9 +226,9 @@ See below example `CustomerQuery` implemented as Root SQL query > See below example `CustomerOrderItemsQuery` implemented as child SQL query. >``` ->internal class CustomerOrderItemsQuery : BaseSQLChildQuery +>internal class CustomerOrderItemsQuery : BaseSQLQuery > { -> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { > // Execute as child query to order query taking OrderResult to resolve query parameter. > var ordersResult = (OrderResult)parentQueryResult; @@ -252,16 +252,16 @@ See below example `CustomerOrderItemsQuery` implemented as child SQL query. >``` `Query using Schemio.EntityFramework` -The SQL query needs to implement `BaseSQLRootQuery` or `BaseSQLChildQuery` based on parent or child implementation. +The SQL query needs to implement `BaseSQLQuery`. And, requires implementing `public abstract IEnumerable Run(DbContext dbContext)` method to implement query using `DbContext` using entity framework. See below example `CustomerQuery` implemented as Root Entity framework query >``` -> internal class CustomerQuery : BaseSQLRootQuery +> internal class CustomerQuery : BaseSQLQuery > { -> public override void ResolveRootQueryParameter(IDataContext context) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { -> // Executes as root or level 1 query. +> // Executes as root or level 1 query. parent QueryResult shuld be null. > var customer = (CustomerContext)context.Entity; > QueryParameter = new CustomerParameter > { @@ -285,9 +285,9 @@ See below example `CustomerQuery` implemented as Root Entity framework query > See below example `CustomerOrderItemsQuery` implemented as child Entity framework query. >``` ->internal class CustomerOrderItemsQuery : BaseSQLChildQuery +>internal class CustomerOrderItemsQuery : BaseSQLQuery > { -> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) +> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) > { > // Execute as child query to order query taking OrderResult to resolve query parameter. > var ordersResult = (CustomerOrderResult)parentQueryResult; @@ -383,33 +383,41 @@ var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.Qu ### Using IOC for registrations -With ServiceCollection, you should call the `services.UseSchemio()` method for IoC registration. +#### Registrations -To configure Data provider with SQL Query engine, use fluent registration apis as shown below - - ``` - services.UseSchemio(With.Schema(c => new CustomerSchema()) - .AddEngine(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { - Providername = "System.Data.SqlClient", - ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" - }})) - .LogWith(c => new Logger>(c.GetService()))); +With ServiceCollection, you need to register the below dependencies. ``` - -To configure Data provider with Entity Framework Query engine, use fluent registration apis shown as below - - ``` - services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); - - services.AddLogging(); - - services.UseSchemio(With.Schema(c => new CustomerSchema()) - .AddEngine(c => new QueryEngine(c.GetService>())) - .LogWith(c => new Logger>(c.GetService()))); - + // Register core services + services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); + services.AddTransient(typeof(ITransformExecutor<>), typeof(TransformExecutor<>)); + services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); + services.AddTransient(); + + // Register instance of ISchemaPathMatcher - Json, XPath or Custom. + services.AddTransient(c => new XPathMatcher()); + + // Enable logging + services.AddLogging(); + + //For Dapper SQL engine. + services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { + Providername = "System.Data.SqlClient", + ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" + }}); + + // For entity framework engine. + services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); + services.AddTransient(c => new QueryEngine(c.GetService>()); + + + // Register schema definitions. eg CustomerSchema + services.AddTransient, CustomerSchema>(); ``` `Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. -To use Data provider, Inject IDataProvider using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider<>))` +#### Data Provider (DI) +To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` ## Extend Schemio ### Custom Query Engine @@ -472,23 +480,8 @@ public class QueryEngine : IQueryEngine where T : DbContext For Parent Query base implementation, see example below. ``` -public abstract class BaseSQLRootQuery - : BaseRootQuery, ISQLQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// Func> - public abstract IEnumerable Run(DbContext dbContext); - } -``` -For Child Query implementation, see example below. -``` -public abstract class BaseSQLChildQuery - : BaseChildQuery, ISQLQuery +public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery where TQueryParameter : IQueryParameter where TQueryResult : IQueryResult { @@ -500,6 +493,7 @@ public abstract class BaseSQLChildQuery public abstract IEnumerable Run(DbContext dbContext); } ``` + ### Custom Schema Language You can provide your own schema language support for use in entity schema definition to map sections of object graph. @@ -534,4 +528,3 @@ public class XPathMatcher : ISchemaPathMatcher } } ``` - diff --git a/Schemio.sln b/Schemio.sln index dc87320..79f1429 100644 --- a/Schemio.sln +++ b/Schemio.sln @@ -10,6 +10,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{AF995FEF-BB94-48D0-B02B-6671DA73056B}" ProjectSection(SolutionItems) = preProject .gitignore = .gitignore + DeveloperGuide.md = DeveloperGuide.md LICENSE.md = LICENSE.md README.md = README.md EndProjectSection From 204269174623400812d81f6eaec03c4905722b3e Mon Sep 17 00:00:00 2001 From: Ninja Date: Sat, 9 Nov 2024 16:26:09 +0000 Subject: [PATCH 35/64] - Update Developer Guide --- DeveloperGuide.md | 18 ++++++------------ src/Schemio.Core/IEntitySchema.cs | 2 +- src/Schemio.Core/IEntitySchema1.cs | 6 ------ 3 files changed, 7 insertions(+), 19 deletions(-) delete mode 100644 src/Schemio.Core/IEntitySchema1.cs diff --git a/DeveloperGuide.md b/DeveloperGuide.md index 7cb4a12..5610659 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -129,15 +129,14 @@ QueryEngine is an implementation of `IQueryEngine` to execute queries against a As explained above, You can configure a query in `Parent` or `Child` (nested) mode in nested hierarchies. -i. Parent Query - -To define a `parent` or `root` query which is usually configured at level 1 to query the root entity, derive from `BaseQuery` +To define a `parent` or `child` query, derive from `BaseQuery` * `TQueryParameter` is basically the class that holds the `inputs` required by the root query for execution. It is an implementation of `IQueryParameter` type. * `TQueryResult` is the result that will be returned from executing the root query. It is an implementation of `IQueryResult` type. The query parameter needs to be resolved before executing the query with QueryEngine. +To resolve the query parameter you need to override `ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult)` method -In `parent` mode, the query parameter is resolved using the `IDataContext` parameter passed to data provider class. +i. Parent Query - In `parent` mode, which is usually configured at level 1 to query the root entity, the query parameter is resolved using the `IDataContext` parameter passed to data provider class. `IQueryResult` parameter in ResolveQueryParameter() will be `null`. > See example `CustomerQuery` implemented to be configured and run in parent mode below. @@ -158,15 +157,10 @@ In `parent` mode, the query parameter is resolved using the `IDataContext` param > } >``` -ii. Child Query - -To define a `child` or `dependant` query which is usually configured as child at level below the root query to query, derive from `BaseQuery` -* `TQueryParameter` is basically the class that holds the `inputs` required by the child query for execution. It is an implementation of `IQueryParameter` type. -* `TQueryResult` is the result that will be returned by executing the child query. It is an implementation of `IQueryResult` type. - -Similar to Root query, the query parameter of child query needs to be resolved before executing with QueryEngine. +ii. Child Query - In `child` mode, which is a query configured usually at level below any parent query, the query parameter can be resolved using the `IQueryResult` query result of the `parent` query. +IDataContext parameter passed to data provider class is also available. -In `child` mode, the query parameter is resolved using the `query result` of the `parent` query. You can have a maximum of `5` levels of query nestings. +Note: You can have a maximum of `5` levels of query nestings. > See example `CustomerCommunicationQuery` implemented to be configured and run as child or nested query to customer query below. Please see `CustomerSchema` definition above for parent/child configuration setup. >``` diff --git a/src/Schemio.Core/IEntitySchema.cs b/src/Schemio.Core/IEntitySchema.cs index 11de773..061b3f5 100644 --- a/src/Schemio.Core/IEntitySchema.cs +++ b/src/Schemio.Core/IEntitySchema.cs @@ -4,7 +4,7 @@ namespace Schemio.Core /// Implement to configure schema path mappings for an Entity. /// /// Entity type - public interface IEntitySchema : IEntitySchema where TEntity : IEntity + public interface IEntitySchema where TEntity : IEntity { /// /// Entity schema mappings. diff --git a/src/Schemio.Core/IEntitySchema1.cs b/src/Schemio.Core/IEntitySchema1.cs deleted file mode 100644 index 6bd2ed7..0000000 --- a/src/Schemio.Core/IEntitySchema1.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Schemio.Core -{ - public interface IEntitySchema - { - } -} \ No newline at end of file From 0e55d31191cf1410538c39fe214a909ff5006d3e Mon Sep 17 00:00:00 2001 From: Ninja Date: Wed, 13 Nov 2024 21:53:05 +0000 Subject: [PATCH 36/64] - Checkpoint - Fix Tests --- README.md | 4 +- src/Schemio.Core/Impl/EntityBuilder.cs | 7 +- src/Schemio.Core/Impl/QueryExecutor.cs | 2 +- src/Schemio.EntityFramework/BaseSQLQuery.cs | 9 +- .../Schemio.EntityFramework.Tests/BaseTest.cs | 14 +++ .../E2E.Tests.cs | 106 ++++++++++++++++- .../EntitySchemas/CustomerSchema.cs | 6 +- ...nicationQuery.cs => CommunicationQuery.cs} | 11 +- .../EntitySchemas/Queries/CustomerQuery.cs | 8 +- ...rOrderItemsQuery.cs => OrderItemsQuery.cs} | 12 +- ...{CustomerOrderResult.cs => OrderResult.cs} | 2 +- ...{CustomerOrdersQuery.cs => OrdersQuery.cs} | 13 ++- ...Transform.cs => CommunicationTransform.cs} | 2 +- .../Transforms/CustomerOrderItemsTransform.cs | 28 ----- .../Transforms/CustomerOrdersTransform.cs | 30 ----- .../Transforms/OrderItemsTransform.cs | 31 +++++ .../Transforms/OrdersTransform.cs | 31 +++++ tests/Schemio.SQL.Tests/BaseTest.cs | 15 +++ tests/Schemio.SQL.Tests/E2E.Tests.cs | 109 ++++++++++++++++-- .../EntitySchemas/CustomerSchema.cs | 6 +- ...nicationQuery.cs => CommunicationQuery.cs} | 4 +- .../Queries/CommunicationResult.cs | 3 +- ...rOrderItemsQuery.cs => OrderItemsQuery.cs} | 2 +- .../EntitySchemas/Queries/OrderResult.cs | 2 +- ...{CustomerOrdersQuery.cs => OrdersQuery.cs} | 4 +- .../Transforms/CommunicationTransform.cs | 3 +- .../Transforms/OrdersTransform.cs | 2 +- 27 files changed, 349 insertions(+), 117 deletions(-) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CustomerCommunicationQuery.cs => CommunicationQuery.cs} (77%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CustomerOrderItemsQuery.cs => OrderItemsQuery.cs} (67%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CustomerOrderResult.cs => OrderResult.cs} (84%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CustomerOrdersQuery.cs => OrdersQuery.cs} (67%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/{CustomerCommunicationTransform.cs => CommunicationTransform.cs} (91%) delete mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs delete mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs create mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs create mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs rename tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/{CustomerCommunicationQuery.cs => CommunicationQuery.cs} (88%) rename tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/{CustomerOrderItemsQuery.cs => OrderItemsQuery.cs} (90%) rename tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/{CustomerOrdersQuery.cs => OrdersQuery.cs} (85%) diff --git a/README.md b/README.md index 2d23968..4c3fc13 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@ ## Concept ### What is Schemio? `Schemio` is a data aggregation framework that -- allows fetching `aggregated data` from `heterogeneous` data storages. You could combine queries targetting different data platforms (example. SQL, API, Cache) to return an aggregated data entity. -- allows `conditionally` fetching only `parts` of the data entity. You could retrieve an aggregated data entity with selective sections of its `object graph` populated depending on the context passed with the request. +- allows fetching `aggregated` data from `heterogeneous` data storages. You could combine queries targetting different data platforms (example. `SQL`, `API`, `Cache`) to return an aggregated data `entity`. +- allows `selectively` fetching only `parts` of the aggregated data entity. You could retrieve an aggregated data entity with only `sections` of its `object graph` `populated` with data depending upon the `context` passed with the request. ### When to use Schemio? Schemio is perfect fit for many use cases. Few examples that require the service tier to dynamically fetch aggregated data with high performance, availability and scalability are diff --git a/src/Schemio.Core/Impl/EntityBuilder.cs b/src/Schemio.Core/Impl/EntityBuilder.cs index b799dd0..7c232d1 100644 --- a/src/Schemio.Core/Impl/EntityBuilder.cs +++ b/src/Schemio.Core/Impl/EntityBuilder.cs @@ -39,11 +39,16 @@ public T Build(IDataContext context, IList queryResults) .ToList(); foreach (var queryResult in queryResults) - transformers.Where(transformer => (transformer as ITransformerQueryResult)?.SupportedQueryResult == queryResult.GetType()).ToList() + transformers.Where(transformer => IsMatch(((ITransformerQueryResult)transformer).SupportedQueryResult, queryResult.GetType())).ToList() .ForEach(supportedtransformer => supportedtransformer?.Transform(queryResult, entity)); } return entity; + + static bool IsMatch(Type transformer, Type queryResult) + { + return transformer == queryResult; + } } } } \ No newline at end of file diff --git a/src/Schemio.Core/Impl/QueryExecutor.cs b/src/Schemio.Core/Impl/QueryExecutor.cs index 87c92e0..4991f17 100644 --- a/src/Schemio.Core/Impl/QueryExecutor.cs +++ b/src/Schemio.Core/Impl/QueryExecutor.cs @@ -42,7 +42,7 @@ private static void CacheResults(IDataContext context, List result if (context.Cache == null) return; - foreach (var cacheResult in results.Where(result => result.GetType() + foreach (var cacheResult in results.Where(result => result != null && result.GetType() .GetCustomAttributes(typeof(CacheResultAttribute), false) .Any())) if (!context.Cache.ContainsKey(cacheResult.GetType().Name)) diff --git a/src/Schemio.EntityFramework/BaseSQLQuery.cs b/src/Schemio.EntityFramework/BaseSQLQuery.cs index 029b8a1..7501bf7 100644 --- a/src/Schemio.EntityFramework/BaseSQLQuery.cs +++ b/src/Schemio.EntityFramework/BaseSQLQuery.cs @@ -12,7 +12,12 @@ public abstract class BaseSQLQuery /// Get query delegate with implementation to return query result. /// Delegate returns a collection from db. /// - /// Func> - public abstract Task Run(DbContext dbContext); + /// IQueryResult + public abstract Task Run(DbContext dbContext); + + async Task ISQLQuery.Run(DbContext dbContext) + { + return await Run(dbContext); + } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index 7c77be4..a9dcc68 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -11,6 +11,20 @@ public class BaseTest { protected ServiceProvider _serviceProvider; + protected void AssertAreEqual(Customer expected, Customer actual) + { + var actualCustomer = actual.ToJson(); + var expectedCustomer = expected.ToJson(); + + Console.WriteLine("expected:"); + Console.WriteLine(expectedCustomer); + + Console.WriteLine("actual:"); + Console.WriteLine(actualCustomer); + + Assert.That(actualCustomer, Is.EqualTo(expectedCustomer)); + } + [OneTimeSetUp] public void Setup() { diff --git a/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs b/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs index 5e611c0..48d4f96 100644 --- a/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs +++ b/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs @@ -5,7 +5,7 @@ namespace Schemio.EntityFramework.Tests { - [TestFixture, Ignore("To-Fix-Shortly")] + [TestFixture] public class E2ETests : BaseTest { private IDataProvider _provider; @@ -24,12 +24,83 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() CustomerId = 1 }); - Assert.IsNotNull(customer); - Assert.That("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@gmail.com\",\"Address\":{\"AddressId\":1,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"2021-10-22T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}", Is.EqualTo(customer.ToJson())); + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Communication = new Communication + { + ContactId = 1, + Phone = "0123456789", + Email = "jack.sparrow@gmail.com", + Address = new Address + { + AddressId = 1, + HouseNo = "77", + City = "Wansted", + Region = "Belfast", + PostalCode = "BL34Y56", + Country = "United Kingdom", + } + }, + Orders = [ new Order { + OrderId = 1, + OrderNo = "ZX123VH", + Date = DateTime.Parse("2021-10-22T00:00:00"), + Items = + [ + new OrderItem + { + ItemId = 1, Name = "12 inch Cake", Cost = 30m + }, + new OrderItem + { + ItemId = 2, Name = "20 Cake Candles", Cost = 5m + } + ] + }] + }; + + AssertAreEqual(expected, customer); } [Test] - public void TestDataProviderToFetchEntityWhenPathsNotNull() + public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() + { + var customer = _provider.GetData(new CustomerContext + { + CustomerId = 1, + SchemaPaths = new[] { "Customer/Communication" } + }); + + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Communication = new Communication + { + ContactId = 1, + Phone = "0123456789", + Email = "jack.sparrow@gmail.com", + Address = new Address + { + AddressId = 1, + HouseNo = "77", + City = "Wansted", + Region = "Belfast", + PostalCode = "BL34Y56", + Country = "United Kingdom", + } + } + }; + + AssertAreEqual(expected, customer); + } + + [Test] + public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() { var customer = _provider.GetData(new CustomerContext { @@ -37,8 +108,31 @@ public void TestDataProviderToFetchEntityWhenPathsNotNull() SchemaPaths = new[] { "Customer/orders/order/items/item" } }); - Assert.IsNotNull(customer); - Assert.AreEqual(customer.ToJson(), "{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":null,\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"2021-10-22T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}"); + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Orders = [ new Order + { + OrderId = 1, + OrderNo = "ZX123VH", + Date = DateTime.Parse("2021-10-22T00:00:00"), + Items = + [ + new OrderItem + { + ItemId = 1, Name = "12 inch Cake", Cost = 30m + }, + new OrderItem + { + ItemId = 2, Name = "20 Cake Candles", Cost = 5m + } + ] + }] + }; + + AssertAreEqual(expected, customer); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 48f4494..6ef1d5a 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -12,10 +12,10 @@ public override IEnumerable> GetSchema() return CreateSchema.For() .Map(For.Paths("customer"), customer => customer.Dependents - .Map(For.Paths("customer/communication")) - .Map(For.Paths("customer/orders"), + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents - .Map(For.Paths("customer/orders/order/items"))) + .Map(For.Paths("customer/orders/order/items"))) ).Create(); } } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs similarity index 77% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index 2761d62..bbbbab7 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerCommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { @@ -16,9 +16,9 @@ public override void ResolveQueryParameter(IDataContext context, IQueryResult pa }; } - public override Task Run(DbContext dbContext) + public override async Task Run(DbContext dbContext) { - var result = dbContext.Set() + var result = await dbContext.Set() .Where(p => p.Customer.Id == QueryParameter.CustomerId) .Select(c => new CommunicationResult { @@ -31,9 +31,10 @@ public override Task Run(DbContext dbContext) Region = c.Address.Region, PostalCode = c.Address.PostalCode, Country = c.Address.Country - }).FirstOrDefault(); + }) + .FirstOrDefaultAsync(); - return Task.FromResult((IQueryResult)result); + return result; } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index 0a90b2f..e12f6f4 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -16,9 +16,9 @@ public override void ResolveQueryParameter(IDataContext context, IQueryResult pa }; } - public override Task Run(DbContext dbContext) + public override async Task Run(DbContext dbContext) { - var result = dbContext.Set() + var result = await dbContext.Set() .Where(c => c.Id == QueryParameter.CustomerId) .Select(c => new CustomerResult { @@ -26,9 +26,9 @@ public override Task Run(DbContext dbContext) Name = c.Name, Code = c.Code }) - .FirstOrDefault(); + .FirstOrDefaultAsync(); - return Task.FromResult((IQueryResult)result); + return result; } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs similarity index 67% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index c245074..edadba6 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -4,12 +4,12 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. - var ordersResults = (CollectionResult)parentQueryResult; + var ordersResults = (CollectionResult)parentQueryResult; QueryParameter ??= new OrderItemParameter(); var orderIds = ordersResults?.Select(o => o.OrderId); @@ -17,9 +17,9 @@ public override void ResolveQueryParameter(IDataContext context, IQueryResult pa QueryParameter.OrderIds.AddRange(orderIds); } - public override Task Run(DbContext dbContext) + public override async Task> Run(DbContext dbContext) { - var items = dbContext.Set() + var items = await dbContext.Set() .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) .Select(c => new OrderItemResult { @@ -28,9 +28,9 @@ public override Task Run(DbContext dbContext) Cost = c.Cost, OrderId = c.Order.OrderId }) - .ToList(); + .ToListAsync(); - return Task.FromResult((IQueryResult)new CollectionResult(items)); + return new CollectionResult(items); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs similarity index 84% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs index 65769c5..06ecfec 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs @@ -2,7 +2,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerOrderResult : IQueryResult + public class OrderResult : IQueryResult { public int CustomerId { get; set; } public int OrderId { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs similarity index 67% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index e775e0f..cbbb692 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { @@ -16,19 +16,20 @@ public override void ResolveQueryParameter(IDataContext context, IQueryResult pa }; } - public override Task Run(DbContext dbContext) + public override async Task> Run(DbContext dbContext) { - var items = dbContext.Set() + var items = await dbContext.Set() .Where(p => p.Customer.Id == QueryParameter.CustomerId) - .Select(c => new CustomerOrderResult + .Select(c => new OrderResult { CustomerId = c.CustomerId, OrderId = c.OrderId, Date = c.Date, OrderNo = c.OrderNo - }); + }) + .ToListAsync(); - return Task.FromResult((IQueryResult)new CollectionResult(items)); + return new CollectionResult(items); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs similarity index 91% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs index fd7c1bb..0930475 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerCommunicationTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { - public class CustomerCommunicationTransform : BaseTransformer + public class CommunicationTransform : BaseTransformer { public override void Transform(CommunicationResult queryResult, Customer entity) { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs deleted file mode 100644 index 1f944c1..0000000 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrderItemsTransform.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Schemio.Core; -using Schemio.Core.Helpers; -using Schemio.EntityFramework.Tests.EntitySetup.Entities; -using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; - -namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms -{ - public class CustomerOrderItemsTransform : BaseTransformer - { - public override void Transform(OrderItemResult queryResult, Customer entity) - { - if (queryResult == null || entity?.Orders == null) - return; - - foreach (var order in entity.Orders) - if (order.OrderId == queryResult.OrderId) - { - order.Items = ArrayUtil.EnsureAndResizeArray(order.Items, out var index); - order.Items[index] = new OrderItem - { - ItemId = queryResult.ItemId, - Name = queryResult.Name, - Cost = queryResult.Cost - }; - } - } - } -} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs deleted file mode 100644 index 9996c27..0000000 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerOrdersTransform.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Schemio.Core; -using Schemio.Core.Helpers; -using Schemio.EntityFramework.Tests.EntitySetup.Entities; -using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; - -namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms -{ - public class CustomerOrdersTransform : BaseTransformer - { - public override void Transform(CustomerOrderResult queryResult, Customer entity) - { - if (queryResult == null) - return; - - var customer = entity ?? new Customer(); - - if (customer.Id != queryResult.CustomerId) - return; - - customer.Orders = ArrayUtil.EnsureAndResizeArray(customer.Orders, out var index); - - customer.Orders[index] = new Order - { - Date = queryResult.Date, - OrderId = queryResult.OrderId, - OrderNo = queryResult.OrderNo - }; - } - } -} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs new file mode 100644 index 0000000..6e585ef --- /dev/null +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs @@ -0,0 +1,31 @@ +using Schemio.Core; +using Schemio.Core.Helpers; +using Schemio.EntityFramework.Tests.EntitySetup.Entities; +using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; + +namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms +{ + public class OrderItemsTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer customer) + { + if (collectionResult == null || !collectionResult.Any() || customer.Orders == null) + return; + + foreach (var result in collectionResult) + { + var order = customer.Orders.FirstOrDefault(o => o.OrderId == result.OrderId); + if (order == null) + continue; + + order.Items = ArrayUtil.EnsureAndResizeArray(order.Items, out var index); + order.Items[index] = new OrderItem + { + ItemId = result.ItemId, + Name = result.Name, + Cost = result.Cost + }; + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs new file mode 100644 index 0000000..445576b --- /dev/null +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -0,0 +1,31 @@ +using System.Diagnostics.Contracts; +using Schemio.Core; +using Schemio.Core.Helpers; +using Schemio.EntityFramework.Tests.EntitySetup.Entities; +using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; + +namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms +{ + public class OrdersTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer entity) + { + if (collectionResult == null || !collectionResult.Any()) + return; + + var customer = entity ?? new Customer(); + + customer.Orders = new Order[collectionResult.Count]; + + for (var index = 0; index < collectionResult.Count; index++) + { + customer.Orders[index] = new Order + { + Date = collectionResult[index].Date, + OrderId = collectionResult[index].OrderId, + OrderNo = collectionResult[index].OrderNo + }; + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index a6ae7f3..c62d17a 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -4,6 +4,7 @@ using Schemio.Core; using Schemio.Core.PathMatchers; using Schemio.SQL; +using Schemio.SQL.Tests; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas; @@ -14,6 +15,20 @@ public class BaseTest protected ServiceProvider _serviceProvider; private const string DbProviderName = "System.Data.SQLite"; + protected void AssertAreEqual(Customer expected, Customer actual) + { + var actualCustomer = actual.ToJson(); + var expectedCustomer = expected.ToJson(); + + Console.WriteLine("expected:"); + Console.WriteLine(expectedCustomer); + + Console.WriteLine("actual:"); + Console.WriteLine(actualCustomer); + + Assert.That(actualCustomer, Is.EqualTo(expectedCustomer)); + } + [OneTimeSetUp] public void Setup() { diff --git a/tests/Schemio.SQL.Tests/E2E.Tests.cs b/tests/Schemio.SQL.Tests/E2E.Tests.cs index a73051e..bdf8c1d 100644 --- a/tests/Schemio.SQL.Tests/E2E.Tests.cs +++ b/tests/Schemio.SQL.Tests/E2E.Tests.cs @@ -25,12 +25,49 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() CustomerId = 1 }); - Assert.IsNotNull(customer); - Assert.That(customer.ToJson(), Is.EqualTo("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@gmail.com\",\"Address\":{\"AddressId\":0,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"0001-01-01T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}")); + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Communication = new Communication + { + ContactId = 1, + Phone = "0123456789", + Email = "jack.sparrow@gmail.com", + Address = new Address + { + AddressId = 1, + HouseNo = "77", + City = "Wansted", + Region = "Belfast", + PostalCode = "BL34Y56", + Country = "United Kingdom", + } + }, + Orders = [ new Order { + OrderId = 1, + OrderNo = "ZX123VH", + Date = DateTime.Parse("2021-10-22T00:00:00"), + Items = + [ + new OrderItem + { + ItemId = 1, Name = "12 inch Cake", Cost = 30m + }, + new OrderItem + { + ItemId = 2, Name = "20 Cake Candles", Cost = 5m + } + ] + }] + }; + + AssertAreEqual(expected, customer); } [Test] - public void TestDataProviderToFetchEntityWhenPathsNotNull() + public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() { var customer = _provider.GetData(new CustomerContext { @@ -38,8 +75,65 @@ public void TestDataProviderToFetchEntityWhenPathsNotNull() SchemaPaths = new[] { "Customer/orders/order/items/item" } }); - Assert.IsNotNull(customer); - Assert.That(customer.ToJson(), Is.EqualTo("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":null,\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"0001-01-01T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}")); + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Orders = [ new Order + { + OrderId = 1, + OrderNo = "ZX123VH", + Date = DateTime.Parse("2021-10-22T00:00:00"), + Items = + [ + new OrderItem + { + ItemId = 1, Name = "12 inch Cake", Cost = 30m + }, + new OrderItem + { + ItemId = 2, Name = "20 Cake Candles", Cost = 5m + } + ] + }] + }; + + AssertAreEqual(expected, customer); + } + + [Test] + public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() + { + var customer = _provider.GetData(new CustomerContext + { + CustomerId = 1, + SchemaPaths = new[] { "Customer/Communication" } + }); + + var expected = new Customer + { + Id = 1, + Name = "Jack Sparrow", + Code = "AB123", + Communication = new Communication + { + ContactId = 1, + Phone = "0123456789", + Email = "jack.sparrow@gmail.com", + Address = new Address + { + AddressId = 1, + HouseNo = "77", + City = "Wansted", + Region = "Belfast", + PostalCode = "BL34Y56", + Country = "United Kingdom", + } + } + }; + + AssertAreEqual(expected, customer); } [Test] @@ -50,10 +144,7 @@ public void TestDataProviderToCacheResultForResultsWithAttributeApplied() CustomerId = 1 }); - var customer = ((DataProvider)_provider).GetData(context); - - Assert.IsNotNull(customer); - Assert.That(customer.ToJson(), Is.EqualTo("{\"Id\":1,\"Code\":\"AB123\",\"Name\":\"Jack Sparrow\",\"Communication\":{\"ContactId\":1,\"Phone\":\"0123456789\",\"Email\":\"jack.sparrow@gmail.com\",\"Address\":{\"AddressId\":0,\"HouseNo\":\"77\",\"City\":\"Wansted\",\"Region\":\"Belfast\",\"PostalCode\":\"BL34Y56\",\"Country\":\"United Kingdom\"}},\"Orders\":[{\"OrderId\":1,\"OrderNo\":\"ZX123VH\",\"Date\":\"0001-01-01T00:00:00\",\"Items\":[{\"ItemId\":1,\"Name\":\"12 inch Cake\",\"Cost\":30},{\"ItemId\":2,\"Name\":\"20 Cake Candles\",\"Cost\":5}]}]}")); + ((DataProvider)_provider).GetData(context); Assert.That(context.Cache, Is.Not.Null); Assert.That(context.Cache.Count, Is.EqualTo(1)); diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index e039c96..553d556 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -12,10 +12,10 @@ public override IEnumerable> GetSchema() return CreateSchema.For() .Map(For.Paths("customer"), customer => customer.Dependents - .Map(For.Paths("customer/communication")) - .Map(For.Paths("customer/orders"), + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents - .Map(For.Paths("customer/orders/order/items"))) + .Map(For.Paths("customer/orders/order/items"))) ).Create(); } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs similarity index 88% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index 83ebd33..85ac9f1 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerCommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { @@ -20,7 +20,7 @@ public override Task Run(IDbConnection conn) { return conn.QueryFirstOrDefaultAsync(new CommandDefinition ( - "select c.CommunicationId as Id, " + + "select c.CommunicationId as ContactId, " + "c.Phone as Telephone, " + "c.Email, " + "a.AddressId, " + diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs index f19348b..e89da6f 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs @@ -5,9 +5,10 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries [CacheResult] public class CommunicationResult : IQueryResult { - public int Id { get; set; } + public int ContactId { get; set; } public string Telephone { get; set; } public string Email { get; set; } + public int AddressId { get; set; } public string HouseNo { get; set; } public string City { get; set; } public string Region { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs similarity index 90% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index c2d3b98..a37e4ee 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs index 5cba520..3176222 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs @@ -6,6 +6,6 @@ public class OrderResult : IQueryResult { public int OrderId { get; set; } public string OrderNo { get; set; } - public DateTime Date { get; set; } + public string OrderDate { get; set; } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs similarity index 85% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index 3e4fbf3..bfe1853 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CustomerOrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) { @@ -22,7 +22,7 @@ public override async Task> Run(IDbConnection conn ( "select OrderId, " + "OrderNo, " + - "Date(OrderDate) as Date " + + "OrderDate " + "from TOrder " + $"where customerId={QueryParameter.CustomerId}" )); diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs index 40a8f30..9cd5dca 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs @@ -11,7 +11,7 @@ public override void Transform(CommunicationResult queryResult, Customer entity) var customer = entity ?? new Customer(); customer.Communication = new Communication { - ContactId = queryResult.Id, + ContactId = queryResult.ContactId, Email = queryResult.Email, Phone = queryResult.Telephone }; @@ -19,6 +19,7 @@ public override void Transform(CommunicationResult queryResult, Customer entity) if (queryResult.HouseNo != null) customer.Communication.Address = new Address { + AddressId = queryResult.AddressId, HouseNo = queryResult.HouseNo, City = queryResult.City, Country = queryResult.Country, diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs index 4452dea..fa033d6 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -20,7 +20,7 @@ public override void Transform(CollectionResult collectionResult, C { customer.Orders[index] = new Order { - Date = collectionResult[index].Date, + Date = DateTime.Parse(collectionResult[index].OrderDate), OrderId = collectionResult[index].OrderId, OrderNo = collectionResult[index].OrderNo }; From 74f0808991d5270e852d762dd2a618a3432ab563 Mon Sep 17 00:00:00 2001 From: Ninja Date: Wed, 13 Nov 2024 23:23:45 +0000 Subject: [PATCH 37/64] - Checkpoint : Refactor BaseQuery class. --- src/Schemio.Core/BaseQuery.cs | 19 +++------- src/Schemio.Core/IQuery.cs | 2 +- src/Schemio.Core/Impl/EventSubscriber.cs | 4 +- src/Schemio.Core/Impl/QueryBuilder.cs | 2 +- src/Schemio.EntityFramework/BaseSQLQuery.cs | 29 ++++++++++----- src/Schemio.SQL/BaseSQLQuery.cs | 24 +++++++++--- .../Queries/CustomerCommunicationQuery.cs | 8 +++- .../Queries/CustomerOrderItemsQuery.cs | 8 +++- .../Queries/CustomerOrdersQuery.cs | 13 ++++++- .../EntitySetup/Queries/CustomerQuery.cs | 8 +++- .../Queries/CommunicationQuery.cs | 18 ++------- .../EntitySchemas/Queries/CustomerQuery.cs | 22 +++++------ .../EntitySchemas/Queries/OrderItemsQuery.cs | 37 ++++++++----------- .../EntitySchemas/Queries/OrdersQuery.cs | 20 ++++------ .../Queries/CommunicationQuery.cs | 15 ++------ .../EntitySchemas/Queries/CustomerQuery.cs | 15 ++------ .../EntitySchemas/Queries/OrderItemsQuery.cs | 32 ++++++++-------- .../EntitySchemas/Queries/OrdersQuery.cs | 32 +++++++--------- 18 files changed, 151 insertions(+), 157 deletions(-) diff --git a/src/Schemio.Core/BaseQuery.cs b/src/Schemio.Core/BaseQuery.cs index 4cd8fb3..11fb055 100644 --- a/src/Schemio.Core/BaseQuery.cs +++ b/src/Schemio.Core/BaseQuery.cs @@ -3,17 +3,10 @@ namespace Schemio.Core /// /// Implement this base class to create a data provider query. /// - /// /// - public abstract class BaseQuery : IQuery - where TQueryParameter : IQueryParameter + public abstract class BaseQuery : IQuery where TQueryResult : IQueryResult { - /// - /// Parameter values for query to execute. - /// - protected TQueryParameter QueryParameter; - /// /// Children queries dependent on this query. /// @@ -28,17 +21,17 @@ public Type ResultType } /// - /// Determines whether the parameter for query is resolved. + /// Implement to determine whether the query context is resolved and ready to execute with supported engine. /// - /// - public bool IsContextResolved() => QueryParameter != null; + /// Boolean + public abstract bool IsContextResolved(); /// - /// Implement to resolve query parameter. + /// Implement to resolve query context for execution with supporting query engine. /// /// data context passed to the data provider. /// query result from parent query (when configured as nested query). Can be null. - public abstract void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult); + public abstract void ResolveQuery(IDataContext context, IQueryResult parentQueryResult); /// /// Run query with supporting IQueryEngine instance. diff --git a/src/Schemio.Core/IQuery.cs b/src/Schemio.Core/IQuery.cs index bd6478c..11e548f 100644 --- a/src/Schemio.Core/IQuery.cs +++ b/src/Schemio.Core/IQuery.cs @@ -11,7 +11,7 @@ public interface IQuery : IQueryRunner bool IsContextResolved(); - void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult = null); + void ResolveQuery(IDataContext context, IQueryResult parentQueryResult = null); } public interface IQueryRunner diff --git a/src/Schemio.Core/Impl/EventSubscriber.cs b/src/Schemio.Core/Impl/EventSubscriber.cs index 9390e0a..34a2668 100644 --- a/src/Schemio.Core/Impl/EventSubscriber.cs +++ b/src/Schemio.Core/Impl/EventSubscriber.cs @@ -29,7 +29,7 @@ public void OnEventHandler(IDataContext context, ExecutorResultArgs args) continue; foreach (var query in unresolved.Queries) - query.ResolveQueryParameter(context, queryResult); + query.ResolveQuery(context, queryResult); } } @@ -49,7 +49,7 @@ public void OnEventHandler(IDataContext context, ExecutorResultArgs args) continue; foreach (var query in unresolved.Queries) - query.ResolveQueryParameter(context, queryResult); + query.ResolveQuery(context, queryResult); } } } diff --git a/src/Schemio.Core/Impl/QueryBuilder.cs b/src/Schemio.Core/Impl/QueryBuilder.cs index 90f56f0..1b455ef 100644 --- a/src/Schemio.Core/Impl/QueryBuilder.cs +++ b/src/Schemio.Core/Impl/QueryBuilder.cs @@ -23,7 +23,7 @@ public IQueryList Build(IDataContext context) var queries = GetMappedQueries(mappings, context); foreach (var query in queries.Queries) - query.ResolveQueryParameter(context); + query.ResolveQuery(context); return new QueryList(queries.Queries); } diff --git a/src/Schemio.EntityFramework/BaseSQLQuery.cs b/src/Schemio.EntityFramework/BaseSQLQuery.cs index 7501bf7..eeca8c8 100644 --- a/src/Schemio.EntityFramework/BaseSQLQuery.cs +++ b/src/Schemio.EntityFramework/BaseSQLQuery.cs @@ -3,21 +3,30 @@ namespace Schemio.EntityFramework { - public abstract class BaseSQLQuery - : BaseQuery, ISQLQuery - where TQueryParameter : IQueryParameter + public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery where TQueryResult : IQueryResult { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// IQueryResult - public abstract Task Run(DbContext dbContext); + private Func> QueryDelegate = null; + + public override bool IsContextResolved() => QueryDelegate != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + QueryDelegate = GetQuery(context, parentQueryResult); + } async Task ISQLQuery.Run(DbContext dbContext) { - return await Run(dbContext); + return await QueryDelegate(dbContext); } + + /// + /// Get query delegate to return query result. + /// + /// + /// + /// + protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); } } \ No newline at end of file diff --git a/src/Schemio.SQL/BaseSQLQuery.cs b/src/Schemio.SQL/BaseSQLQuery.cs index 96c29d5..b85111c 100644 --- a/src/Schemio.SQL/BaseSQLQuery.cs +++ b/src/Schemio.SQL/BaseSQLQuery.cs @@ -3,15 +3,29 @@ namespace Schemio.SQL { - public abstract class BaseSQLQuery : BaseQuery, ISQLQuery - where TQueryParameter : IQueryParameter + public abstract class BaseSQLQuery : BaseQuery, ISQLQuery where TQueryResult : IQueryResult { - public abstract Task Run(IDbConnection conn); - async Task ISQLQuery.Run(IDbConnection conn) { - return await Run(conn); + return await QueryDelegate(conn); } + + private Func> QueryDelegate = null; + + public override bool IsContextResolved() => QueryDelegate != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + QueryDelegate = GetQuery(context, parentQueryResult); + } + + /// + /// Get query delegate to return query result. + /// + /// + /// + /// + protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); } } \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs index a478296..2a9c08f 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs @@ -1,8 +1,12 @@ namespace Schemio.Core.Tests.EntitySetup.Queries { - internal class CustomerCommunicationQuery : BaseQuery + internal class CustomerCommunicationQuery : BaseQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + private CustomerParameter QueryParameter; + + public override bool IsContextResolved() => QueryParameter != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs index 1143919..eb49793 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs @@ -1,8 +1,12 @@ namespace Schemio.Core.Tests.EntitySetup.Queries { - internal class CustomerOrderItemsQuery : BaseQuery> + internal class CustomerOrderItemsQuery : BaseQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + private OrderItemParameter QueryParameter; + + public override bool IsContextResolved() => QueryParameter != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. var ordersResult = (OrderCollectionResult)parentQueryResult; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs index 59c5b0c..2c7d9f2 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs @@ -1,10 +1,19 @@ namespace Schemio.Core.Tests.EntitySetup.Queries { - internal class CustomerOrdersQuery : BaseQuery> + internal class CustomerOrdersQuery : BaseQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + private CustomerParameter QueryParameter; + + public override bool IsContextResolved() => QueryParameter != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Does not execute as child to any query. + var customer = (CustomerResult)parentQueryResult; + QueryParameter = new CustomerParameter + { + CustomerId = customer.Id + }; } } } \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs index ad35bb6..743844c 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs @@ -1,8 +1,12 @@ namespace Schemio.Core.Tests.EntitySetup.Queries { - public class CustomerQuery : BaseQuery + public class CustomerQuery : BaseQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + private CustomerParameter QueryParameter; + + public override bool IsContextResolved() => QueryParameter != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index bbbbab7..6f5c92e 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,22 +4,14 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { - // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter - { - CustomerId = customer.Id - }; - } - public override async Task Run(DbContext dbContext) - { - var result = await dbContext.Set() - .Where(p => p.Customer.Id == QueryParameter.CustomerId) + return async dbContext => await dbContext.Set() + .Where(p => p.Customer.Id == customer.Id) .Select(c => new CommunicationResult { Id = c.CommunicationId, @@ -33,8 +25,6 @@ public override async Task Run(DbContext dbContext) Country = c.Address.Country }) .FirstOrDefaultAsync(); - - return result; } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index e12f6f4..65fd283 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -4,22 +4,17 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : BaseSQLQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { - // Executes as root or level 1 query. + // Executes as root or level 1 query. parentQueryResult will be null. var customer = (CustomerContext)context.Entity; - QueryParameter = new CustomerParameter - { - CustomerId = customer.CustomerId - }; - } - public override async Task Run(DbContext dbContext) - { - var result = await dbContext.Set() - .Where(c => c.Id == QueryParameter.CustomerId) + return async dbContext => + { + var result = await dbContext.Set() + .Where(c => c.Id == customer.CustomerId) .Select(c => new CustomerResult { Id = c.Id, @@ -28,7 +23,8 @@ public override async Task Run(DbContext dbContext) }) .FirstOrDefaultAsync(); - return result; + return result; + }; } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index edadba6..8cbf59c 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -4,33 +4,28 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. var ordersResults = (CollectionResult)parentQueryResult; - QueryParameter ??= new OrderItemParameter(); - var orderIds = ordersResults?.Select(o => o.OrderId); - if (orderIds != null) - QueryParameter.OrderIds.AddRange(orderIds); - } - - public override async Task> Run(DbContext dbContext) - { - var items = await dbContext.Set() - .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) - .Select(c => new OrderItemResult - { - ItemId = c.ItemId, - Name = c.Name, - Cost = c.Cost, - OrderId = c.Order.OrderId - }) - .ToListAsync(); + return async dbContext => + { + var items = await dbContext.Set() + .Where(p => ordersResults.Select(o => o.OrderId).Contains(p.Order.OrderId)) + .Select(c => new OrderItemResult + { + ItemId = c.ItemId, + Name = c.Name, + Cost = c.Cost, + OrderId = c.Order.OrderId + }) + .ToListAsync(); - return new CollectionResult(items); + return new CollectionResult(items); + }; } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index cbbb692..96fe6f0 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,22 +4,17 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter - { - CustomerId = customer.Id - }; - } - public override async Task> Run(DbContext dbContext) - { - var items = await dbContext.Set() - .Where(p => p.Customer.Id == QueryParameter.CustomerId) + return async dbContext => + { + var items = await dbContext.Set() + .Where(p => p.Customer.Id == customer.Id) .Select(c => new OrderResult { CustomerId = c.CustomerId, @@ -29,7 +24,8 @@ public override async Task> Run(DbContext dbContex }) .ToListAsync(); - return new CollectionResult(items); + return new CollectionResult(items); + }; } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index 85ac9f1..b5d23c8 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,21 +4,14 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter - { - CustomerId = customer.Id - }; - } - public override Task Run(IDbConnection conn) - { - return conn.QueryFirstOrDefaultAsync(new CommandDefinition + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( "select c.CommunicationId as ContactId, " + "c.Phone as Telephone, " + @@ -31,7 +24,7 @@ public override Task Run(IDbConnection conn) "a.Country " + "from TCommunication c " + "left join TAddress a on a.CommunicationId = c.CommunicationId " + - $"where customerId={QueryParameter.CustomerId}" + $"where customerId={customer.Id}" )); } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index ddefdbc..ba8bdca 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -4,26 +4,19 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : BaseSQLQuery { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; - QueryParameter = new CustomerParameter - { - CustomerId = (int)customer.CustomerId - }; - } - public override Task Run(IDbConnection conn) - { - return conn.QueryFirstOrDefaultAsync(new CommandDefinition + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( "select CustomerId as Id, " + "Customer_Name as Name," + "Customer_Code as Code " + - $"from TCustomer where customerId={QueryParameter.CustomerId}" + $"from TCustomer where customerId={customer.CustomerId}" )); } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index a37e4ee..2ab58a7 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -1,32 +1,30 @@ using System.Data; using Dapper; using Schemio.Core; +using Schemio.Core.Helpers; namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child query to order query taking OrderResult to resolve query parameter. var ordersResult = (CollectionResult)parentQueryResult; - QueryParameter ??= new OrderItemParameter(); - QueryParameter.OrderIds.AddRange(ordersResult.Select(o => o.OrderId)); - } - - public override async Task> Run(IDbConnection conn) - { - var items = await conn.QueryAsync(new CommandDefinition - ( - "select OrderId, " + - "OrderItemId as ItemId, " + - "Name, " + - "Cost " + - $"from TOrderItem where OrderId in ({QueryParameter.ToCsv()})" - )); + return async connection => + { + var items = await connection.QueryAsync(new CommandDefinition + ( + "select OrderId, " + + "OrderItemId as ItemId, " + + "Name, " + + "Cost " + + $"from TOrderItem where OrderId in ({ordersResult.Select(o => o.OrderId).ToCSV()})" + )); - return new CollectionResult(items); + return new CollectionResult(items); + }; } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index bfe1853..eec0892 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,30 +4,26 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { - public override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter - { - CustomerId = customer.Id - }; - } - public override async Task> Run(IDbConnection conn) - { - var items = await conn.QueryAsync(new CommandDefinition - ( - "select OrderId, " + - "OrderNo, " + - "OrderDate " + - "from TOrder " + - $"where customerId={QueryParameter.CustomerId}" - )); + return async connection => + { + var items = await connection.QueryAsync(new CommandDefinition + ( + "select OrderId, " + + "OrderNo, " + + "OrderDate " + + "from TOrder " + + $"where customerId={customer.Id}" + )); - return new CollectionResult(items); + return new CollectionResult(items); + }; } } } \ No newline at end of file From 2492ed21ffdb0b86d98a591e0555c071e6f3a691 Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 14 Nov 2024 00:09:02 +0000 Subject: [PATCH 38/64] - Checkpoint: Add Schemio.API --- Schemio.sln | 7 + src/Schemio.API/BaseWebQuery.cs | 171 ++++++++++++++++++ src/Schemio.API/IWebQuery.cs | 10 + src/Schemio.API/IWebResponse.cs | 9 + src/Schemio.API/QueryEngine.cs | 30 +++ src/Schemio.API/Schemio.API.csproj | 17 ++ src/Schemio.Core/CreateSchema.cs | 4 +- src/Schemio.Core/Helpers/Constraints.cs | 11 ++ src/Schemio.Core/Helpers/JsonExtensions.cs | 11 ++ .../DataProvider.Tests/EntityBuilderTests.cs | 2 +- .../EntitySchemas/CustomerSchema.cs | 2 +- .../Schemio.EntityFramework.Tests/BaseTest.cs | 1 + .../EntitySchemas/CustomerSchema.cs | 2 +- .../Transforms/OrdersTransform.cs | 2 - .../JsonExtensions.cs | 15 -- tests/Schemio.SQL.Tests/BaseTest.cs | 2 +- .../EntitySchemas/CustomerSchema.cs | 2 +- .../Transforms/OrdersTransform.cs | 1 - tests/Schemio.SQL.Tests/JsonExtensions.cs | 15 -- 19 files changed, 274 insertions(+), 40 deletions(-) create mode 100644 src/Schemio.API/BaseWebQuery.cs create mode 100644 src/Schemio.API/IWebQuery.cs create mode 100644 src/Schemio.API/IWebResponse.cs create mode 100644 src/Schemio.API/QueryEngine.cs create mode 100644 src/Schemio.API/Schemio.API.csproj create mode 100644 src/Schemio.Core/Helpers/Constraints.cs create mode 100644 src/Schemio.Core/Helpers/JsonExtensions.cs delete mode 100644 tests/Schemio.EntityFramework.Tests/JsonExtensions.cs delete mode 100644 tests/Schemio.SQL.Tests/JsonExtensions.cs diff --git a/Schemio.sln b/Schemio.sln index 79f1429..cb33b57 100644 --- a/Schemio.sln +++ b/Schemio.sln @@ -36,6 +36,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL", "src\Schemio.SQL\Schemio.SQL.csproj", "{52986844-698F-486B-AEC9-846AAF50CF46}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Schemio.API", "src\Schemio.API\Schemio.API.csproj", "{0C1A05D2-653D-4F88-B397-BA53E0BA7281}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -66,6 +68,10 @@ Global {52986844-698F-486B-AEC9-846AAF50CF46}.Debug|Any CPU.Build.0 = Debug|Any CPU {52986844-698F-486B-AEC9-846AAF50CF46}.Release|Any CPU.ActiveCfg = Release|Any CPU {52986844-698F-486B-AEC9-846AAF50CF46}.Release|Any CPU.Build.0 = Release|Any CPU + {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -78,6 +84,7 @@ Global {4F9B6FE3-CAC4-4594-84AD-98D1ECDE180C} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} {52986844-698F-486B-AEC9-846AAF50CF46} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} + {0C1A05D2-653D-4F88-B397-BA53E0BA7281} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C0FF62D6-1374-4939-A546-432862338528} diff --git a/src/Schemio.API/BaseWebQuery.cs b/src/Schemio.API/BaseWebQuery.cs new file mode 100644 index 0000000..797d3d3 --- /dev/null +++ b/src/Schemio.API/BaseWebQuery.cs @@ -0,0 +1,171 @@ +using Microsoft.Extensions.Logging; +using Schemio.Core; +using Schemio.Core.Helpers; + +namespace Schemio.API +{ + public abstract class BaseWebQuery : BaseQuery, IWebQuery + where TQueryResult : IWebResponse + { + protected Uri BaseAddress; + + protected BaseWebQuery() : this(string.Empty) + { + } + + protected BaseWebQuery(string baseAddress) + { + if (!string.IsNullOrEmpty(baseAddress)) + BaseAddress = new Uri(baseAddress); + } + + private Func UriDelegate = null; + + public override bool IsContextResolved() => UriDelegate != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + UriDelegate = GetUri(context, parentQueryResult); + } + + /// + /// Override to pass custom outgoing headers with the api request. + /// + /// + protected virtual IDictionary GetRequestHeaders() + { + return new Dictionary(); + } + + /// + /// Override to get custom incoming headers with the api response. + /// The headers collection will be present on `IApiResult.Headers` when api response includes any of the headers defined in this method. + /// + /// + protected virtual IEnumerable GetResponseHeaders() + { return []; } + + /// + /// Implement to construct the api web query. + /// + /// Request Context. Always available. + /// Result from parent Query. Only available when configured as nested web query. Else will be null. + /// + protected abstract Func GetUri(IDataContext context, IQueryResult parentApiResult = null); + + async Task IWebQuery.Run(IHttpClientFactory httpClientFactory, ILogger logger) + { + Constraints.NotNull(httpClientFactory); + + logger?.LogInformation($"Run api: {GetType().Name}"); + + var Uri = UriDelegate(); + + if (Uri == null) + return null; + + using (var client = httpClientFactory.CreateClient()) + { + logger?.LogInformation($"Executing web api on thread {Thread.CurrentThread.ManagedThreadId} (task {Task.CurrentId})"); + + try + { + HttpResponseMessage result; + + try + { + if (BaseAddress != null) + client.BaseAddress = BaseAddress; + + var requestHeaders = GetRequestHeaders(); + + if (requestHeaders != null && requestHeaders.Any()) + foreach (var header in requestHeaders) + client.DefaultRequestHeaders.Add(header.Key, header.Value); + + result = await client.GetAsync(Uri); + + var raw = result.Content.ReadAsStringAsync().Result; + + if (!string.IsNullOrWhiteSpace(raw)) + logger?.LogInformation($"Result.Content of executing web api: {Uri.AbsolutePath} is {raw}"); + + if (!result.IsSuccessStatusCode) + { + logger?.LogInformation($"Result of executing web api {Uri.AbsolutePath} is not success status code"); + return null; + } + + if (typeof(TQueryResult).UnderlyingSystemType != null && typeof(TQueryResult).UnderlyingSystemType.Name.Equals(typeof(CollectionResult<>).Name)) + { + var typeArgs = typeof(TQueryResult).GetGenericArguments(); + var arrType = typeArgs[0].MakeArrayType(); + var arrObject = raw.ToObject(arrType); + if (arrObject != null) + { + var resultType = typeof(CollectionResult<>); + var collectionType = resultType.MakeGenericType(typeArgs); + var collectionResult = (TQueryResult)Activator.CreateInstance(collectionType, arrObject); + + SetResponseHeaders(result, collectionResult); + + return collectionResult; + } + } + else + { + var obj = raw.ToObject(typeof(TQueryResult)); + if (obj != null) + { + var resObj = (TQueryResult)obj; + SetResponseHeaders(result, resObj); + return resObj; + } + } + } + catch (TaskCanceledException ex) + { + logger?.LogWarning(ex, $"An error occurred while sending the request. Query URL: {Uri.AbsolutePath}"); + } + catch (HttpRequestException ex) + { + logger?.LogWarning(ex, $"An error occurred while sending the request. Query URL: {Uri.AbsolutePath}"); + } + } + catch (AggregateException ex) + { + logger?.LogInformation($"Web api {GetType().Name} failed"); + foreach (var e in ex.InnerExceptions) + logger?.LogError(e, ""); + } + } + + return null; + } + + private void SetResponseHeaders(HttpResponseMessage response, TQueryResult? result) + { + if (response.Headers == null || result == null) + return; + + var headers = GetResponseHeaders(); + + if (headers != null && headers.Any()) + foreach (var header in headers) + { + if (!response.Headers.Any(r => r.Key == header)) + continue; + + var responseHeader = response.Headers.First(r => r.Key == header); + + var value = responseHeader.Value != null && responseHeader.Value.Any() + ? responseHeader.Value.ElementAt(0) + : string.Empty; + + result.Headers ??= new Dictionary(); + + result.Headers.Add(responseHeader.Key, value); + } + } + } +} \ No newline at end of file diff --git a/src/Schemio.API/IWebQuery.cs b/src/Schemio.API/IWebQuery.cs new file mode 100644 index 0000000..1c50a43 --- /dev/null +++ b/src/Schemio.API/IWebQuery.cs @@ -0,0 +1,10 @@ +using Microsoft.Extensions.Logging; +using Schemio.Core; + +namespace Schemio.API +{ + public interface IWebQuery : IQuery + { + Task Run(IHttpClientFactory httpClientFactory, ILogger logger = null); + } +} \ No newline at end of file diff --git a/src/Schemio.API/IWebResponse.cs b/src/Schemio.API/IWebResponse.cs new file mode 100644 index 0000000..51e9325 --- /dev/null +++ b/src/Schemio.API/IWebResponse.cs @@ -0,0 +1,9 @@ +using Schemio.Core; + +namespace Schemio.API +{ + public interface IWebResponse : IQueryResult + { + IDictionary Headers { get; internal set; } + } +} \ No newline at end of file diff --git a/src/Schemio.API/QueryEngine.cs b/src/Schemio.API/QueryEngine.cs new file mode 100644 index 0000000..2ea14c9 --- /dev/null +++ b/src/Schemio.API/QueryEngine.cs @@ -0,0 +1,30 @@ +using Microsoft.Extensions.Logging; +using Schemio.Core; +using Schemio.Core.Helpers; + +namespace Schemio.API +{ + public class QueryEngine : IQueryEngine + { + private readonly ILogger logger; + private readonly IHttpClientFactory httpClientFactory; + + public QueryEngine(IHttpClientFactory httpClientFactory, ILogger logger = null) + { + this.httpClientFactory = httpClientFactory; + this.logger = logger; + + Constraints.NotNull(httpClientFactory); + } + + public bool CanExecute(IQuery query) => query != null && query is IWebQuery; + + public async Task Execute(IQuery query) + { + if (query == null || !(query is IWebQuery q)) + return null; + + return await q.Run(httpClientFactory, logger); + } + } +} \ No newline at end of file diff --git a/src/Schemio.API/Schemio.API.csproj b/src/Schemio.API/Schemio.API.csproj new file mode 100644 index 0000000..d51b5fc --- /dev/null +++ b/src/Schemio.API/Schemio.API.csproj @@ -0,0 +1,17 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + diff --git a/src/Schemio.Core/CreateSchema.cs b/src/Schemio.Core/CreateSchema.cs index 43e9ff0..8b0b7bc 100644 --- a/src/Schemio.Core/CreateSchema.cs +++ b/src/Schemio.Core/CreateSchema.cs @@ -76,7 +76,7 @@ public IMapOrComplete Map(ISchemaPa public Mappings GetMappings => this; - public IEnumerable> Create() => this; + public IEnumerable> End() => this; } public class Mapping : @@ -125,7 +125,7 @@ public interface IMapOrComplete : IMap> Create(); + IEnumerable> End(); } public interface IWithDependents diff --git a/src/Schemio.Core/Helpers/Constraints.cs b/src/Schemio.Core/Helpers/Constraints.cs new file mode 100644 index 0000000..a6351a1 --- /dev/null +++ b/src/Schemio.Core/Helpers/Constraints.cs @@ -0,0 +1,11 @@ +namespace Schemio.Core.Helpers +{ + public static class Constraints + { + public static void NotNull(this T value) + { + if (value == null) + throw new ArgumentNullException(typeof(T).Name); + } + } +} \ No newline at end of file diff --git a/src/Schemio.Core/Helpers/JsonExtensions.cs b/src/Schemio.Core/Helpers/JsonExtensions.cs new file mode 100644 index 0000000..d841e5e --- /dev/null +++ b/src/Schemio.Core/Helpers/JsonExtensions.cs @@ -0,0 +1,11 @@ +using System.Text.Json; + +namespace Schemio.Core.Helpers +{ + public static class JsonExtensions + { + public static string? ToJson(this object value) => value != null ? JsonSerializer.Serialize(value) : null; + + public static object? ToObject(this string value, Type type) => !string.IsNullOrEmpty(value) ? JsonSerializer.Deserialize(value, type) : null; + } +} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs index 9c8aa10..2a8238d 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs @@ -73,7 +73,7 @@ public override IEnumerable> GetSchema() .Map>(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents .Map>(For.Paths("customer/orders/order/items"))) - ).Create(); + ).End(); } } } diff --git a/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 80e0148..a094b45 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -15,7 +15,7 @@ public override IEnumerable> GetSchema() .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents .Map(For.Paths("customer/orders/order/items"))) - ).Create(); + ).End(); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index a9dcc68..b5f1dd2 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Schemio.Core; +using Schemio.Core.Helpers; using Schemio.Core.PathMatchers; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 6ef1d5a..067e327 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -16,7 +16,7 @@ public override IEnumerable> GetSchema() .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents .Map(For.Paths("customer/orders/order/items"))) - ).Create(); + ).End(); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs index 445576b..cb4df27 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -1,6 +1,4 @@ -using System.Diagnostics.Contracts; using Schemio.Core; -using Schemio.Core.Helpers; using Schemio.EntityFramework.Tests.EntitySetup.Entities; using Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries; diff --git a/tests/Schemio.EntityFramework.Tests/JsonExtensions.cs b/tests/Schemio.EntityFramework.Tests/JsonExtensions.cs deleted file mode 100644 index c255245..0000000 --- a/tests/Schemio.EntityFramework.Tests/JsonExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Text.Json; - -namespace Schemio.EntityFramework.Tests -{ - public static class JsonExtensions - { - public static string ToJson(this T obj) - { - if (obj == null) - throw new ArgumentNullException(nameof(obj)); - - return JsonSerializer.Serialize(obj); - } - } -} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index c62d17a..470a766 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -2,9 +2,9 @@ using Microsoft.Data.Sqlite; using Microsoft.Extensions.DependencyInjection; using Schemio.Core; +using Schemio.Core.Helpers; using Schemio.Core.PathMatchers; using Schemio.SQL; -using Schemio.SQL.Tests; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas; diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs index 553d556..85fa6e5 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs @@ -16,7 +16,7 @@ public override IEnumerable> GetSchema() .Map(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents .Map(For.Paths("customer/orders/order/items"))) - ).Create(); + ).End(); } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs index fa033d6..c9a2615 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -1,5 +1,4 @@ using Schemio.Core; -using Schemio.Core.Helpers; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; diff --git a/tests/Schemio.SQL.Tests/JsonExtensions.cs b/tests/Schemio.SQL.Tests/JsonExtensions.cs deleted file mode 100644 index 656f17e..0000000 --- a/tests/Schemio.SQL.Tests/JsonExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Text.Json; - -namespace Schemio.SQL.Tests -{ - public static class JsonExtensions - { - public static string ToJson(this T obj) - { - if (obj == null) - throw new ArgumentNullException(nameof(obj)); - - return JsonSerializer.Serialize(obj); - } - } -} \ No newline at end of file From 966219a8d4b8c1171ecb716e7be97e647a1c5441 Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 14 Nov 2024 21:19:27 +0000 Subject: [PATCH 39/64] - Checkpoint: Readme Partial Update --- Developer Guide.md | 480 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 480 insertions(+) create mode 100644 Developer Guide.md diff --git a/Developer Guide.md b/Developer Guide.md new file mode 100644 index 0000000..65ef710 --- /dev/null +++ b/Developer Guide.md @@ -0,0 +1,480 @@ +# Developer Guide + +## i. Installation + +`Schemio` allows you to aggregate data from heterogeneous data stores offering `SQL` & `API` packages out of the box below. SQL queries are supported by `Dapper` and `EntityFramework` engines. You could also `extend` Schemio to provide your own implementation(s) of `Query` and supporting `Query Engine` to retrieve data from `custom` data store(s). + +Below are the Nuget packages available. + +`Scemio.Core` - Install to extend schemio to implement `custom` querying engine. +``` +NuGet\Install-Package Schemio.Core +``` +`Schemio.SQL` - Install when you would like to include SQL `Dapper` queries to access SQL database. +``` +NuGet\Install-Package Schemio.SQL +``` +`Schemio.EntityFramework` - Install when you would like to include SQL `EntityFramework` queries to access SQL database. +``` +NuGet\Install-Package Schemio.EntityFramework +``` +`Schemio.Api` - Install when you would like to include web api queries with `HttpClient` query engine. +``` +NuGet\Install-Package Schemio.Api +``` +## ii. Implementation: Using Schemio + +To use **Schemio** you need to do the below steps +- **Step 1**: Define the aggregated `Entity`. +- **Step 2**: Setup the aggregate `Configuration` comprising of `Query`/`Transformer` hierarchical nested mappings. +- **Step 3**: Construct the `DataProvider` with required dependencies. + +### Step 1. Define Aggregate Entity. +To create an aggregate `Entity`, implement the class from `IEntity` interface. This is the entity that will be returned as aggregated result from multiple queries assembled to execute against homogeneous or heterogeneous data storage's. + +Below is an example `Customer` entity. + +``` +public class Customer : IEntity +{ + public int CustomerId { get; set; } + public string CustomerCode { get; set; } + public string CustomerName { get; set; } + public Communication Communication { get; set; } + public Order[] Orders { get; set; } +} +``` + +For the customer class, we can see there are three levels of nesting in the object graph. +- Level 1 with paths: `Customer` +- Level 2 with paths: `Customer.Communication` and `Customer.Orders` +- Level 3 with paths: `Customer.Orders.Items` + +If we choose XML Schema Definition (XSD) for the Customer entity then XPaths for nesting levels should be. +``` +- Level 1 with XPath: Customer +- Level 2 with XPaths: Customer/Communication and Customer/Orders +- Level 3 with XPath: Customer/Orders/Order/Items/Item +``` +### Step 2: Setup Entity Aggregate Configuration +To define `Entity Aggregate`, derive from `EntityAggregate` class where `TEntity` is aggregate entity in context (ie. `IEntity`). + +The `Entity Aggregate` is basically a configuration with `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. +* `Query` is an implementation to `fetch` data for mapped sections of object graph. +* `Transformer` is an implementation to `map` data fetched by the associated query to the relevant sections of the entity's object graph. + +Below is an example Entity Aggregate Configuration for the Customer Entity. + +``` +internal class CustomerAggregate : EntityAggregate +{ + public override IEnumerable> GetSchema() + { + return CreateSchema.For() + .Map(For.Paths("customer"), + customer => customer.Dependents + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), + customerOrders => customerOrders.Dependents + .Map(For.Paths("customer/orders/order/items")))) + .End(); + } +} +``` +`CustomerAggregate` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. +`XPaths` are used to identify the schema paths in the object graph. Alternately, you could use your own representation to name the pairs or map the object graph. However, you would need to provide the `ISchemaPathmatcher` implementation to managing path matching. + +#### i. Query/Transformer Mapping +Every `Query` type in the `EntityAggregate` definition should have a complementing `Transformer` type. +You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. + +Below is the snippet from `CustomerAggregate` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. +``` + .Map(For.Paths("customer")) +``` + +#### ii. Nested Query/Transformer Mappings +You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query context. + +The query/transformer mappings can be `nested` to `5` levels down. + +Below is snippet to show nesting of `CommunicationQuery` as child to `CustomerQuery`. +``` +.Map(For.Paths("customer"), -- Parent + customer => customer.Dependents + .Map(For.Paths("customer/communication")) -- Child +``` + +Execution Flow +* In parent/child hierarchy, the first parent query executes first, followed by its immediate children. The execution flows in sequence to the last child query in order of its nesting. +* While executing the output of the parent is passed in to the child query to resolve query context and get it ready for execution. +* Transformers are also executed in the same sequence to map data to the Aggregate Entity. +* When a query path for nested query is included for execution, all the parent queries involved in that object graph get included for execution in order of its nesting. + +Please see the execution sequence below for queries and transformers nested in `CustomerAggregate` implemented above. + +image + +#### iii. Query Class +`Query` - The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. + +`QueryEngine` is an implementation of `IQueryEngine` to execute queries with supported data storage to return query result (ie. Result instance of `IQueryResult`). + +Depending on the Nuget package(s) installed, you could implement `SQL` and `API` queries. +* `SQL` queries execute to get data from SQL database using `Dapper` or `EntityFramework` engines. +* `API` query executes web api to call an `endpoint` using `HTTPClient` supported engine to get data. + +**Important**: You can combine heterogeneous queries in the Entity Aggregate configuration to target various data stores. + +Example of SQL & API queries are below. +You need to override the `GetQuery(IDataContext context, IQueryResult parentQueryResult)` method to return query delegate (package specific implementation). +* `IDataContext` is the context parameter passed to DataProvider to get aggregated results (. Aggregated Entity). This parameter is always available for both parent and child queries. +* `IQueryResult` parameter is only available when query is configured in child mode, else will be null. + +##### `Schemio.SQL` - with `Dapper` Query implementation. + +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseSQLQuery +{ + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. + var customer = (CustomerContext)context.Entity; + + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition + ( + "select CustomerId as Id, " + + "Customer_Name as Name," + + "Customer_Code as Code " + + $"from TCustomer where customerId={customer.CustomerId}" + )); + } +} +``` +2. Example Child Query - OrdersQuery +``` +internal class OrdersQuery : BaseSQLQuery> +{ + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer query. + var customer = (CustomerResult)parentQueryResult; + + return async connection => + { + var items = await connection.QueryAsync(new CommandDefinition + ( + "select OrderId, " + + "OrderNo, " + + "OrderDate " + + "from TOrder " + + $"where customerId={customer.Id}" + )); + + return new CollectionResult(items); + }; + } +} +``` + +##### `Schemio.EntityFramework` - with `EntityFramework` Query implementation + +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseSQLQuery +{ + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. parentQueryResult will be null. + var customer = (CustomerContext)context.Entity; + + return async dbContext => + { + var result = await dbContext.Set() + .Where(c => c.Id == customer.CustomerId) + .Select(c => new CustomerResult + { + Id = c.Id, + Name = c.Name, + Code = c.Code + }) + .FirstOrDefaultAsync(); + + return result; + }; + } +} +``` +2. Example Child Query - OrdersQuery +``` + internal class OrdersQuery : BaseSQLQuery> + { + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer query. + var customer = (CustomerResult)parentQueryResult; + + return async dbContext => + { + var items = await dbContext.Set() + .Where(p => p.Customer.Id == customer.Id) + .Select(c => new OrderResult + { + CustomerId = c.CustomerId, + OrderId = c.OrderId, + Date = c.Date, + OrderNo = c.OrderNo + }) + .ToListAsync(); + + return new CollectionResult(items); + }; + } + } +``` +##### `Schemio.Api` - with `HttpClient` Query implementation +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseApiQuery +{ + public CustomerQuery() : base(Endpoints.BaseAddress) + { + } + protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. + var customer = (CustomerContext)context.Entity; + + return ()=> new Uri(string.Format($"v2/customers/{customer.CustomerId}); + } +} +``` +2. Example Child Query - OrdersQuery +``` +internal class OrdersQuery : BaseApiQuery> +{ + public OrdersQuery() : base(Endpoints.BaseAddress) + { + } + protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer api. + var customer = (CustomerResult)parentApiResult; + + return ()=> new Uri(string.Format($"v2/customers/{customer.Id}/orders); + } +} +``` + +#### iv. Transformer Class +The purpose of the transformer class is to transform the data fetched by the linked query class and map to the configured object graph of the entity. + +To define a transformer class, you need to implement `BaseTransformer` +- where TEntity is Aggregate Entity implementing `IEntity`. eg. Customer. +- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. + +Example transformer - Customer Transformer +``` +internal class CustomerTransform : BaseTransformer +{ + public override Customer Transform(CustomerResult queryResult, Customer entity) + { + var customer = entity ?? new Customer(); + customer.CustomerId = queryResult.Id; + customer.CustomerName = queryResult.CustomerName; + customer.CustomerCode = queryResult.CustomerCode; + return customer; + } +} +``` + +**Note**: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. + +For the example query/transformer mapping +``` +.Map(For.Paths("customer/communication")) +``` +The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. + +### Step 3. DataProvider Setup +Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. + +- `ILogger>` - logger implementation. default no logger. +- `IEntityAggrgate` - mandatory entity schema definition for entity's object graph. +- `IQueryEngine` - implementation of query engines to execute queries (of type IQuery) with supported data storage's. Can configure multiples. +- `ISchemaPathMatcher` - implementation of schema path matcher. Provide custom implementation when required to use custom schema paths with entity aggregate configuration. + +Example constructors: + +i. With `EntitySchema` and `QueryEngine` implementations. + +``` + public DataProvider(IEntitySchema entitySchema, params IQueryEngine[] queryEngines) +``` +ii. With `Logger`, `EntitySchema`, `QueryEngine`, and `SchemaPathmMatcher` for custom schema paths mapping in entity schema definition. +``` + public DataProvider(ILogger> logger, IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) + +``` +#### Schemio.SQL +Construct DataProvider using `Schemio.SQL.QueryEngine` query engine. + +``` +var provider = new DataProvider(new CustomerSchema(), new Schemio.SQL.QueryEngine(new SQLConfiguration())); +``` + +#### Schemio.EntityFramework +Construct DataProvider using `Schemio.EntityFramework.QueryEngine` query engine. + +``` +var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.QueryEngine()); +``` + +### Using IOC for registrations + +#### Registrations + +With ServiceCollection, you need to register the below dependencies. +``` + // Register core services + services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); + services.AddTransient(typeof(ITransformExecutor<>), typeof(TransformExecutor<>)); + services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); + services.AddTransient(); + + // Register instance of ISchemaPathMatcher - Json, XPath or Custom. + services.AddTransient(c => new XPathMatcher()); + + // Enable logging + services.AddLogging(); + + //For Dapper SQL engine. + services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { + Providername = "System.Data.SqlClient", + ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" + }}); + + // For entity framework engine. + services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); + services.AddTransient(c => new QueryEngine(c.GetService>()); + + + // Register schema definitions. eg CustomerSchema + services.AddTransient, CustomerSchema>(); +``` + +`Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. + +#### Data Provider (DI) +To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` + +## Extend Schemio +### Custom Query Engine +To provide custom query engine and query implementations, you need to extend the base interfaces as depicted below +- IQueryEngine interface to implement the custom query engine to be used with schemio. +``` +public interface IQueryEngine +{ + /// + /// Detrmines whether an instance of query can be executed with this engine. + /// + /// instance of IQuery. + /// Boolean; True when supported. + bool CanExecute(IQuery query); + + /// + /// Executes a list of queries returning a list of aggregated results. + /// + /// List of IQuery instances. + /// List of query results. Instances of IQueryResult. + IEnumerable Execute(IEnumerable queries); +} +``` +Example Entity Framework implementation is below +``` +public class QueryEngine : IQueryEngine where T : DbContext + { + private readonly IDbContextFactory _dbContextFactory; + + public QueryEngine(IDbContextFactory _dbContextFactory) + { + this._dbContextFactory = _dbContextFactory; + } + + public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; + + public IEnumerable Execute(IEnumerable queries) + { + var output = new List(); + + using (var dbcontext = _dbContextFactory.CreateDbContext()) + { + foreach (var query in queries) + { + var results = ((ISQLQuery)query).Run(dbcontext); + + if (results == null) + continue; + + output.AddRange(results); + } + + return output.ToArray(); + } + } + } +``` +- Provide base implementation supporting IQuery, IRootQuery & IChildQuery interfaces. +- You can implement the parent and child base class implementations to construct for queries to be executed with custom engine implementation above. + +For Parent Query base implementation, see example below. +``` +public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery + where TQueryParameter : IQueryParameter + where TQueryResult : IQueryResult + { + /// + /// Get query delegate with implementation to return query result. + /// Delegate returns a collection from db. + /// + /// Func> + public abstract IEnumerable Run(DbContext dbContext); + } +``` + +### Custom Schema Language +You can provide your own schema language support for use in entity schema definition to map sections of object graph. + +To do this you need to follow the below steps +* Provide entity schema definition with query/transformer pairs using custom schema language paths +* Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. This matcher is used by query builder to pick queries for matched paths against the configured p in Entity schema definition. +``` +public interface ISchemaPathMatcher + { + bool IsMatch(string inputPath, ISchemaPaths configuredPaths); + } +``` +Example implementation of XPath matcher is below. +``` +public class XPathMatcher : ISchemaPathMatcher + { + private static readonly Regex ancestorRegex = new Regex(@"=ancestor::(?'path'.*?)(/@|\[.*\]/@)", RegexOptions.Compiled); + + public bool IsMatch(string inputXPath, ISchemaPaths configuredXPaths) + { + if (inputXPath == null) + return false; + + if (configuredXPaths.Paths.Any(x => inputXPath.ToLower().Contains(x.ToLower()))) + return true; + + if (configuredXPaths.Paths.Any(x => inputXPath.Contains("ancestor::") + && ancestorRegex.Matches(inputXPath).Select(match => match.Groups["path"].Value).Distinct().Any(match => x.EndsWith(match)))) + return true; + + return false; + } + } +``` \ No newline at end of file From e3dfd0da8b9a0428e9954d1e19263f22046433eb Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Thu, 14 Nov 2024 11:46:37 +0000 Subject: [PATCH 40/64] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4c3fc13..da9e860 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ | Schemio.Core|[![NuGet version](https://badge.fury.io/nu/Schemio.Core.svg)](https://badge.fury.io/nu/Schemio.Core) | Provides `core` functionality to configure nested queries and transformers. With ability to map schema paths (XPath/JSONPath) to entity's object graph. `No QueryEngine` provided and requires implementing IQueryEngine to execute IQuery instances. | | Schemio.SQL|[![NuGet version](https://badge.fury.io/nu/Schemio.SQL.svg)](https://badge.fury.io/nu/Schemio.SQL)| Provides schemio with query engine using `Dapper` to execute SQL queries. | | Schemio.EntityFramework|[![NuGet version](https://badge.fury.io/nu/Schemio.EntityFramework.svg)](https://badge.fury.io/nu/Schemio.EntityFramework)| Provides schemio with `Entity Framework` query engine to execute queries using DbContext. | +| Schemio.Api|[![NuGet version](https://badge.fury.io/nu/Schemio.Api.svg)](https://badge.fury.io/nu/Schemio.Api)| Provides schemio with `Web Api` query engine to execute apis using HttpClient. | ## Concept ### What is Schemio? From f93f867222641b13984b0e712683c46b9a0444eb Mon Sep 17 00:00:00 2001 From: Ninja Date: Mon, 18 Nov 2024 22:59:18 +0000 Subject: [PATCH 41/64] - Checkpoint: Periodic code checkin --- Developer Guide.md | 267 +++++++++++------- src/Schemio.API/BaseWebQuery.cs | 4 +- src/Schemio.Core/CollectionResult.cs | 4 + ...EntitySchema.cs => EntityConfiguration.cs} | 4 +- ...ntitySchema.cs => IEntityConfiguration.cs} | 2 +- src/Schemio.Core/IQuery.cs | 5 - src/Schemio.Core/IQueryRunner.cs | 7 + src/Schemio.Core/Impl/DataProvider.cs | 4 +- src/Schemio.Core/Impl/EntityBuilder.cs | 4 +- src/Schemio.Core/Impl/QueryBuilder.cs | 4 +- src/Schemio.Core/ServicesExtensions.cs | 82 +++++- .../DataProvider.Tests/EntityBuilderTests.cs | 30 +- .../DataProvider.Tests/QueryBuilderTests.cs | 20 +- .../DataProvider.Tests/QueryExecutorTests.cs | 6 +- .../Configuration/CustomerConfiguration.cs | 21 ++ .../Queries/CommunicationQuery.cs} | 10 +- .../Queries/CommunicationRecord.cs} | 4 +- .../Queries/CustomerQuery.cs | 10 +- .../Queries/CustomerRecord.cs} | 4 +- .../Configuration/Queries/OrderItemRecord.cs | 8 + .../Configuration/Queries/OrderItemsQuery.cs | 19 ++ .../Configuration/Queries/OrderRecord.cs | 9 + .../Queries/OrdersQuery.cs} | 10 +- .../Transforms/CommunicationTransform.cs} | 8 +- .../Transforms/CustomerTransform.cs | 8 +- .../Transforms/OrderItemsTransform.cs} | 8 +- .../Transforms/OrdersTransform.cs} | 8 +- .../EntitySchemas/CustomerSchema.cs | 21 -- .../Queries/CustomerOrderItemsQuery.cs | 19 -- .../EntitySetup/Queries/CustomerParameter.cs | 7 - .../Queries/OrderCollectionResult.cs | 15 - .../Queries/OrderItemCollectionResult.cs | 13 - .../EntitySetup/Queries/OrderItemParameter.cs | 7 - tests/Schemio.Core.Tests/UnitTest1.cs | 16 -- .../Schemio.EntityFramework.Tests/BaseTest.cs | 11 +- ...omerSchema.cs => CustomerConfiguration.cs} | 2 +- .../Queries/CommunicationQuery.cs | 8 +- ...cationResult.cs => CommunicationRecord.cs} | 2 +- .../Queries/CustomerParameter.cs | 9 - .../EntitySchemas/Queries/CustomerQuery.cs | 6 +- .../{CustomerResult.cs => CustomerRecord.cs} | 2 +- .../Queries/OrderItemParameter.cs | 20 -- ...{OrderItemResult.cs => OrderItemRecord.cs} | 2 +- .../EntitySchemas/Queries/OrderItemsQuery.cs | 10 +- .../{OrderResult.cs => OrderRecord.cs} | 2 +- .../EntitySchemas/Queries/OrdersQuery.cs | 10 +- .../Transforms/CommunicationTransform.cs | 4 +- .../Transforms/CustomerTransform.cs | 4 +- .../Transforms/OrderItemsTransform.cs | 4 +- .../Transforms/OrdersTransform.cs | 4 +- tests/Schemio.SQL.Tests/BaseTest.cs | 10 +- .../CustomerConfiguration.cs} | 2 +- .../Queries/CommunicationQuery.cs | 8 +- .../Queries/CommunicationRecord.cs} | 2 +- .../Queries/CustomerQuery.cs | 6 +- .../Queries/CustomerRecord.cs} | 2 +- .../Queries/OrderItemRecord.cs} | 2 +- .../Queries/OrderItemsQuery.cs | 10 +- .../Queries/OrderRecord.cs} | 2 +- .../Queries/OrdersQuery.cs | 10 +- .../Transforms/CommunicationTransform.cs | 4 +- .../Transforms/CustomerTransform.cs | 4 +- .../Transforms/OrderItemsTransform.cs | 4 +- .../Transforms/OrdersTransform.cs | 4 +- .../Queries/CustomerParameter.cs | 9 - .../Queries/OrderItemParameter.cs | 20 -- 66 files changed, 467 insertions(+), 400 deletions(-) rename src/Schemio.Core/{BaseEntitySchema.cs => EntityConfiguration.cs} (80%) rename src/Schemio.Core/{IEntitySchema.cs => IEntityConfiguration.cs} (82%) create mode 100644 src/Schemio.Core/IQueryRunner.cs create mode 100644 tests/Schemio.Core.Tests/EntitySetup/Configuration/CustomerConfiguration.cs rename tests/Schemio.Core.Tests/EntitySetup/{Queries/CustomerCommunicationQuery.cs => Configuration/Queries/CommunicationQuery.cs} (53%) rename tests/Schemio.Core.Tests/EntitySetup/{Queries/CommunicationResult.cs => Configuration/Queries/CommunicationRecord.cs} (75%) rename tests/Schemio.Core.Tests/EntitySetup/{ => Configuration}/Queries/CustomerQuery.cs (57%) rename tests/Schemio.Core.Tests/EntitySetup/{Queries/CustomerResult.cs => Configuration/Queries/CustomerRecord.cs} (57%) create mode 100644 tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemRecord.cs create mode 100644 tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemsQuery.cs create mode 100644 tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderRecord.cs rename tests/Schemio.Core.Tests/EntitySetup/{Queries/CustomerOrdersQuery.cs => Configuration/Queries/OrdersQuery.cs} (53%) rename tests/Schemio.Core.Tests/EntitySetup/{Transforms/CustomerCommunicationTransform.cs => Configuration/Transforms/CommunicationTransform.cs} (73%) rename tests/Schemio.Core.Tests/EntitySetup/{ => Configuration}/Transforms/CustomerTransform.cs (53%) rename tests/Schemio.Core.Tests/EntitySetup/{Transforms/CustomerOrderItemsTransform.cs => Configuration/Transforms/OrderItemsTransform.cs} (72%) rename tests/Schemio.Core.Tests/EntitySetup/{Transforms/CustomerOrdersTransform.cs => Configuration/Transforms/OrdersTransform.cs} (56%) delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs delete mode 100644 tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs delete mode 100644 tests/Schemio.Core.Tests/UnitTest1.cs rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/{CustomerSchema.cs => CustomerConfiguration.cs} (93%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CommunicationResult.cs => CommunicationRecord.cs} (90%) delete mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{CustomerResult.cs => CustomerRecord.cs} (82%) delete mode 100644 tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{OrderItemResult.cs => OrderItemRecord.cs} (85%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/{OrderResult.cs => OrderRecord.cs} (86%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas/CustomerSchema.cs => EntityConfiguration/CustomerConfiguration.cs} (92%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Queries/CommunicationQuery.cs (84%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas/Queries/CommunicationResult.cs => EntityConfiguration/Queries/CommunicationRecord.cs} (90%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Queries/CustomerQuery.cs (71%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas/Queries/CustomerResult.cs => EntityConfiguration/Queries/CustomerRecord.cs} (82%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas/Queries/OrderItemResult.cs => EntityConfiguration/Queries/OrderItemRecord.cs} (84%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Queries/OrderItemsQuery.cs (79%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas/Queries/OrderResult.cs => EntityConfiguration/Queries/OrderRecord.cs} (83%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Queries/OrdersQuery.cs (69%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Transforms/CommunicationTransform.cs (92%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Transforms/CustomerTransform.cs (75%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Transforms/OrderItemsTransform.cs (92%) rename tests/Schemio.SQL.Tests/EntitySetup/{EntitySchemas => EntityConfiguration}/Transforms/OrdersTransform.cs (87%) delete mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs delete mode 100644 tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs diff --git a/Developer Guide.md b/Developer Guide.md index 65ef710..db3535a 100644 --- a/Developer Guide.md +++ b/Developer Guide.md @@ -57,16 +57,16 @@ If we choose XML Schema Definition (XSD) for the Customer entity then XPaths for - Level 3 with XPath: Customer/Orders/Order/Items/Item ``` ### Step 2: Setup Entity Aggregate Configuration -To define `Entity Aggregate`, derive from `EntityAggregate` class where `TEntity` is aggregate entity in context (ie. `IEntity`). +To define `Entity Configuration`, derive from `EntityConfiguration` class where `TEntity` is aggregate entity in context (ie. `IEntity`). -The `Entity Aggregate` is basically a configuration with `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. +The `Entity Configuration` is basically `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. * `Query` is an implementation to `fetch` data for mapped sections of object graph. * `Transformer` is an implementation to `map` data fetched by the associated query to the relevant sections of the entity's object graph. -Below is an example Entity Aggregate Configuration for the Customer Entity. +Below is an example Entity Configuration for the Customer Entity. ``` -internal class CustomerAggregate : EntityAggregate +internal class CustomerConfiguration : EntityConfiguration { public override IEnumerable> GetSchema() { @@ -81,14 +81,14 @@ internal class CustomerAggregate : EntityAggregate } } ``` -`CustomerAggregate` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. +`CustomerConfiguration` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. `XPaths` are used to identify the schema paths in the object graph. Alternately, you could use your own representation to name the pairs or map the object graph. However, you would need to provide the `ISchemaPathmatcher` implementation to managing path matching. #### i. Query/Transformer Mapping -Every `Query` type in the `EntityAggregate` definition should have a complementing `Transformer` type. +Every `Query` type in the Entity `Configuration` definition should have a complementing `Transformer` type. You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. -Below is the snippet from `CustomerAggregate` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. +Below is the snippet from `CustomerConfiguration` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. ``` .Map(For.Paths("customer")) ``` @@ -111,7 +111,7 @@ Execution Flow * Transformers are also executed in the same sequence to map data to the Aggregate Entity. * When a query path for nested query is included for execution, all the parent queries involved in that object graph get included for execution in order of its nesting. -Please see the execution sequence below for queries and transformers nested in `CustomerAggregate` implemented above. +Please see the execution sequence below for queries and transformers nested in `CustomerConfiguration` implemented above. image @@ -124,7 +124,7 @@ Depending on the Nuget package(s) installed, you could implement `SQL` and `API` * `SQL` queries execute to get data from SQL database using `Dapper` or `EntityFramework` engines. * `API` query executes web api to call an `endpoint` using `HTTPClient` supported engine to get data. -**Important**: You can combine heterogeneous queries in the Entity Aggregate configuration to target various data stores. +**Important**: You can combine heterogeneous queries in the Entity configuration to target different data stores. Example of SQL & API queries are below. You need to override the `GetQuery(IDataContext context, IQueryResult parentQueryResult)` method to return query delegate (package specific implementation). @@ -300,46 +300,14 @@ The Communication transformer should map data only to the `customer/communicatio ### Step 3. DataProvider Setup Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. -- `ILogger>` - logger implementation. default no logger. -- `IEntityAggrgate` - mandatory entity schema definition for entity's object graph. -- `IQueryEngine` - implementation of query engines to execute queries (of type IQuery) with supported data storage's. Can configure multiples. -- `ISchemaPathMatcher` - implementation of schema path matcher. Provide custom implementation when required to use custom schema paths with entity aggregate configuration. - -Example constructors: - -i. With `EntitySchema` and `QueryEngine` implementations. - -``` - public DataProvider(IEntitySchema entitySchema, params IQueryEngine[] queryEngines) -``` -ii. With `Logger`, `EntitySchema`, `QueryEngine`, and `SchemaPathmMatcher` for custom schema paths mapping in entity schema definition. -``` - public DataProvider(ILogger> logger, IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) - -``` -#### Schemio.SQL -Construct DataProvider using `Schemio.SQL.QueryEngine` query engine. - -``` -var provider = new DataProvider(new CustomerSchema(), new Schemio.SQL.QueryEngine(new SQLConfiguration())); -``` - -#### Schemio.EntityFramework -Construct DataProvider using `Schemio.EntityFramework.QueryEngine` query engine. - -``` -var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.QueryEngine()); -``` - -### Using IOC for registrations - -#### Registrations +#### Container Registrations With ServiceCollection, you need to register the below dependencies. + ``` // Register core services services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); - services.AddTransient(typeof(ITransformExecutor<>), typeof(TransformExecutor<>)); + services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); services.AddTransient(); @@ -360,19 +328,104 @@ With ServiceCollection, you need to register the below dependencies. services.AddTransient(c => new QueryEngine(c.GetService>()); - // Register schema definitions. eg CustomerSchema - services.AddTransient, CustomerSchema>(); + // Register each entity configuration. eg CustomerConfiguration + services.AddTransient, CustomerConfiguration>(); + + ``` + +`Please Note:` You can combine multiple query engines and implement supporting types of queries to execute on target data platforms. + + +#### Using Fluent interface for registrations + +i. Example registration: Schemio.SQL + +``` +// Enable DbProviderFactory. + DbProviderFactories.RegisterFactory(DbProviderName, SqliteFactory.Instance); + + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + + var configuration = new SQLConfiguration { ConnectionSettings = new ConnectionSettings { ConnectionString = connectionString, ProviderName = DbProviderName } }; + +// Enable logging + services.AddLogging(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(configuration)) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); ``` -`Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. +ii. Example registration: Schemio.EntityFramework + +``` + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + +// Enable DBContext Factory + services.AddDbContextFactory(options => + options.UseSqlite(connectionString)); + +// Enable logging + services.AddLogging(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + +``` +iii. Example registration: Schemio.API +``` + // Enable logging + services.AddLogging(); + + // Enable HttpClient + services.AddHttpClient(); + + services.UseSchemio() + .WithEngine() + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + +``` +iv. Example registration: Multiple Engines +``` + // Enable logging + services.AddLogging(); + + // Enable HttpClient + services.AddHttpClient(); + + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + +// Enable DBContext Factory + services.AddDbContextFactory(options => + options.UseSqlite(connectionString)); + + services.UseSchemio() + .WithEngine() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); +``` + +#### Data Provider + +##### i. Dependency Inject - IDataProvider -#### Data Provider (DI) To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` -## Extend Schemio -### Custom Query Engine -To provide custom query engine and query implementations, you need to extend the base interfaces as depicted below -- IQueryEngine interface to implement the custom query engine to be used with schemio. +##### ii. Call DataProvider.GetData(IDataContext) method. +TBC + +## Extending Schemio + +You could extend Schemio by providing your own custom implementation of the query engine (`IQueryEngine`) and query (`IQuery`) to execute queries on custom target data platform. + +To do this, you need to extend the base interfaces as depicted below. +### i. IQueryEngine +Implement `IQueryEngine` interface to provide the custom query engine to be used with schemio. ``` public interface IQueryEngine { @@ -384,79 +437,97 @@ public interface IQueryEngine bool CanExecute(IQuery query); /// - /// Executes a list of queries returning a list of aggregated results. + /// Executes a given query returning query result. /// - /// List of IQuery instances. - /// List of query results. Instances of IQueryResult. - IEnumerable Execute(IEnumerable queries); + /// Custom instance of IQuery. + /// Task of IQueryResult. + Task Execute(IQuery> query); } ``` Example Entity Framework implementation is below ``` public class QueryEngine : IQueryEngine where T : DbContext +{ + private readonly IDbContextFactory _dbContextFactory; + + public QueryEngine(IDbContextFactory _dbContextFactory) { - private readonly IDbContextFactory _dbContextFactory; + this._dbContextFactory = _dbContextFactory; + } + + public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; - public QueryEngine(IDbContextFactory _dbContextFactory) + public Task Execute(IQuery query) + { + using (var dbcontext = _dbContextFactory.CreateDbContext()) { - this._dbContextFactory = _dbContextFactory; + var result = ((ISQLQuery)query).Run(dbcontext); + return result; } + } +} +``` +### ii. IQuery +With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query custom query engine. - public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; +To do this, you need to extend `BaseQuery` where TQueryResult is `IQueryResult`. And, provide overrides for below methods. +- `bool IsContextResolved()` +Engine calls this method to confirm whether the query is ready for execution. Return true when query context is resolved. +- `void ResolveQuery(IDataContext context, IQueryResult parentQueryResult)` +This method is invoked by schemio to resolve the query context required for execution ith supporting query engine. `IQueryResult` parameter is only available when the custom query is configured in nested or child mode. - public IEnumerable Execute(IEnumerable queries) - { - var output = new List(); - using (var dbcontext = _dbContextFactory.CreateDbContext()) - { - foreach (var query in queries) - { - var results = ((ISQLQuery)query).Run(dbcontext); +Example - EntityFramework Supported query implementation is shown below. +``` + public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery + where TQueryResult : IQueryResult + { + private Func> QueryDelegate = null; - if (results == null) - continue; + public override bool IsContextResolved() => QueryDelegate != null; - output.AddRange(results); - } + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + QueryDelegate = GetQuery(context, parentQueryResult); + } - return output.ToArray(); - } - } - } -``` -- Provide base implementation supporting IQuery, IRootQuery & IChildQuery interfaces. -- You can implement the parent and child base class implementations to construct for queries to be executed with custom engine implementation above. + async Task ISQLQuery.Run(DbContext dbContext) + { + return await QueryDelegate(dbContext); + } -For Parent Query base implementation, see example below. -``` -public abstract class BaseSQLQuery - : BaseQuery, ISQLQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// Func> - public abstract IEnumerable Run(DbContext dbContext); - } + /// + /// Get query delegate to return query result. + /// + /// + /// + /// + protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); + } ``` -### Custom Schema Language -You can provide your own schema language support for use in entity schema definition to map sections of object graph. +### iii. Custom Schema Paths + +Additionally, You can provide your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. To do this you need to follow the below steps -* Provide entity schema definition with query/transformer pairs using custom schema language paths -* Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. This matcher is used by query builder to pick queries for matched paths against the configured p in Entity schema definition. +i. Provide entity schema definition with query/transformer pairs using custom schema language paths. + +Example - with Dummy schema mapping +``` +.Map(For.Paths("customer$orders")) +``` + +ii. Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. +`Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. ``` public interface ISchemaPathMatcher { bool IsMatch(string inputPath, ISchemaPaths configuredPaths); } ``` -Example implementation of XPath matcher is below. +Example implementation of XPathMatcher is below. ``` public class XPathMatcher : ISchemaPathMatcher { diff --git a/src/Schemio.API/BaseWebQuery.cs b/src/Schemio.API/BaseWebQuery.cs index 797d3d3..e8f4027 100644 --- a/src/Schemio.API/BaseWebQuery.cs +++ b/src/Schemio.API/BaseWebQuery.cs @@ -25,7 +25,7 @@ protected BaseWebQuery(string baseAddress) public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { - UriDelegate = GetUri(context, parentQueryResult); + UriDelegate = GetQuery(context, parentQueryResult); } /// @@ -51,7 +51,7 @@ protected virtual IEnumerable GetResponseHeaders() /// Request Context. Always available. /// Result from parent Query. Only available when configured as nested web query. Else will be null. /// - protected abstract Func GetUri(IDataContext context, IQueryResult parentApiResult = null); + protected abstract Func GetQuery(IDataContext context, IQueryResult parentApiResult = null); async Task IWebQuery.Run(IHttpClientFactory httpClientFactory, ILogger logger) { diff --git a/src/Schemio.Core/CollectionResult.cs b/src/Schemio.Core/CollectionResult.cs index bd7c28d..d5600b1 100644 --- a/src/Schemio.Core/CollectionResult.cs +++ b/src/Schemio.Core/CollectionResult.cs @@ -5,5 +5,9 @@ public class CollectionResult : List, IQueryResult public CollectionResult(IEnumerable list) : base(list) { } + + public CollectionResult() + { + } } } \ No newline at end of file diff --git a/src/Schemio.Core/BaseEntitySchema.cs b/src/Schemio.Core/EntityConfiguration.cs similarity index 80% rename from src/Schemio.Core/BaseEntitySchema.cs rename to src/Schemio.Core/EntityConfiguration.cs index e013e9a..4e2c3d0 100644 --- a/src/Schemio.Core/BaseEntitySchema.cs +++ b/src/Schemio.Core/EntityConfiguration.cs @@ -4,11 +4,11 @@ namespace Schemio.Core /// Implement to configure schema path mappings for an Entity. /// /// Entity type - public abstract class BaseEntitySchema : IEntitySchema where TEntity : IEntity + public abstract class EntityConfiguration : IEntityConfiguration where TEntity : IEntity { public IEnumerable> Mappings { get; } - public BaseEntitySchema() + public EntityConfiguration() { Mappings = GetSchema(); } diff --git a/src/Schemio.Core/IEntitySchema.cs b/src/Schemio.Core/IEntityConfiguration.cs similarity index 82% rename from src/Schemio.Core/IEntitySchema.cs rename to src/Schemio.Core/IEntityConfiguration.cs index 061b3f5..a7e34c1 100644 --- a/src/Schemio.Core/IEntitySchema.cs +++ b/src/Schemio.Core/IEntityConfiguration.cs @@ -4,7 +4,7 @@ namespace Schemio.Core /// Implement to configure schema path mappings for an Entity. /// /// Entity type - public interface IEntitySchema where TEntity : IEntity + public interface IEntityConfiguration where TEntity : IEntity { /// /// Entity schema mappings. diff --git a/src/Schemio.Core/IQuery.cs b/src/Schemio.Core/IQuery.cs index 11e548f..9fe0b58 100644 --- a/src/Schemio.Core/IQuery.cs +++ b/src/Schemio.Core/IQuery.cs @@ -13,9 +13,4 @@ public interface IQuery : IQueryRunner void ResolveQuery(IDataContext context, IQueryResult parentQueryResult = null); } - - public interface IQueryRunner - { - Task Run(IQueryEngine engine); - } } \ No newline at end of file diff --git a/src/Schemio.Core/IQueryRunner.cs b/src/Schemio.Core/IQueryRunner.cs new file mode 100644 index 0000000..13abbbb --- /dev/null +++ b/src/Schemio.Core/IQueryRunner.cs @@ -0,0 +1,7 @@ +namespace Schemio.Core +{ + public interface IQueryRunner + { + Task Run(IQueryEngine engine); + } +} \ No newline at end of file diff --git a/src/Schemio.Core/Impl/DataProvider.cs b/src/Schemio.Core/Impl/DataProvider.cs index c23555f..0c4b8df 100644 --- a/src/Schemio.Core/Impl/DataProvider.cs +++ b/src/Schemio.Core/Impl/DataProvider.cs @@ -12,7 +12,7 @@ public class DataProvider : IDataProvider private readonly IEntityBuilder entityBuilder; public DataProvider( - IEntitySchema entitySchema, + IEntityConfiguration entitySchema, params IQueryEngine[] queryEngines) : this(null, new QueryBuilder(entitySchema, new XPathMatcher()), new QueryExecutor(queryEngines), new EntityBuilder(entitySchema)) @@ -21,7 +21,7 @@ public DataProvider( public DataProvider( ILogger> logger, - IEntitySchema entitySchema, + IEntityConfiguration entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) : this(logger, new QueryBuilder(entitySchema, schemaPathMatcher), diff --git a/src/Schemio.Core/Impl/EntityBuilder.cs b/src/Schemio.Core/Impl/EntityBuilder.cs index 7c232d1..48e6427 100644 --- a/src/Schemio.Core/Impl/EntityBuilder.cs +++ b/src/Schemio.Core/Impl/EntityBuilder.cs @@ -2,9 +2,9 @@ namespace Schemio.Core.Impl { public class EntityBuilder : IEntityBuilder where T : IEntity, new() { - private readonly IEntitySchema entitySchema; + private readonly IEntityConfiguration entitySchema; - public EntityBuilder(IEntitySchema entitySchema) + public EntityBuilder(IEntityConfiguration entitySchema) { this.entitySchema = entitySchema; } diff --git a/src/Schemio.Core/Impl/QueryBuilder.cs b/src/Schemio.Core/Impl/QueryBuilder.cs index 1b455ef..5de3cea 100644 --- a/src/Schemio.Core/Impl/QueryBuilder.cs +++ b/src/Schemio.Core/Impl/QueryBuilder.cs @@ -2,10 +2,10 @@ namespace Schemio.Core.Impl { public class QueryBuilder : IQueryBuilder where T : IEntity { - private readonly IEntitySchema entitySchema; + private readonly IEntityConfiguration entitySchema; private readonly ISchemaPathMatcher schemaPathMatcher; - public QueryBuilder(IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher) + public QueryBuilder(IEntityConfiguration entitySchema, ISchemaPathMatcher schemaPathMatcher) { this.entitySchema = entitySchema; this.schemaPathMatcher = schemaPathMatcher; diff --git a/src/Schemio.Core/ServicesExtensions.cs b/src/Schemio.Core/ServicesExtensions.cs index bdf3ce8..9094514 100644 --- a/src/Schemio.Core/ServicesExtensions.cs +++ b/src/Schemio.Core/ServicesExtensions.cs @@ -27,11 +27,89 @@ params Func[] queryEngines public static IServiceCollection AddEntitySchema(this IServiceCollection services) where TEntity : IEntity - where TSchema : IEntitySchema + where TSchema : IEntityConfiguration { - services.AddTransient(typeof(IEntitySchema), typeof(TSchema)); + services.AddTransient(typeof(IEntityConfiguration), typeof(TSchema)); return services; } + + public static SchemioOptionsBuilder UseSchemio(this IServiceCollection services) + { + services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); + services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); + services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); + services.AddTransient(); + + return new SchemioOptionsBuilder(services); + } + } + + public class SchemioOptionsBuilder : ISchemioOptions + { + public SchemioOptionsBuilder(IServiceCollection services) + { + Services = services; + } + + public IServiceCollection Services { get; } + + public ISchemioOptions WithEngine(Func queryEngines) + { + if (queryEngines != null) + { + Services.AddTransient(c => queryEngines(c)); + } + + return this; + } + + public ISchemioOptions WithEngine() where TEngine : IQueryEngine + { + Services.AddTransient(typeof(IQueryEngine), typeof(TEngine)); + + return this; + } + + public ISchemioOptions WithEngines(Func queryEngines) + { + if (queryEngines != null) + { + Services.AddTransient(c => queryEngines(c)); + } + + return this; + } + + public ISchemioOptions WithPathMatcher(Func pathMatcher) + { + if (pathMatcher != null) + Services.AddTransient(c => pathMatcher(c)); + + return this; + } + + public ISchemioOptions WithEntityConfiguration(Func> entityConfiguration) where T : class, IEntity + { + if (entityConfiguration != null) + { + Services.AddTransient(typeof(IEntityConfiguration), c => entityConfiguration(c)); + } + + return this; + } + } + + public interface ISchemioOptions + { + ISchemioOptions WithEngine(Func queryEngines); + + ISchemioOptions WithEngine() where TEngine : IQueryEngine; + + ISchemioOptions WithEngines(Func queryEngines); + + ISchemioOptions WithPathMatcher(Func pathMatcher); + + ISchemioOptions WithEntityConfiguration(Func> entityConfiguration) where T : class, IEntity; } } \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs index 2a8238d..d3ac786 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs @@ -1,6 +1,6 @@ using Schemio.Core.Impl; +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; namespace Schemio.Core.Tests.DataProvider.Tests { @@ -8,7 +8,7 @@ namespace Schemio.Core.Tests.DataProvider.Tests internal class EntityBuilderTests { private EntityBuilder _entityBuilder; - private IEntitySchema _entitySchema; + private IEntityConfiguration _entitySchema; private static List<(Type result, int InvocationCount)> TransformerInvocations; @@ -25,27 +25,27 @@ public void TestTransformExecutorForCorrectExecutionOfConfiguredTransforms() { var queryList = new List { - new CustomerResult{Id = 123, CustomerCode= "ABC", CustomerName="Ninja Labs"}, - new CommunicationResult{Id = 123, Email = "ninja@labs.com", Telephone = "0212345689"}, - new OrderCollectionResult(), - new OrderItemCollectionResult() + new CustomerRecord{Id = 123, CustomerCode= "ABC", CustomerName="Ninja Labs"}, + new CommunicationRecord{Id = 123, Email = "ninja@labs.com", Telephone = "0212345689"}, + new CollectionResult(), + new CollectionResult() }; var entity = _entityBuilder.Build(new DataContext(new EntityContext()), queryList); - var customerTransforms = TransformerInvocations.Where(x => x.result == typeof(CustomerResult)); + var customerTransforms = TransformerInvocations.Where(x => x.result == typeof(CustomerRecord)); Assert.That(customerTransforms.Count() == 1); Assert.That(customerTransforms.ElementAt(0).InvocationCount == 1); - var communicationTransforms = TransformerInvocations.Where(x => x.result == typeof(CommunicationResult)); + var communicationTransforms = TransformerInvocations.Where(x => x.result == typeof(CommunicationRecord)); Assert.That(communicationTransforms.Count() == 1); Assert.That(communicationTransforms.ElementAt(0).InvocationCount == 1); - var orderCollectionTransforms = TransformerInvocations.Where(x => x.result == typeof(OrderCollectionResult)); + var orderCollectionTransforms = TransformerInvocations.Where(x => x.result == typeof(CollectionResult)); Assert.That(orderCollectionTransforms.Count() == 1); Assert.That(orderCollectionTransforms.ElementAt(0).InvocationCount == 1); - var orderItemsCollectionTransforms = TransformerInvocations.Where(x => x.result == typeof(OrderItemCollectionResult)); + var orderItemsCollectionTransforms = TransformerInvocations.Where(x => x.result == typeof(CollectionResult)); Assert.That(orderItemsCollectionTransforms.Count() == 1); Assert.That(orderItemsCollectionTransforms.ElementAt(0).InvocationCount == 1); @@ -62,17 +62,17 @@ public override void Transform(TQueryResult queryResult, TEntity entity) } } - internal class MockCustomerSchema : BaseEntitySchema + internal class MockCustomerSchema : EntityConfiguration { public override IEnumerable> GetSchema() { return CreateSchema.For() - .Map>(For.Paths("customer/id", "customer/customercode", "customer/customername"), + .Map>(For.Paths("customer/id", "customer/customercode", "customer/customername"), customer => customer.Dependents - .Map>(For.Paths("customer/communication")) - .Map>(For.Paths("customer/orders"), + .Map>(For.Paths("customer/communication")) + .Map, Customer>>(For.Paths("customer/orders"), customerOrders => customerOrders.Dependents - .Map>(For.Paths("customer/orders/order/items"))) + .Map, Customer>>(For.Paths("customer/orders/order/items"))) ).End(); } } diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs index 8838c45..48e5ca7 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs @@ -2,8 +2,8 @@ using Schemio.Core.PathMatchers; using Schemio.Core.Tests.EntitySetup; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.EntitySchemas; -using Schemio.Core.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Configuration; +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; namespace Schemio.Core.Tests.DataProvider.Tests { @@ -12,13 +12,13 @@ internal class QueryBuilderTests { private QueryBuilder _queryBuilder; - private IEntitySchema _entitySchema; + private IEntityConfiguration _entitySchema; private ISchemaPathMatcher _schemaPathMatcher; [SetUp] public void Setup() { - _entitySchema = new CustomerSchema(); + _entitySchema = new CustomerConfiguration(); /*----------------------------------------- * * @@ -75,7 +75,7 @@ public void TestQueryBuilderForCorrectParentQueryListWithOneChildren() Assert.That(parentQuery.GetType() == typeof(CustomerQuery)); var childQuery = parentQuery.Children.First(); - Assert.That(childQuery.GetType() == typeof(CustomerCommunicationQuery)); + Assert.That(childQuery.GetType() == typeof(CommunicationQuery)); } [Test] @@ -96,8 +96,8 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildren() var parentQuery = result.Queries.First(); Assert.That(parentQuery.GetType() == typeof(CustomerQuery)); - var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CustomerCommunicationQuery)); - var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CustomerOrdersQuery)); + var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CommunicationQuery)); + var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrdersQuery)); Assert.IsNotNull(communicationChildQuery); Assert.IsNotNull(ordersChildQuery); @@ -124,8 +124,8 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildrenAndOneChildF var parentQuery = result.Queries.First(); Assert.That(parentQuery.GetType() == typeof(CustomerQuery)); - var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CustomerCommunicationQuery)); - var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CustomerOrdersQuery)); + var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CommunicationQuery)); + var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrdersQuery)); Assert.IsNotNull(communicationChildQuery); Assert.IsNotNull(ordersChildQuery); @@ -133,7 +133,7 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildrenAndOneChildF // nested child query for order item in order query children as order items are included in paths Assert.That(ordersChildQuery.Children.Count, Is.EqualTo(1)); - var orderItemsChildQuery = ordersChildQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CustomerOrderItemsQuery)); + var orderItemsChildQuery = ordersChildQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrderItemsQuery)); Assert.IsNotNull(orderItemsChildQuery); } } diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs index fe87bf5..6d40035 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryExecutorTests.cs @@ -3,8 +3,8 @@ using Schemio.Core.PathMatchers; using Schemio.Core.Tests.EntitySetup; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.EntitySchemas; -using Schemio.Core.Tests.EntitySetup.Queries; +using Schemio.Core.Tests.EntitySetup.Configuration; +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; namespace Schemio.Core.Tests.DataProvider.Tests { @@ -42,7 +42,7 @@ public void TestQueryExecutorToCallEngineWhenQueriesExistForExecution() [Test] // TODO - All sequence assertions public void TestQueryExecutorToExecuteConfiguredQueriesInCorrectOrder() { - var querList = new QueryBuilder(new CustomerSchema(), new XPathMatcher()) + var querList = new QueryBuilder(new CustomerConfiguration(), new XPathMatcher()) .Build(new DataContext(new CustomerContext())); _queryExecutor.Execute(new DataContext(new EntityContext()), querList); diff --git a/tests/Schemio.Core.Tests/EntitySetup/Configuration/CustomerConfiguration.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/CustomerConfiguration.cs new file mode 100644 index 0000000..be8d432 --- /dev/null +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/CustomerConfiguration.cs @@ -0,0 +1,21 @@ +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; +using Schemio.Core.Tests.EntitySetup.Configuration.Transforms; +using Schemio.Core.Tests.EntitySetup.Entities; + +namespace Schemio.Core.Tests.EntitySetup.Configuration +{ + internal class CustomerConfiguration : EntityConfiguration + { + public override IEnumerable> GetSchema() + { + return CreateSchema.For() + .Map(For.Paths("customer/id", "customer/customercode", "customer/customername"), + customer => customer.Dependents + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), + customerOrders => customerOrders.Dependents + .Map(For.Paths("customer/orders/order/items"))) + ).End(); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationQuery.cs similarity index 53% rename from tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationQuery.cs index 2a9c08f..3136b90 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerCommunicationQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationQuery.cs @@ -1,16 +1,16 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries { - internal class CustomerCommunicationQuery : BaseQuery + internal class CommunicationQuery : BaseQuery { - private CustomerParameter QueryParameter; + private object QueryParameter; public override bool IsContextResolved() => QueryParameter != null; public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter + var customer = (CustomerRecord)parentQueryResult; + QueryParameter = new { CustomerId = customer.Id }; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationRecord.cs similarity index 75% rename from tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationRecord.cs index e001516..fe1274d 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CommunicationResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CommunicationRecord.cs @@ -1,6 +1,6 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries { - public class CommunicationResult : IQueryResult + public class CommunicationRecord : IQueryResult { public int Id { get; set; } public string Telephone { get; set; } diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs similarity index 57% rename from tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs index 743844c..944a679 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs @@ -1,8 +1,8 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries { - public class CustomerQuery : BaseQuery + public class CustomerQuery : BaseQuery { - private CustomerParameter QueryParameter; + private object QueryParameter; public override bool IsContextResolved() => QueryParameter != null; @@ -10,9 +10,9 @@ public override void ResolveQuery(IDataContext context, IQueryResult parentQuery { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; - QueryParameter = new CustomerParameter + QueryParameter = new { - CustomerId = customer.CustomerId + customer.CustomerId }; } } diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerRecord.cs similarity index 57% rename from tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerRecord.cs index 83c141d..b56ec89 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerResult.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerRecord.cs @@ -1,6 +1,6 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries { - public class CustomerResult : IQueryResult + public class CustomerRecord : IQueryResult { public int Id { get; set; } public string CustomerCode { get; set; } diff --git a/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemRecord.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemRecord.cs new file mode 100644 index 0000000..c7621c3 --- /dev/null +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemRecord.cs @@ -0,0 +1,8 @@ +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries +{ + public class OrderItemRecord + { + public int OrderId { get; set; } + public (int ItemId, string Name, decimal Cost)[] Items { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemsQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemsQuery.cs new file mode 100644 index 0000000..3e9d021 --- /dev/null +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderItemsQuery.cs @@ -0,0 +1,19 @@ +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries +{ + internal class OrderItemsQuery : BaseQuery> + { + private object QueryParameter; + + public override bool IsContextResolved() => QueryParameter != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to order query. + var ordersResult = (CollectionResult)parentQueryResult; + QueryParameter = new + { + OrderIds = new List(ordersResult.Select(x => x.OrderId)) + }; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderRecord.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderRecord.cs new file mode 100644 index 0000000..21811ed --- /dev/null +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrderRecord.cs @@ -0,0 +1,9 @@ +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries +{ + public class OrderRecord + { + public int OrderId { get; set; } + public string OrderNo { get; set; } + public DateTime Date { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrdersQuery.cs similarity index 53% rename from tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrdersQuery.cs index 2c7d9f2..9acd1bc 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrdersQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/OrdersQuery.cs @@ -1,16 +1,16 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries +namespace Schemio.Core.Tests.EntitySetup.Configuration.Queries { - internal class CustomerOrdersQuery : BaseQuery> + internal class OrdersQuery : BaseQuery> { - private CustomerParameter QueryParameter; + private object QueryParameter; public override bool IsContextResolved() => QueryParameter != null; public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Does not execute as child to any query. - var customer = (CustomerResult)parentQueryResult; - QueryParameter = new CustomerParameter + var customer = (CustomerRecord)parentQueryResult; + QueryParameter = new { CustomerId = customer.Id }; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CommunicationTransform.cs similarity index 73% rename from tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CommunicationTransform.cs index df2bce9..c608aec 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerCommunicationTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CommunicationTransform.cs @@ -1,11 +1,11 @@ +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Core.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Configuration.Transforms { - public class CustomerCommunicationTransform : BaseTransformer + public class CommunicationTransform : BaseTransformer { - public override void Transform(CommunicationResult queryResult, Customer entity) + public override void Transform(CommunicationRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Communication = new Communication diff --git a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CustomerTransform.cs similarity index 53% rename from tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CustomerTransform.cs index 86c8377..83d982e 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/CustomerTransform.cs @@ -1,11 +1,11 @@ +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Core.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Configuration.Transforms { - public class CustomerTransform : BaseTransformer + public class CustomerTransform : BaseTransformer { - public override void Transform(CustomerResult queryResult, Customer entity) + public override void Transform(CustomerRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Id = queryResult.Id; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrderItemsTransform.cs similarity index 72% rename from tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrderItemsTransform.cs index 7e60442..3fa722c 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrderItemsTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrderItemsTransform.cs @@ -1,11 +1,11 @@ +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Core.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Configuration.Transforms { - public class CustomerOrderItemsTransform : BaseTransformer, Customer> + public class OrderItemsTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult queryResult, Customer entity) + public override void Transform(CollectionResult queryResult, Customer entity) { if (queryResult == null || entity?.Orders == null) return; diff --git a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrdersTransform.cs similarity index 56% rename from tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs rename to tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrdersTransform.cs index 40fda5a..dc0c536 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Transforms/CustomerOrdersTransform.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Transforms/OrdersTransform.cs @@ -1,11 +1,11 @@ +using Schemio.Core.Tests.EntitySetup.Configuration.Queries; using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; -namespace Schemio.Core.Tests.EntitySetup.Transforms +namespace Schemio.Core.Tests.EntitySetup.Configuration.Transforms { - public class CustomerOrdersTransform : BaseTransformer, Customer> + public class OrdersTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult queryResult, Customer entity) + public override void Transform(CollectionResult queryResult, Customer entity) { if (queryResult == null) return; diff --git a/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs deleted file mode 100644 index a094b45..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Schemio.Core.Tests.EntitySetup.Entities; -using Schemio.Core.Tests.EntitySetup.Queries; -using Schemio.Core.Tests.EntitySetup.Transforms; - -namespace Schemio.Core.Tests.EntitySetup.EntitySchemas -{ - internal class CustomerSchema : BaseEntitySchema - { - public override IEnumerable> GetSchema() - { - return CreateSchema.For() - .Map(For.Paths("customer/id", "customer/customercode", "customer/customername"), - customer => customer.Dependents - .Map(For.Paths("customer/communication")) - .Map(For.Paths("customer/orders"), - customerOrders => customerOrders.Dependents - .Map(For.Paths("customer/orders/order/items"))) - ).End(); - } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs deleted file mode 100644 index eb49793..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerOrderItemsQuery.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries -{ - internal class CustomerOrderItemsQuery : BaseQuery> - { - private OrderItemParameter QueryParameter; - - public override bool IsContextResolved() => QueryParameter != null; - - public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Execute as child to order query. - var ordersResult = (OrderCollectionResult)parentQueryResult; - QueryParameter = new OrderItemParameter - { - OrderIds = new List(ordersResult.Orders.Select(x => x.OrderId)) - }; - } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs deleted file mode 100644 index 89b0ec0..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/CustomerParameter.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries -{ - public class CustomerParameter : IQueryParameter - { - public int CustomerId { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs deleted file mode 100644 index 6642402..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderCollectionResult.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries -{ - public class OrderCollectionResult : IQueryResult - { - public int CustomerId { get; set; } - public OrderValue[] Orders { get; set; } - } - - public class OrderValue - { - public int OrderId { get; set; } - public string OrderNo { get; set; } - public DateTime Date { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs deleted file mode 100644 index 11fc936..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemCollectionResult.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries -{ - public class OrderItemCollectionResult : IQueryResult - { - public List OrderItems { get; set; } - } - - public class OrderItemValue - { - public int OrderId { get; set; } - public (int ItemId, string Name, decimal Cost)[] Items { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs b/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs deleted file mode 100644 index cd287fe..0000000 --- a/tests/Schemio.Core.Tests/EntitySetup/Queries/OrderItemParameter.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Schemio.Core.Tests.EntitySetup.Queries -{ - internal class OrderItemParameter : IQueryParameter - { - public List OrderIds { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/UnitTest1.cs b/tests/Schemio.Core.Tests/UnitTest1.cs deleted file mode 100644 index 460dce4..0000000 --- a/tests/Schemio.Core.Tests/UnitTest1.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Schemio.Core.Tests -{ - public class Tests - { - [SetUp] - public void Setup() - { - } - - [Test] - public void Test1() - { - Assert.Pass(); - } - } -} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index b5f1dd2..93d65ba 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -38,9 +38,14 @@ public void Setup() services.AddLogging(); - services.UseSchemio(new XPathMatcher(), - c => new QueryEngine(c.GetService>())) - .AddEntitySchema(); + //services.UseSchemio(new XPathMatcher(), + // c => new QueryEngine(c.GetService>())) + // .AddEntitySchema(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); // 4. Build the service provider _serviceProvider = services.BuildServiceProvider(); diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerConfiguration.cs similarity index 93% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerConfiguration.cs index 067e327..d3769bc 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/CustomerConfiguration.cs @@ -5,7 +5,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas { - internal class CustomerSchema : BaseEntitySchema + internal class CustomerConfiguration : EntityConfiguration { public override IEnumerable> GetSchema() { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index 6f5c92e..9135c5a 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,15 +4,15 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { - var customer = (CustomerResult)parentQueryResult; + var customer = (CustomerRecord)parentQueryResult; return async dbContext => await dbContext.Set() .Where(p => p.Customer.Id == customer.Id) - .Select(c => new CommunicationResult + .Select(c => new CommunicationRecord { Id = c.CommunicationId, AddressId = c.Address.AddressId, diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationRecord.cs similarity index 90% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationRecord.cs index 97746a9..29a8b01 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationRecord.cs @@ -3,7 +3,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { [CacheResult] - public class CommunicationResult : IQueryResult + public class CommunicationRecord : IQueryResult { public int Id { get; set; } public string Telephone { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs deleted file mode 100644 index 314ffec..0000000 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Schemio.Core; - -namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries -{ - public class CustomerParameter : IQueryParameter - { - public int CustomerId { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index 65fd283..8a8d10b 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -4,9 +4,9 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : BaseSQLQuery { - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. parentQueryResult will be null. var customer = (CustomerContext)context.Entity; @@ -15,7 +15,7 @@ protected override Func> GetQuery(IDataContext c { var result = await dbContext.Set() .Where(c => c.Id == customer.CustomerId) - .Select(c => new CustomerResult + .Select(c => new CustomerRecord { Id = c.Id, Name = c.Name, diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerRecord.cs similarity index 82% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerRecord.cs index 1260b75..ae7f175 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerResult : IQueryResult + public class CustomerRecord : IQueryResult { public int Id { get; set; } public string Code { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs deleted file mode 100644 index 7150937..0000000 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Schemio.Core; -using Schemio.Core.Helpers; - -namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries -{ - internal class OrderItemParameter : IQueryParameter - { - public OrderItemParameter() - { - OrderIds = new List(); - } - - public string ToCsv() - { - return OrderIds.ToCSV(); - } - - public List OrderIds { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemRecord.cs similarity index 85% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemRecord.cs index ccb1406..bb1c216 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class OrderItemResult : IQueryResult + public class OrderItemRecord : IQueryResult { public int OrderId { get; set; } public int ItemId { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index 8cbf59c..b9efa05 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -4,18 +4,18 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to order query. - var ordersResults = (CollectionResult)parentQueryResult; + var ordersResults = (CollectionResult)parentQueryResult; return async dbContext => { var items = await dbContext.Set() .Where(p => ordersResults.Select(o => o.OrderId).Contains(p.Order.OrderId)) - .Select(c => new OrderItemResult + .Select(c => new OrderItemRecord { ItemId = c.ItemId, Name = c.Name, @@ -24,7 +24,7 @@ protected override Func>> GetQ }) .ToListAsync(); - return new CollectionResult(items); + return new CollectionResult(items); }; } } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderRecord.cs similarity index 86% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderRecord.cs index 06ecfec..2892312 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class OrderResult : IQueryResult + public class OrderRecord : IQueryResult { public int CustomerId { get; set; } public int OrderId { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index 96fe6f0..306f388 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,18 +4,18 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; + var customer = (CustomerRecord)parentQueryResult; return async dbContext => { var items = await dbContext.Set() .Where(p => p.Customer.Id == customer.Id) - .Select(c => new OrderResult + .Select(c => new OrderRecord { CustomerId = c.CustomerId, OrderId = c.OrderId, @@ -24,7 +24,7 @@ protected override Func>> GetQuery }) .ToListAsync(); - return new CollectionResult(items); + return new CollectionResult(items); }; } } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs index 0930475..bd52373 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { - public class CommunicationTransform : BaseTransformer + public class CommunicationTransform : BaseTransformer { - public override void Transform(CommunicationResult queryResult, Customer entity) + public override void Transform(CommunicationRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Communication = new Communication diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs index dd05b2f..ae467a0 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { - public class CustomerTransform : BaseTransformer + public class CustomerTransform : BaseTransformer { - public override void Transform(CustomerResult queryResult, Customer entity) + public override void Transform(CustomerRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Id = queryResult.Id; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs index 6e585ef..d6b9efa 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs @@ -5,9 +5,9 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { - public class OrderItemsTransform : BaseTransformer, Customer> + public class OrderItemsTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult collectionResult, Customer customer) + public override void Transform(CollectionResult collectionResult, Customer customer) { if (collectionResult == null || !collectionResult.Any() || customer.Orders == null) return; diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs index cb4df27..0a29b7e 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Transforms { - public class OrdersTransform : BaseTransformer, Customer> + public class OrdersTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult collectionResult, Customer entity) + public override void Transform(CollectionResult collectionResult, Customer entity) { if (collectionResult == null || !collectionResult.Any()) return; diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index 470a766..a6c059a 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -5,6 +5,7 @@ using Schemio.Core.Helpers; using Schemio.Core.PathMatchers; using Schemio.SQL; +using Schemio.SQL.Tests.EntitySetup; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas; @@ -42,8 +43,13 @@ public void Setup() services.AddLogging(); - services.UseSchemio(new XPathMatcher(), c => new QueryEngine(configuration)) - .AddEntitySchema(); + //services.UseSchemio(new XPathMatcher(), c => new QueryEngine(configuration)) + // .AddEntitySchema(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(configuration)) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); // 4. Build the service provider _serviceProvider = services.BuildServiceProvider(); diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/CustomerConfiguration.cs similarity index 92% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/CustomerConfiguration.cs index 85fa6e5..37797f7 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/CustomerSchema.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/CustomerConfiguration.cs @@ -5,7 +5,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas { - internal class CustomerSchema : BaseEntitySchema + internal class CustomerConfiguration : EntityConfiguration { public override IEnumerable> GetSchema() { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs similarity index 84% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs index b5d23c8..0a1b735 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs @@ -4,14 +4,14 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : BaseSQLQuery { - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; + var customer = (CustomerRecord)parentQueryResult; - return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( "select c.CommunicationId as ContactId, " + "c.Phone as Telephone, " + diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationRecord.cs similarity index 90% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationRecord.cs index e89da6f..a71784b 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CommunicationResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationRecord.cs @@ -3,7 +3,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { [CacheResult] - public class CommunicationResult : IQueryResult + public class CommunicationRecord : IQueryResult { public int ContactId { get; set; } public string Telephone { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs similarity index 71% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs index ba8bdca..d254f27 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs @@ -4,14 +4,14 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : BaseSQLQuery { - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. var customer = (CustomerContext)context.Entity; - return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( "select CustomerId as Id, " + "Customer_Name as Name," + diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerRecord.cs similarity index 82% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerRecord.cs index 78891f1..67038cf 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerResult : IQueryResult + public class CustomerRecord : IQueryResult { public int Id { get; set; } public string Code { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemRecord.cs similarity index 84% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemRecord.cs index 58baec3..f9667ee 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class OrderItemResult : IQueryResult + public class OrderItemRecord : IQueryResult { public int OrderId { get; set; } public int ItemId { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs similarity index 79% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs index 2ab58a7..141a162 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs @@ -5,16 +5,16 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : BaseSQLQuery> { - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child query to order query taking OrderResult to resolve query parameter. - var ordersResult = (CollectionResult)parentQueryResult; + var ordersResult = (CollectionResult)parentQueryResult; return async connection => { - var items = await connection.QueryAsync(new CommandDefinition + var items = await connection.QueryAsync(new CommandDefinition ( "select OrderId, " + "OrderItemId as ItemId, " + @@ -23,7 +23,7 @@ protected override Func>> $"from TOrderItem where OrderId in ({ordersResult.Select(o => o.OrderId).ToCSV()})" )); - return new CollectionResult(items); + return new CollectionResult(items); }; } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderRecord.cs similarity index 83% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderRecord.cs index 3176222..336df23 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderResult.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderRecord.cs @@ -2,7 +2,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class OrderResult : IQueryResult + public class OrderRecord : IQueryResult { public int OrderId { get; set; } public string OrderNo { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs similarity index 69% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs index eec0892..60f17b4 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs @@ -4,16 +4,16 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : BaseSQLQuery> { - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; + var customer = (CustomerRecord)parentQueryResult; return async connection => { - var items = await connection.QueryAsync(new CommandDefinition + var items = await connection.QueryAsync(new CommandDefinition ( "select OrderId, " + "OrderNo, " + @@ -22,7 +22,7 @@ protected override Func>> GetQ $"where customerId={customer.Id}" )); - return new CollectionResult(items); + return new CollectionResult(items); }; } } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CommunicationTransform.cs similarity index 92% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CommunicationTransform.cs index 9cd5dca..caadad1 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CommunicationTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CommunicationTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms { - public class CommunicationTransform : BaseTransformer + public class CommunicationTransform : BaseTransformer { - public override void Transform(CommunicationResult queryResult, Customer entity) + public override void Transform(CommunicationRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Communication = new Communication diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CustomerTransform.cs similarity index 75% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CustomerTransform.cs index 5866926..8669ffa 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/CustomerTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/CustomerTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms { - public class CustomerTransform : BaseTransformer + public class CustomerTransform : BaseTransformer { - public override void Transform(CustomerResult queryResult, Customer entity) + public override void Transform(CustomerRecord queryResult, Customer entity) { var customer = entity ?? new Customer(); customer.Id = queryResult.Id; diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrderItemsTransform.cs similarity index 92% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrderItemsTransform.cs index 8d06010..0dc1f85 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrderItemsTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrderItemsTransform.cs @@ -5,9 +5,9 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms { - public class OrderItemsTransform : BaseTransformer, Customer> + public class OrderItemsTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult collectionResult, Customer customer) + public override void Transform(CollectionResult collectionResult, Customer customer) { if (collectionResult == null || !collectionResult.Any() || customer.Orders == null) return; diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrdersTransform.cs similarity index 87% rename from tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs rename to tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrdersTransform.cs index c9a2615..c11a122 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Transforms/OrdersTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrdersTransform.cs @@ -4,9 +4,9 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Transforms { - public class OrdersTransform : BaseTransformer, Customer> + public class OrdersTransform : BaseTransformer, Customer> { - public override void Transform(CollectionResult collectionResult, Customer contract) + public override void Transform(CollectionResult collectionResult, Customer contract) { if (collectionResult == null || !collectionResult.Any()) return; diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs deleted file mode 100644 index 1a0c34d..0000000 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/CustomerParameter.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Schemio.Core; - -namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries -{ - public class CustomerParameter : IQueryParameter - { - public int CustomerId { get; set; } - } -} \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs deleted file mode 100644 index 4a07efb..0000000 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntitySchemas/Queries/OrderItemParameter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Schemio.Core; -using Schemio.Core.Helpers; - -namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries -{ - internal class OrderItemParameter : IQueryParameter - { - public OrderItemParameter() - { - OrderIds = new List(); - } - - public string ToCsv() - { - return OrderIds.ToCSV(); - } - - public List OrderIds { get; set; } - } -} \ No newline at end of file From 19fd43fc28ab794eb411ba7017db94f0d1ae69b5 Mon Sep 17 00:00:00 2001 From: Ninja Date: Mon, 18 Nov 2024 23:01:37 +0000 Subject: [PATCH 42/64] - Update v2.0.0 Developer Guide --- DeveloperGuide.md | 823 ++++++++++++++++++++++++---------------------- 1 file changed, 425 insertions(+), 398 deletions(-) diff --git a/DeveloperGuide.md b/DeveloperGuide.md index 5610659..4bd9031 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -1,389 +1,313 @@ # Developer Guide + ## i. Installation -Install the latest nuget package as appropriate. -`Scemio.Core` - for installing schemio for `bespoke` implementation of query engine. +`Schemio` allows you to aggregate data from heterogeneous data stores offering `SQL` & `API` packages out of the box below. SQL queries are supported by `Dapper` and `EntityFramework` engines. You could also `extend` Schemio to provide your own implementation(s) of `Query` and supporting `Query Engine` to retrieve data from `custom` data store(s). + +Below are the Nuget packages available. + +`Scemio.Core` - Install to extend schemio to implement `custom` querying engine. ``` NuGet\Install-Package Schemio.Core ``` -`Schemio.SQL` - for installing schemio for SQL with `Dapper` engine. +`Schemio.SQL` - Install when you would like to include SQL `Dapper` queries to access SQL database. ``` NuGet\Install-Package Schemio.SQL ``` -`Schemio.EntityFramework` - for installing schemio for SQL with `EntityFramework` engine. +`Schemio.EntityFramework` - Install when you would like to include SQL `EntityFramework` queries to access SQL database. ``` NuGet\Install-Package Schemio.EntityFramework ``` +`Schemio.Api` - Install when you would like to include web api queries with `HttpClient` query engine. +``` +NuGet\Install-Package Schemio.Api +``` ## ii. Implementation: Using Schemio -To use schemio you need to -> Step 1 - Setup the entity to be fetched. -> -> Step 2 - Construct the `DataProvider` with required dependencies. - -### Step 1. Entity Setup -Setting up an entity includes the following. -* Define the `entity` to be fetched using `DataProvider` - which is basically a class with entire object graph (with nested typed properties). -* Define the `entity schema` which is schema path mapping of the entire entity object graph. Each mapping consists of a `query` and `transformer` pair mapped to a sections of object graph (using XPaths or JsonPath for schema paths) - -#### 1.1 Entity -To mark the class as Entity, implement the class from `IEntity` interface. -Bear in mind this is the root entity to be fetched. - ->Below is an example `Customer` entity. -> -> ``` -> public class Customer : IEntity -> { -> public int CustomerId { get; set; } -> public string CustomerCode { get; set; } -> public string CustomerName { get; set; } -> public Communication Communication { get; set; } -> public Order[] Orders { get; set; } -> } -> ``` +To use **Schemio** you need to do the below steps +- **Step 1**: Define the aggregated `Entity`. +- **Step 2**: Setup the aggregate `Configuration` comprising of `Query`/`Transformer` hierarchical nested mappings. +- **Step 3**: Construct the `DataProvider` with required dependencies. + +### Step 1. Define Aggregate Entity. +To create an aggregate `Entity`, implement the class from `IEntity` interface. This is the entity that will be returned as aggregated result from multiple queries assembled to execute against homogeneous or heterogeneous data storage's. + +Below is an example `Customer` entity. + +``` +public class Customer : IEntity +{ + public int CustomerId { get; set; } + public string CustomerCode { get; set; } + public string CustomerName { get; set; } + public Communication Communication { get; set; } + public Order[] Orders { get; set; } +} +``` For the customer class, we can see there are three levels of nesting in the object graph. - Level 1 with paths: `Customer` - Level 2 with paths: `Customer.Communication` and `Customer.Orders` - Level 3 with paths: `Customer.Orders.Items` -If we choose XML Schema Definition (XSD) for the object schema of the above Customer class fo mapping with XPATHs -then below is the Customer XSD and XPaths for different nesting levels. - -> Customer XSD is -> ``` -> Coming soon... -> ``` - -> Schema mappings using XPaths are -> ``` -> - Level 1 with XPath: Customer -> - Level 2 with XPaths: Customer/Communication and Customer/Orders -> - Level 3 with XPath: Customer/Orders/Order/Items/Item - -#### 1.2 Entity Schema Definition -Define entity schema definition for the entity in context. - -* `Entity schema definition` is basically a configuration with hierarchy of `query/transformer` pairs mapped to the schema paths pointing to different levels of the entity's object graph. -* `Query` is an implementation to fetch data for a certain section of object graph from an underlying data storage. -* `Transformer` is an implementation to map the data fetched by the linked query to the relevant sections of the entity's object graph. - -To define Entity schema, implement `BaseEntitySchema` interface where T is entity in context. - -> -Example Entity Schema Definition (using XPaths) -> The `Customer` entity with `three` levels of `nesting` is configured below in `CustomerSchema` definition to show `query/transformer` pairs nested accordingly mapping to object graph using the XPath definitions. -> -> ``` -> internal class CustomerSchema : BaseEntitySchema -> { -> public override IEnumerable> GetSchema() -> { -> return CreateSchema.For() -> .Map(For.Paths("customer"), -> customer => customer.Dependents -> .Map(For.Paths("customer/communication")) -> .Map(For.Paths("customer/orders"), -> customerOrders => customerOrders.Dependents -> .Map(For.Paths("customer/orders/order/items"))) -> ).Create(); -> } -> } ->``` - -##### i. Query/Transformer Mapping -Every `Query` type in the `EntitySchema` definition should have a complementing `Transformer` type. +If we choose XML Schema Definition (XSD) for the Customer entity then XPaths for nesting levels should be. +``` +- Level 1 with XPath: Customer +- Level 2 with XPaths: Customer/Communication and Customer/Orders +- Level 3 with XPath: Customer/Orders/Order/Items/Item +``` +### Step 2: Setup Entity Aggregate Configuration +To define `Entity Configuration`, derive from `EntityConfiguration` class where `TEntity` is aggregate entity in context (ie. `IEntity`). + +The `Entity Configuration` is basically `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. +* `Query` is an implementation to `fetch` data for mapped sections of object graph. +* `Transformer` is an implementation to `map` data fetched by the associated query to the relevant sections of the entity's object graph. + +Below is an example Entity Configuration for the Customer Entity. + +``` +internal class CustomerConfiguration : EntityConfiguration +{ + public override IEnumerable> GetSchema() + { + return CreateSchema.For() + .Map(For.Paths("customer"), + customer => customer.Dependents + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), + customerOrders => customerOrders.Dependents + .Map(For.Paths("customer/orders/order/items")))) + .End(); + } +} +``` +`CustomerConfiguration` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. +`XPaths` are used to identify the schema paths in the object graph. Alternately, you could use your own representation to name the pairs or map the object graph. However, you would need to provide the `ISchemaPathmatcher` implementation to managing path matching. + +#### i. Query/Transformer Mapping +Every `Query` type in the Entity `Configuration` definition should have a complementing `Transformer` type. You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. ->Below is the snippet from `CustomerSchema` definition. ->``` -> .Map(For.Paths("customer", "customer/code", "customer/name")) ->``` +Below is the snippet from `CustomerConfiguration` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. +``` + .Map(For.Paths("customer")) +``` -##### ii. Nested Query/Transformer Mappings -* You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query paramter. -* The query/transformer mappings can be `nested` to `5` levels down. -* When certain `schema paths` are included in the DataProvider `request` to fetch the Entity, the relevant query and transformer pairs get executed in the order of their nesting to hydrate the entity. +#### ii. Nested Query/Transformer Mappings +You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query context. ->Example nesting of Communication query under Customer query. ->``` -> .Map(For.Paths("customer"), -- Parent -> customer => customer.Dependents -> .Map(For.Paths("customer/communication")) -- Child ->``` +The query/transformer mappings can be `nested` to `5` levels down. + +Below is snippet to show nesting of `CommunicationQuery` as child to `CustomerQuery`. +``` +.Map(For.Paths("customer"), -- Parent + customer => customer.Dependents + .Map(For.Paths("customer/communication")) -- Child +``` +Execution Flow +* In parent/child hierarchy, the first parent query executes first, followed by its immediate children. The execution flows in sequence to the last child query in order of its nesting. +* While executing the output of the parent is passed in to the child query to resolve query context and get it ready for execution. +* Transformers are also executed in the same sequence to map data to the Aggregate Entity. +* When a query path for nested query is included for execution, all the parent queries involved in that object graph get included for execution in order of its nesting. -Please see the execution sequence below for queries and transformers nested in CustomerSchema implemented above. +Please see the execution sequence below for queries and transformers nested in `CustomerConfiguration` implemented above. image +#### iii. Query Class +`Query` - The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. -`Please Note:` If you need to support custom schema language for mapping the object graph, then see extending schemio section below. - - -#### 1.2.1 Query Class -The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. - -QueryEngine is an implementation of `IQueryEngine` to execute queries against a supported data storage to return a collection of query results (ie. of type IQueryResult). - -As explained above, You can configure a query in `Parent` or `Child` (nested) mode in nested hierarchies. - -To define a `parent` or `child` query, derive from `BaseQuery` -* `TQueryParameter` is basically the class that holds the `inputs` required by the root query for execution. It is an implementation of `IQueryParameter` type. -* `TQueryResult` is the result that will be returned from executing the root query. It is an implementation of `IQueryResult` type. - -The query parameter needs to be resolved before executing the query with QueryEngine. -To resolve the query parameter you need to override `ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult)` method - -i. Parent Query - In `parent` mode, which is usually configured at level 1 to query the root entity, the query parameter is resolved using the `IDataContext` parameter passed to data provider class. `IQueryResult` parameter in ResolveQueryParameter() will be `null`. - - -> See example `CustomerQuery` implemented to be configured and run in parent mode below. -> ``` ->internal class CustomerQuery : BaseQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Executes as Parent or Level 1 query. -> // The query parameter is resolved using IDataContext parameter of data provider class. Parent query result will be null. -> -> var customer = (CustomerContext)context; -> QueryParameter = new CustomerParameter -> { -> CustomerId = customer.CustomerId -> }; -> } -> } ->``` - -ii. Child Query - In `child` mode, which is a query configured usually at level below any parent query, the query parameter can be resolved using the `IQueryResult` query result of the `parent` query. -IDataContext parameter passed to data provider class is also available. - -Note: You can have a maximum of `5` levels of query nestings. - -> See example `CustomerCommunicationQuery` implemented to be configured and run as child or nested query to customer query below. Please see `CustomerSchema` definition above for parent/child configuration setup. ->``` -> internal class CustomerCommunicationQuery : BaseQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child to customer query. -> // The result from parent customer query is used to resolve the query parameter of the nested communication query. -> -> var customer = (CustomerResult)parentQueryResult; -> QueryParameter = new CustomerParameter -> { -> CustomerId = customer.Id -> }; -> } -> } ->``` - -#### Query Engines - -`Please Note:` The above query implementation examples are with respect to parent/child configuration. The actual storage specific query definition should vary with specific implementation of the QueryEngine. -> Please see supported Query engine implementations below. -- `Schemio.SQL` - provides the implementation of IQueryEngine to execute SQL queries. Uses `Dapper` for SQL data acess. -- `Schemio.EntityFramework` - provides implementation of IQueryEngine to execute `Entity Framework` queries. - -`Query using Schemio.SQL` -The SQL query needs to implement `BaseSQLQuery`. -And, requires implementing `public abstract CommandDefinition GetCommandDefinition()` method to return `command definition` for query to be executed with `Dapper` supported QueryEngine. - -See below example `CustomerQuery` implemented as Root SQL query ->``` -> internal class CustomerQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Executes as root or level 1 query. parent QueryResult should be null. -> var customer = (CustomerContext)context.Entity; -> QueryParameter = new CustomerParameter -> { -> CustomerId = (int)customer.CustomerId -> }; -> } -> -> public override IEnumerable Execute(IDbConnection conn) -> { -> return conn.Query(new CommandDefinition -> ( -> "select CustomerId as Id, " + -> "Customer_Name as Name," + -> "Customer_Code as Code " + -> $"from TCustomer where customerId={QueryParameter.CustomerId}" -> )); -> } -> } ->``` -> -See below example `CustomerOrderItemsQuery` implemented as child SQL query. ->``` ->internal class CustomerOrderItemsQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child query to order query taking OrderResult to resolve query parameter. -> var ordersResult = (OrderResult)parentQueryResult; -> -> QueryParameter ??= new OrderItemParameter(); -> QueryParameter.OrderIds.Add(ordersResult.OrderId); -> } -> -> public override IEnumerable Execute(IDbConnection conn) -> { -> return conn.Query(new CommandDefinition -> ( -> "select OrderId, " + -> "OrderItemId as ItemId, " + -> "Name, " + -> "Cost " + -> $"from TOrderItem where OrderId in ({QueryParameter.ToCsv()})" -> )); -> } -> } ->``` - -`Query using Schemio.EntityFramework` -The SQL query needs to implement `BaseSQLQuery`. -And, requires implementing `public abstract IEnumerable Run(DbContext dbContext)` method to implement query using `DbContext` using entity framework. - -See below example `CustomerQuery` implemented as Root Entity framework query ->``` -> internal class CustomerQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Executes as root or level 1 query. parent QueryResult shuld be null. -> var customer = (CustomerContext)context.Entity; -> QueryParameter = new CustomerParameter -> { -> CustomerId = (int)customer.CustomerId -> }; -> } -> -> public override IEnumerable Run(DbContext dbContext) -> { -> return dbContext.Set() -> .Where(c => c.Id == QueryParameter.CustomerId) -> .Select(c => new CustomerResult -> { -> Id = c.Id, -> Name = c.Name, -> Code = c.Code -> }); -> } -> } ->``` -> -See below example `CustomerOrderItemsQuery` implemented as child Entity framework query. ->``` ->internal class CustomerOrderItemsQuery : BaseSQLQuery -> { -> protected override void ResolveQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child query to order query taking OrderResult to resolve query parameter. -> var ordersResult = (CustomerOrderResult)parentQueryResult; -> -> QueryParameter ??= new OrderItemParameter(); -> QueryParameter.OrderIds.Add(ordersResult.OrderId); -> } -> -> public override IEnumerable Run(DbContext dbContext) -> { -> return dbContext.Set() -> .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) -> .Select(c => new OrderItemResult -> { -> ItemId = c.ItemId, -> Name = c.Name, -> Cost = c.Cost, -> OrderId = c.Order.OrderId -> }); -> ; -> } -> } ->``` - - -#### 2.2 Tranformer Class -The purpose of the transformer class is to transform the data fetched by the linked query class and mapp to the configured object graph of the entity. +`QueryEngine` is an implementation of `IQueryEngine` to execute queries with supported data storage to return query result (ie. Result instance of `IQueryResult`). -To define a transformer class, you need to implement `BaseTransformer` -- where TEntity is Entity implementing `IEntity`. eg. Customer. -- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. +Depending on the Nuget package(s) installed, you could implement `SQL` and `API` queries. +* `SQL` queries execute to get data from SQL database using `Dapper` or `EntityFramework` engines. +* `API` query executes web api to call an `endpoint` using `HTTPClient` supported engine to get data. -Note: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. +**Important**: You can combine heterogeneous queries in the Entity configuration to target different data stores. -For the example query/transformer mapping ->``` -> .Map(For.Paths("customer")) ->``` - -The customer transformer maps data only to the `customer` xpath mapped object graph of customer class. -ie. - `customer/id`, `customer/customercode`, `customer/customername` - -In below transformer example, `CustomerTransformer` is implemented to transform entity `Customer` with `CustomerResult` query result obtained from `CustomerQuery` execution. - -> ->``` ->internal class CustomerTransform : BaseTransformer -> { -> public override Customer Transform(CustomerResult queryResult, Customer entity) -> { -> var customer = entity ?? new Customer(); -> customer.CustomerId = queryResult.Id; -> customer.CustomerName = queryResult.CustomerName; -> customer.CustomerCode = queryResult.CustomerCode; -> return customer; -> } -> } ->``` - -### DataProvider Setup -Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. +Example of SQL & API queries are below. +You need to override the `GetQuery(IDataContext context, IQueryResult parentQueryResult)` method to return query delegate (package specific implementation). +* `IDataContext` is the context parameter passed to DataProvider to get aggregated results (. Aggregated Entity). This parameter is always available for both parent and child queries. +* `IQueryResult` parameter is only available when query is configured in child mode, else will be null. + +##### `Schemio.SQL` - with `Dapper` Query implementation. + +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseSQLQuery +{ + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. + var customer = (CustomerContext)context.Entity; + + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition + ( + "select CustomerId as Id, " + + "Customer_Name as Name," + + "Customer_Code as Code " + + $"from TCustomer where customerId={customer.CustomerId}" + )); + } +} +``` +2. Example Child Query - OrdersQuery +``` +internal class OrdersQuery : BaseSQLQuery> +{ + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer query. + var customer = (CustomerResult)parentQueryResult; -- `ILogger>` - logger implementation. default no logger. -- `IEntitySchema` - mandatory entity schema definition for entity's object graph. -- `IQueryEngine` - implementation of query engine to execute queries (of type IQuery) with supported data storage. -- `ISchemaPathMatcher` - implementation of schema path matcher to use custom schema paths with entity schema definition. + return async connection => + { + var items = await connection.QueryAsync(new CommandDefinition + ( + "select OrderId, " + + "OrderNo, " + + "OrderDate " + + "from TOrder " + + $"where customerId={customer.Id}" + )); + + return new CollectionResult(items); + }; + } +} +``` -Example constructors: +##### `Schemio.EntityFramework` - with `EntityFramework` Query implementation -i. With `EntitySchema` and `QueryEngine` implementations. +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseSQLQuery +{ + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. parentQueryResult will be null. + var customer = (CustomerContext)context.Entity; + return async dbContext => + { + var result = await dbContext.Set() + .Where(c => c.Id == customer.CustomerId) + .Select(c => new CustomerResult + { + Id = c.Id, + Name = c.Name, + Code = c.Code + }) + .FirstOrDefaultAsync(); + + return result; + }; + } +} ``` - public DataProvider(IEntitySchema entitySchema, params IQueryEngine[] queryEngines) -``` -ii. With `Logger`, `EntitySchema`, `QueryEngine`, and `SchemaPathmMatcher` for custom schema paths mapping in entity schema definition. +2. Example Child Query - OrdersQuery ``` - public DataProvider(ILogger> logger, IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) - + internal class OrdersQuery : BaseSQLQuery> + { + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer query. + var customer = (CustomerResult)parentQueryResult; + + return async dbContext => + { + var items = await dbContext.Set() + .Where(p => p.Customer.Id == customer.Id) + .Select(c => new OrderResult + { + CustomerId = c.CustomerId, + OrderId = c.OrderId, + Date = c.Date, + OrderNo = c.OrderNo + }) + .ToListAsync(); + + return new CollectionResult(items); + }; + } + } +``` +##### `Schemio.Api` - with `HttpClient` Query implementation +1. Example Parent Query - CustomerQuery ``` -#### Schemio.SQL -Construct DataProvider using `Schemio.SQL.QueryEngine` query engine. +public class CustomerQuery : BaseApiQuery +{ + public CustomerQuery() : base(Endpoints.BaseAddress) + { + } + protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. + var customer = (CustomerContext)context.Entity; + + return ()=> new Uri(string.Format($"v2/customers/{customer.CustomerId}); + } +} +``` +2. Example Child Query - OrdersQuery +``` +internal class OrdersQuery : BaseApiQuery> +{ + public OrdersQuery() : base(Endpoints.BaseAddress) + { + } + protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer api. + var customer = (CustomerResult)parentApiResult; + + return ()=> new Uri(string.Format($"v2/customers/{customer.Id}/orders); + } +} +``` + +#### iv. Transformer Class +The purpose of the transformer class is to transform the data fetched by the linked query class and map to the configured object graph of the entity. + +To define a transformer class, you need to implement `BaseTransformer` +- where TEntity is Aggregate Entity implementing `IEntity`. eg. Customer. +- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. +Example transformer - Customer Transformer ``` -var provider = new DataProvider(new CustomerSchema(), new Schemio.SQL.QueryEngine(new SQLConfiguration())); +internal class CustomerTransform : BaseTransformer +{ + public override Customer Transform(CustomerResult queryResult, Customer entity) + { + var customer = entity ?? new Customer(); + customer.CustomerId = queryResult.Id; + customer.CustomerName = queryResult.CustomerName; + customer.CustomerCode = queryResult.CustomerCode; + return customer; + } +} ``` -#### Schemio.EntityFramework -Construct DataProvider using `Schemio.EntityFramework.QueryEngine` query engine. +**Note**: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. +For the example query/transformer mapping ``` -var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.QueryEngine()); +.Map(For.Paths("customer/communication")) ``` +The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. -### Using IOC for registrations +### Step 3. DataProvider Setup +Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. -#### Registrations +#### Container Registrations With ServiceCollection, you need to register the below dependencies. + ``` // Register core services services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); - services.AddTransient(typeof(ITransformExecutor<>), typeof(TransformExecutor<>)); + services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); services.AddTransient(); @@ -404,103 +328,206 @@ With ServiceCollection, you need to register the below dependencies. services.AddTransient(c => new QueryEngine(c.GetService>()); - // Register schema definitions. eg CustomerSchema - services.AddTransient, CustomerSchema>(); + // Register each entity configuration. eg CustomerConfiguration + services.AddTransient, CustomerConfiguration>(); + + ``` + +`Please Note:` You can combine multiple query engines and implement supporting types of queries to execute on target data platforms. + + +#### Using Fluent interface for registrations + +i. Example registration: Schemio.SQL + +``` +// Enable DbProviderFactory. + DbProviderFactories.RegisterFactory(DbProviderName, SqliteFactory.Instance); + + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + + var configuration = new SQLConfiguration { ConnectionSettings = new ConnectionSettings { ConnectionString = connectionString, ProviderName = DbProviderName } }; + +// Enable logging + services.AddLogging(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(configuration)) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); +``` + +ii. Example registration: Schemio.EntityFramework + +``` + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + +// Enable DBContext Factory + services.AddDbContextFactory(options => + options.UseSqlite(connectionString)); + +// Enable logging + services.AddLogging(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + +``` +iii. Example registration: Schemio.API +``` + // Enable logging + services.AddLogging(); + + // Enable HttpClient + services.AddHttpClient(); + + services.UseSchemio() + .WithEngine() + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + +``` +iv. Example registration: Multiple Engines ``` + // Enable logging + services.AddLogging(); + + // Enable HttpClient + services.AddHttpClient(); + + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + +// Enable DBContext Factory + services.AddDbContextFactory(options => + options.UseSqlite(connectionString)); + + services.UseSchemio() + .WithEngine() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); +``` + +#### Data Provider -`Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. +##### i. Dependency Inject - IDataProvider -#### Data Provider (DI) To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` -## Extend Schemio -### Custom Query Engine -To provide custom query engine and query implementations, you need to extend the base interfaces as depicted below -- IQueryEngine interface to implement the custom query engine to be used with schemio. +##### ii. Call DataProvider.GetData(IDataContext) method. +TBC + +## Extending Schemio + +You could extend Schemio by providing your own custom implementation of the query engine (`IQueryEngine`) and query (`IQuery`) to execute queries on custom target data platform. + +To do this, you need to extend the base interfaces as depicted below. +### i. IQueryEngine +Implement `IQueryEngine` interface to provide the custom query engine to be used with schemio. ``` public interface IQueryEngine - { - /// - /// Detrmines whether an instance of query can be executed with this engine. - /// - /// instance of IQuery. - /// Boolean; True when supported. - bool CanExecute(IQuery query); - - /// - /// Executes a list of queries returning a list of aggregated results. - /// - /// List of IQuery instances. - /// List of query results. Instances of IQueryResult. - IEnumerable Execute(IEnumerable queries); - } +{ + /// + /// Detrmines whether an instance of query can be executed with this engine. + /// + /// instance of IQuery. + /// Boolean; True when supported. + bool CanExecute(IQuery query); + + /// + /// Executes a given query returning query result. + /// + /// Custom instance of IQuery. + /// Task of IQueryResult. + Task Execute(IQuery> query); +} ``` Example Entity Framework implementation is below ``` public class QueryEngine : IQueryEngine where T : DbContext +{ + private readonly IDbContextFactory _dbContextFactory; + + public QueryEngine(IDbContextFactory _dbContextFactory) { - private readonly IDbContextFactory _dbContextFactory; + this._dbContextFactory = _dbContextFactory; + } - public QueryEngine(IDbContextFactory _dbContextFactory) + public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; + + public Task Execute(IQuery query) + { + using (var dbcontext = _dbContextFactory.CreateDbContext()) { - this._dbContextFactory = _dbContextFactory; + var result = ((ISQLQuery)query).Run(dbcontext); + return result; } + } +} +``` +### ii. IQuery +With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query custom query engine. - public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; +To do this, you need to extend `BaseQuery` where TQueryResult is `IQueryResult`. And, provide overrides for below methods. +- `bool IsContextResolved()` +Engine calls this method to confirm whether the query is ready for execution. Return true when query context is resolved. +- `void ResolveQuery(IDataContext context, IQueryResult parentQueryResult)` +This method is invoked by schemio to resolve the query context required for execution ith supporting query engine. `IQueryResult` parameter is only available when the custom query is configured in nested or child mode. - public IEnumerable Execute(IEnumerable queries) - { - var output = new List(); - using (var dbcontext = _dbContextFactory.CreateDbContext()) - { - foreach (var query in queries) - { - var results = ((ISQLQuery)query).Run(dbcontext); +Example - EntityFramework Supported query implementation is shown below. +``` + public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery + where TQueryResult : IQueryResult + { + private Func> QueryDelegate = null; + + public override bool IsContextResolved() => QueryDelegate != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + QueryDelegate = GetQuery(context, parentQueryResult); + } + + async Task ISQLQuery.Run(DbContext dbContext) + { + return await QueryDelegate(dbContext); + } + + /// + /// Get query delegate to return query result. + /// + /// + /// + /// + protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); + } +``` - if (results == null) - continue; +### iii. Custom Schema Paths - output.AddRange(results); - } +Additionally, You can provide your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. - return output.ToArray(); - } - } - } -``` -- Provide base implementation supporting IQuery, IRootQuery & IChildQuery interfaces. -- You can implement the parent and child base class implementations to construct for queries to be executed with custom engine implementation above. +To do this you need to follow the below steps +i. Provide entity schema definition with query/transformer pairs using custom schema language paths. -For Parent Query base implementation, see example below. +Example - with Dummy schema mapping ``` -public abstract class BaseSQLQuery - : BaseQuery, ISQLQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// Func> - public abstract IEnumerable Run(DbContext dbContext); - } +.Map(For.Paths("customer$orders")) ``` -### Custom Schema Language -You can provide your own schema language support for use in entity schema definition to map sections of object graph. - -To do this you need to follow the below steps -* Provide entity schema definition with query/transformer pairs using custom schema language paths -* Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. This matcher is used by query builder to pick queries for matched paths against the configured p in Entity schema definition. +ii. Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. +`Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. ``` public interface ISchemaPathMatcher { bool IsMatch(string inputPath, ISchemaPaths configuredPaths); } ``` -Example implementation of XPath matcher is below. +Example implementation of XPathMatcher is below. ``` public class XPathMatcher : ISchemaPathMatcher { From b249923cc5e01e03e8730c2d09983c99e553df25 Mon Sep 17 00:00:00 2001 From: Ninja Date: Tue, 19 Nov 2024 00:05:08 +0000 Subject: [PATCH 43/64] - Update Developer.md for v2.0.0 --- Developer Guide.md | 38 +++++++++++++++++++++++++++----------- DeveloperGuide.md | 38 +++++++++++++++++++++++++++----------- 2 files changed, 54 insertions(+), 22 deletions(-) diff --git a/Developer Guide.md b/Developer Guide.md index db3535a..306c177 100644 --- a/Developer Guide.md +++ b/Developer Guide.md @@ -317,16 +317,21 @@ With ServiceCollection, you need to register the below dependencies. // Enable logging services.AddLogging(); - //For Dapper SQL engine. + //For Dapper SQL engine - Schemio.SQL services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { Providername = "System.Data.SqlClient", ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" }}); - // For entity framework engine. + // For entity framework engine - Schemio.EntityFramework services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); services.AddTransient(c => new QueryEngine(c.GetService>()); + // For HTTPClient Engine for web APIs - Schemio.API + + // Enable HttpClient + services.AddHttpClient(); + services.AddTransient(); // Register each entity configuration. eg CustomerConfiguration services.AddTransient, CustomerConfiguration>(); @@ -414,9 +419,17 @@ iv. Example registration: Multiple Engines ##### i. Dependency Inject - IDataProvider -To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` +To use Data provider, Inject `IDataProvider` where T is IEntity, using constructor & property injection method or explicitly Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` + +##### ii. Call DataProvider.GetData(IEntityContext context) method. +You need to call the `GetData()` method with an instance of parameter class derived from `IEntityContext` interface. -##### ii. Call DataProvider.GetData(IDataContext) method. +The `IEntityContext` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. +- When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. +- When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. + +When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution.. +Example - Control Flow TBC ## Extending Schemio @@ -509,23 +522,26 @@ Example - EntityFramework Supported query implementation is shown below. ### iii. Custom Schema Paths -Additionally, You can provide your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. +Additionally, You can use your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. + +To do this you need to follow the below steps: +#### i. Use schema paths in Entity Configuration. -To do this you need to follow the below steps -i. Provide entity schema definition with query/transformer pairs using custom schema language paths. +Provide entity schema definition with query/transformer pairs using custom schema language paths. Example - with Dummy schema mapping ``` .Map(For.Paths("customer$orders")) ``` +#### ii. ISchemaPathMatcher +Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. -ii. Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. `Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. ``` public interface ISchemaPathMatcher - { - bool IsMatch(string inputPath, ISchemaPaths configuredPaths); - } +{ + bool IsMatch(string inputPath, ISchemaPaths configuredPaths); +} ``` Example implementation of XPathMatcher is below. ``` diff --git a/DeveloperGuide.md b/DeveloperGuide.md index 4bd9031..99ec652 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -317,16 +317,21 @@ With ServiceCollection, you need to register the below dependencies. // Enable logging services.AddLogging(); - //For Dapper SQL engine. + //For Dapper SQL engine - Schemio.SQL services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { Providername = "System.Data.SqlClient", ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" }}); - // For entity framework engine. + // For entity framework engine - Schemio.EntityFramework services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); services.AddTransient(c => new QueryEngine(c.GetService>()); + // For HTTPClient Engine for web APIs - Schemio.API + + // Enable HttpClient + services.AddHttpClient(); + services.AddTransient(); // Register each entity configuration. eg CustomerConfiguration services.AddTransient, CustomerConfiguration>(); @@ -414,9 +419,17 @@ iv. Example registration: Multiple Engines ##### i. Dependency Inject - IDataProvider -To use Data provider, Inject IDataProvider where T is IEntity, using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` +To use Data provider, Inject `IDataProvider` where T is IEntity, using constructor & property injection method or explicitly Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` + +##### ii. Call DataProvider.GetData(IEntityContext context) method. +You need to call the `GetData()` method with an instance of parameter class derived from `IEntityContext` interface. -##### ii. Call DataProvider.GetData(IDataContext) method. +The `IEntityContext` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. +- When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. +- When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. + +When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution.. +Example - Control Flow TBC ## Extending Schemio @@ -509,23 +522,26 @@ Example - EntityFramework Supported query implementation is shown below. ### iii. Custom Schema Paths -Additionally, You can provide your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. +Additionally, You can use your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. + +To do this you need to follow the below steps: +#### i. Use schema paths in Entity Configuration. -To do this you need to follow the below steps -i. Provide entity schema definition with query/transformer pairs using custom schema language paths. +Provide entity schema definition with query/transformer pairs using custom schema language paths. Example - with Dummy schema mapping ``` .Map(For.Paths("customer$orders")) ``` +#### ii. ISchemaPathMatcher +Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. -ii. Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. `Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. ``` public interface ISchemaPathMatcher - { - bool IsMatch(string inputPath, ISchemaPaths configuredPaths); - } +{ + bool IsMatch(string inputPath, ISchemaPaths configuredPaths); +} ``` Example implementation of XPathMatcher is below. ``` From 36e630aee937eb8f347f2f9a8b3abf536bb701b8 Mon Sep 17 00:00:00 2001 From: Ninja Date: Tue, 19 Nov 2024 00:08:09 +0000 Subject: [PATCH 44/64] - Update DeveloperGuide.md v2.0.0 --- Developer Guide.md | 4 ++-- DeveloperGuide.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Developer Guide.md b/Developer Guide.md index 306c177..334e198 100644 --- a/Developer Guide.md +++ b/Developer Guide.md @@ -298,7 +298,7 @@ For the example query/transformer mapping The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. ### Step 3. DataProvider Setup -Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. +Data provider needs to be setup with required dependencies. Provide implementations of below dependencies to construct the data provider. #### Container Registrations @@ -415,7 +415,7 @@ iv. Example registration: Multiple Engines .WithEntityConfiguration(c => new CustomerConfiguration()); ``` -#### Data Provider +#### Use Data Provider ##### i. Dependency Inject - IDataProvider diff --git a/DeveloperGuide.md b/DeveloperGuide.md index 99ec652..e01a546 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -298,7 +298,7 @@ For the example query/transformer mapping The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. ### Step 3. DataProvider Setup -Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. +Data provider needs to be setup with required dependencies. Provide implementations of below dependencies to construct the data provider. #### Container Registrations @@ -415,7 +415,7 @@ iv. Example registration: Multiple Engines .WithEntityConfiguration(c => new CustomerConfiguration()); ``` -#### Data Provider +#### Use Data Provider ##### i. Dependency Inject - IDataProvider From 60e3659160d53f63d82b3361b916984128197b4c Mon Sep 17 00:00:00 2001 From: Ninja Date: Tue, 19 Nov 2024 23:00:12 +0000 Subject: [PATCH 45/64] - Update DeveloperGuide.md --- DeveloperGuide.md | 9 ++++++--- Images/Schemio-Control-Flow.png | Bin 0 -> 110068 bytes 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 Images/Schemio-Control-Flow.png diff --git a/DeveloperGuide.md b/DeveloperGuide.md index e01a546..f580c27 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -428,9 +428,12 @@ The `IEntityContext` provides a `SchemaPaths` property, which is a list of schem - When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. - When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. -When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution.. -Example - Control Flow -TBC +When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution. + +Example - Control Flow + +image + ## Extending Schemio diff --git a/Images/Schemio-Control-Flow.png b/Images/Schemio-Control-Flow.png new file mode 100644 index 0000000000000000000000000000000000000000..cfab755b2a1c353c8313fb4f156c20fce919554a GIT binary patch literal 110068 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 z zy)YJVVNI;J1cd`u;&UWi3MPFa$!|;ctUC!+3|-y4gDYUw5#)+Yu!C?$yK{yP zSx|N*@NRr0^+}fXGyyLV!$42lTDIhO8nhSVMrgbwqcCw9-e&j%;u19vC45HuaT1|I#M$b{V+HIRAk!WC@Ehi*DxOA+nu8p z1*6&0>Rw$eDC*DC0+B`9kZ!kS7gLZ+Fb54RV*{g@X>=7TUMoMNt_lD`pIj~og&_B= zpFDF<#3A`&@K9Gl&c)zYUo>8TQq;Z2eehe4oKou}M75nh4)qqc@zuw3!c8@g$ICC< zHq$rIkF^ie|rbGK=wJ9s22cGczM# zC(@m!%-TWVs;lm2z{ymK3*m^OFrbx=L+L)@z!#)YRQBh>0ABZ43WUgLrr*bR?L0pB zSiZ#1A;%(VENy-$*5~D9j8pb`F(%qz=eu&}fA&tYydAdQ-2htmjm`VsB0pBJ&A##* zNRK%eo@w54GJCX9OE?D;A-yGx!o7bx7fOy{J4j$L6^!LS$h7Pd&Z95Ges*5(Fs}!W z`cDZFV?4%n{$QtU)mD*rugdxr^c$^&NaNoLVt10pfHd3=zUS;C+Qnv%ZaSiq3ul)G zLj&4e<{$O9UCI7GuHG^r%5DoA21ErBL|TwgB!!_nm1Y0|L2Bq0q`Q%lR%+-@k*=Xb zI+c*_?rxBG&-0w~e&>6CFhBS+bMJfYwbou&?C3uOlO{sYrzPIC zL7!)x=VxoV?f<9piBjSFf+I?;X}9C{ADJ{^&urV}&MG^$7p!dFRElmOm*kj27@1~; zO>&to%Oy!i=igqP?NRM&@_ftb8}AOAgc|+qw9ft+H?VSJ=q#qk`19hI(IIAjX*S#O zm15~?oK{^B+W$}QzVcSIabD!^#{QhCAXRRyBRj+PEE?*Gd>1S4z`O8va)mcI?+6SU zng>~ZTFvuoqW+|LGcLAS7;CYbu|5~gN6CVJs>g4Cpx{~~_6DQ<8;FL&4@FVHEJ~hFcC4#iT+_;NYcHpd z`ATfiY*R+QKm#H_DR7xZx6V zFA&UzVd6)9PV11cdyo zcGwi3ssS4B_aZwZ?KyU#a$lgoBfL|pgpRMIj&@ceSH5_<^)B9ySl1M&6DiSBHzW1?cQHAVUL5JkCER`fPy^}pYCl6&%7ijt3K6*yW%){q)gKK-9>jD?B@H0RCzy4SfpLxh*;>8>n7Bm5vp;^V4+Z1X)u}ut<~Z_g^=2<;_)%SpLG5hot=*#_HZOxZFR1PY?oa#zP! z+a*x2`La#l*#!|Q#FG9OInP%?dvy}wWHe^46^dl$^S9 z*;}5a-ws48%8V5I`5!-63t>MTTNaqVRA5YKblu)u&xzmv0#yn(i#W}1;arQYJzBd? zv;F{-JvC8=Po{A68KiQPDOk|l?A`8e&y71m2#0H|=Utu!asA&CM`Z$fsZ2`TSvg7K zF(J2;{3^fai?)kDPA|2Ovx_wRSxl+;t1ic)o=pLAwtM%7V2dCvRmQ(DjeB!RD~ zDEhX)ha$ihd&Xmxd;-j30=l@&hhN1mOwacUUByMKWeGQ1M9|0+$)}F4gr{j*UUpW` z*g@fbJq@R_gg7Ax0zcPdi4b8qM8(#G~JaPRI0(j!PjcI*B>X+7hnq zWV@V?7QGj*9&#Chh?!O=T-`C%xl>F{5!A)mpBIam$Wv3AN>|2+3Gtar7QQ`s|9ch- zNARGfJF$x7pqmjqJU+d|59b~M3BUiYd3$Qh>yn0-pgn_w{wVi|WpYq+?5~Hx&;-)) zg^|Hw=OMv84!mEE6JQ9x=ydtsT4>%+28+mIkQ&mVXYdky;Ih8JL-WG3mR~3eZouO6 zc*8&sdBIKiwwlw}j|Xyh*HKpxn`>J6pZfgepQYxgA{Dt@!9QPm?>qvC3#V)JstCnH zw+}7@S8_%5ZRVq`FM^&cy9A8lVxbL*+%@!Z{VCS2k7-e{d_!o<@IWjQtoNH1e`$=3 z0h!r|^?@Y1>-}c$H;x~*D}-;9X`33Q*O;#~!KP)&7k&g!6|JDf&QZ&YE8kZjH||RP zG^-W0@NTmxQ{vysBPxjb^;bP&nceHg1tbyqUUvo(3bmO(%Nq5KBwpJ^HQB~}aoH7L z)>&7LV*~uGDh9X*wT6zu2{{CDY#B;2LaK59aepWhMBiECbUiZ4i(22VGNO=)Y~qy? zR!6{`t`*caCku)=EvE7X$+N~9Fh_sr&`~n$&{{WLmz`|QC`XVX!b8uiDUWs9LK&>v z3I26Gd4$w;&a`sw(_j-S@6%}8sMViG2|EJ<#~b8?alI;g@%{7IH+o>IZ3T0lv6Uj; z%Rkn>KW5;@@&de>J*t0RPlg`YbeeSz1q~qc+5LL+a8*0)PgdKoS|N9L#uD1Da^_2-!p&Wpu?sW#fc5CRwu=pon(;Lvi@LBi{;Ds{Pb8Z%s9}A1#M!OTw zf4->HV{ss6)?9J=vOVAI?Gg4fN*bf#Y|3KLus|#b$ExYNp625{rRD_*ScuWYqe67s z0#>gWh=^}K>?1S5UhpAhcd*n6vv*f1l`>l7U&FfRe`@?rHmh>nIRaY<7<3r@Lm;&W8K|3=-JI*Fx28D+BtwNtc2*>rtC9PIBoxtPvo&q zl{G10abs4Mh%uptNXT#u)#1XA(51>IaDOF@fK;;DL981CaL(MFk`+Rwc8=wt%Ba(=?f8uiJ8#ofPv^nA7>T-SDFO zS3?GtkV8l|Up&R%E{A7cDnlv;Z}8(o4$ofAahBqs<S_WB$&PrPPb)hinMy01gx1o-K_@#F~2D?d(!|c$mDUZLdsSX2XGDhzS^kriKYG| zwG^B@fv1<+jHF;XTYxlpWNouAVFI;;$kkr00#25e;a)42Acc zcn`sM>nmd@_vY;@u<I0^g+G7_o^Qa#Tm+3i-k4bl~iQaTcUCQe-6p3lEyMx454 zPw6;K9@h)ITMVy*tx{`&A!Ynjaj4QX&GUoX*-io;Tt&R{gg~iz1_XWU%^UDRrT2CY zo#~Z=wOkOnQ#|xf^7i8Vf|qUAD_|gkO1t4f2p{CL+}7kle4HK&TMdoPkTAnjI=noa zwvODieBGo`9U5B&xYA0G3OdS`zSM^oFX`edwk zqk!cA<~-||1B?%hy1%|S0*B$cnmf&R$OHD# zMHi*_4D(9`zEuLg^p6=3E`HhNr-G$cnI70Q@8;uCNB8Ei2q8As#PhM$SLDAX-sSmjt6f}H^{&k zu>qGh_iG5$^s(jcTw?s|y19j$pssd@2V>itzO)x0k!M>#0_7N?jQL9%5Pie#+r; zSKf}2zU&hLYhZjhSTEfee{vuc$tg1YpZT$qy|UQ7&yM7F-7l&d5-R@!jE5F7>#`h< z90JzY^(VSF~VRw^pK@?c+H?KwAxmJ;-75Kv~R=nWri za18SPbS1uAO#Ns~fHqQY+$X+|O$5oFC%>L+mx*EilRv@HFh_X+VGoN+Qb-hrc@jQ4qiE4oNs&bIe|}*Q`msUJRn_^*o=Y+iEp( z)KJJ{Gwejz)X6PHPP!}x5ce|I%q+ESIl#%8Ek3_b7KCH)L55%usX{Md0g?8u_8fYm z<$#mEz2o&1=hPX;aqR#ViAly6>5F}8+K#cuw8M%+`Ntev$(7<=XXVgF_>B|evnr4Q zT;Bu5Ky4N|Erf7;lFYWiZvCl{A7GG8WUhv?G~r@nF|;=#n{qM2!d^#Ihb!MAWqsSa zQkFm1kPqZt@%)(R(I2l}BYu=V;$4%-PBZtSCJa3(6_mN!&r5at{^26oE7u@8aJ0aO zKyIVR8|hBDI$;>;*!I2@LKrC-PP#f(roDRN0Z3LQlz$I`3V^pwS@!hbk6Nu+F{x1h z=i_|4jBEa-9!|DXx4k-&+77=Z>;N{R^4OVQSrF~YU{S64Di%wvVzww#0a28i!`NAE zJwJC_t-ZYTvX>~b7z6CR&CWtALiovKC!QPeF?dJ@9m7a2TH0 zK_|{r*G?!7lb!jh8rDinQ9$=ThkP>%g&LwdC7rh)xmt1jlVT}Kq;qW%vD}aL#`>mTSs27i0BbDR0T((r%V4eXhS^n`8`AAyr{&PSBhr^C~UqEQA`x#pe8odY8 zM4AV$9iy)J9slH&A9L?!n=e1eFxhVF8!C7sT>mQEYOlJJFD)e)3PyR~!0RTlWjJ3f z>cwM(q=2HS0Au`fwwXBU4*Hhig74nW{_AhhQ*$Ama zr)K1-q=@wsZfA(0H;aJe$eag;;mz8R9 znjN-St9qgU+%!tQb%t;C`DhF9WfW*c2U^+Rm;bsS3T>{lu=~veMF3GNj(CB%6=8KM z*|m7jRG(uE)b&$Dg^hKn`YCLfI9mogbi~wB9;FD2%X4j9OjmH;VMLzhFr;4+R?g+W z8rbJJ*trRsDzCGOw49^%cr~S%`o5_M+qg(tre|Ks@hb*>hAe~MWUN_a3E94FmNvQ} zZ1_McW=4AroFeh0PZ z^Y${+?BDvVxEYNm2l;4WlQ?{J?%|$9Vh!;ztZ096#IHK7(mc;>+f19Jlm+3#%*i)H zj%D`q+B|*#al*4%igqO!`=QAo_Kr_Bw@J7)qnu}#Q4?EWm*hMF^2mAGkY&=mM(87^ z`V|j;rN`jZS!U!qbiVN%-VrJsvHP;m5=RR~V^{;sozBU`Yd=!!jmu$&lid!_sGO5= z{h)ieGyL0?J)zr(1r0*Mm$R~@d@z-(lWIMbtkgHsQ|#xq+i)8AT3dI{eVrKq0~)fG z=Rz?%$3w!}G2cyr*cf54w<5F5eJxk=(=EjVNMCz*G_3nrN)UtE(OQ*eG%R<==Ia69 z+irj|cSGE*S-VQ2@9*wmP_nk>hmxQAw~yRP;;yE`5Gpr?fFqjCk}!lsJ^42y4A0(b z6qQvHSJNuKST3rWvm?Wquy3S|`SVi;Z~M4WxMG_PO#6Ppd#{f8N!au)9?VLMMp_P= z5u~Z>Gshzc;-r|quiqc2;j~?9*X)U4c6Aw!cJsbGMedcn?p*o#QBn-TgtPga=)RuO zO!Ir^2JqRXM@faYEa3=(pHCl!K;1aXW@OgnPnJSitkxifJU)v*gG`wr33@B;ESEel zM3@GL?y`3`v_kOT2`T|1pZ06@2dib#|YzCjA+=_~2~^;WMEu zSwgpO`y^U?+9)a9>BdFmuW{jza%3-&ud*Ku`}?r7=3|Us{~3Fm{&M86fU`}iTw=6L zV=|=CR8ym!=5ER)vma^yGtSXyB@g86nr&Z0ILcC@qe6QUzfp3R#&6zGZ^EKcJ`pPbB(%xA`?`6a*Ed%+dlR*PxCBOSUXN8h zvn{w#^97b4cXA!LLY7j!fSfD9!i*nvL;mWvlGJMoJ5=r$;fJa#V$s+iJ^eT+OyX=hixn@FXaU3Qg8# zUYlPwlnaP&AH96G-v)YH^0ZR_xz-x&xC1adpDSSHo~>e@_MfXT9a5+r-5od)=@oj#s5nq-^6w-Q zc?#&bwzHW4;h}1vt$)--B%3*9Jg@oN=jPzgED#|NU~0fZPq^gyTepLTFo3CYLj2{e zxAsz002`TE;~5SR)K?Wx+9J3M5wGw@I?lY;7IVY5C4}8%_Zm2A|6wWI-9O19-Lap) z*K<^zh^W+Sts(Q9$Y2TPN*)+mB%p;{Uc#y@S(}w}Tp*in>%XWY;U@A)GRH*BIp!56 zcZaMY3Y=rx%P|b^vw`9OKm_>2f%(k?(K45`W9~B7XTOdsRtpI&-tObO@03^p^qFR1;+~qYne>y?ybcIhFux|&amffJ=4PQS8h47pqJ198rYQ%-Mb(A5 zfio+X*Yr1ZTbUrbczg2`Kj*$DkwO~9bvqtBZdV@!7Lvly0o*GPO~=-n;#P@%v9-}ZY6g|vjU!%+6&YkQy%w0AeVFEZbf}7t}%Ow zam8V7!btx^H9%Yoz^OOMOF9RQ)^aVuSS+2VkiNdHlar0wI!FkBs08mg2Q9J5rJ^5Z zTj8XA0RbP};l|;1GzSVFzzZr|*Hu|`?np~Xs$sotq&Zrs*#C3o$M0T{@6awRWL(HC zuieeb2U;xtoKK*|s%&`u9XQ_Ew9YOwey?!IwM5UH(|^gZ6xFOX!;qKu+MDwD%MEY< z!1IWO)>ymi*3e_ksi0B)0H<%!-aO> z9QJXw!eRzdHm%$^lVKa%parDXJx7^=t`PHQz?P>G@kjc;(AE*`5$!R~V5962(!wYt z;ny@VJY-g(c>Ln+;5fnDxG<}#u+~`-hu;r?Fo`v8mjV4@o1}zu> zq&rr%4yy{&vx5Sc3-U$*T_Smky=qC|-9zYGsx2~Q<#w8Y?I2)fHJP5Zvc0O?^N-@$ z(&z;qBfsZ9>p-Z%{P-WH#SIFZvZEWwf~rKh9w>tJ!g}Ff`4M#b?W) zfBpq7G1{8Y)t{igRm%79?Ede%)>xBGVxE%)(0eslUmsyzWzClfq-wyNYpKT zmR$LTQ8+qxdN{5q>f_f#Xsv=&t{?F0 z4ZtkbN}82E10CrL?i`*%*Y}|q{@}FcD|tOwSy2?%hwXPeQ`ANzeetDYNOt3&}1OR^Ay!?rQcqyK_Y|H%(G)kC!;} zah}v0&A-0B4We6n0WrSEld%qbh8z}H1(?BF+|YLQj%^#?2Fedt8!v|uBG)OcDu(es za-9?-l*mA>A$=^@6Cygw0|uu*O4ZtBzz;d~A!5)6eZfF2K~Mt~A!@t=&|5W{494Hq zT8`J&jz))Zg^XEe2!UYmvHT z(uG+RG~$8)4)_Jt(*XWMIGV9Z&rh*|irI}e2J{aCxobSX(h#pwic*!*^JHlCF5{Ro zYC>eMmfe}nrIUfNla_a7zxAFszAZz~J>8&PFcuX=s7?W2_9Yw-u;d+8aZ^}GaUez` zdYlAIb|GE0wg&_NI1Zb>-9+1{L}j*E>Ex8^s-YzgV|?vJI^_57N(w%Bks;AWB>Dx4NiNq9Aw#V<`ECZ_!oM4)Zu#li z!14}yRr~jL=^HRt=;b!(u;#^FiV8_*WIElQR>R?4@L3Ye2x!N1IUQ4z@Wv6jIT-Du zKXv#+ZgRV=ML^E9+9vSGJ?lI5mg!~wPG;%`W{h2g^+yeWYH(LNsujX$8n?f9E^*ust{gXE#{c_ z>x(;+6~-&w-|X5j>8Myc9NA+hA%wA@XW#YD*_*8w7^1<-sbO_%Y?|aMR%+x1YPFHE$ zVrQL2;a})2DkmKNf$YY-iU5Rz9JB+psvO)4qr&c%QaI)% zm&~hlHt&7+y)*rD)~<{BQq&_TpdHD7QUTF=L4Zu}Hlg_$>YyVJk>Jif1pu&v9xIk@ zFyDXg8F_)89HgxN<;y-ByW<~&XFSIod~4VB%Z(~;>?IrHD7>u#Pv+dRJo2_{1Z=7; zC(HjRBr8GMk0ng8Gzj4U<=qyiAq10+BO1-x)z2WxWUsO=pE(lCVcmv@h%yk*DNR0? z5CTL4ML9|GoaANDO6n>6i*vr9LnhG!STCk`<~vE4?8$+?M;iwE&u@Q)52+K*&BJ$U zq30u*=uE!(kZT)^dMSo}QEr;4Qs`XxO)TT<64n@XO0RZ?I{*5Q; zAV_mBc#>twf}^J(o>s=slic%qdZbQbP2|a9OZ+Nf1ZZ4^<2_=A;J??N*B^u~oP@S& zzDaDN$G)X{gMMT4O1r%=ab#F; z%5O2M*ZH2O?DqhBCUO@qk5DqUpUl=g`kG>^flScFX3$W=*9a5_*-l;w6PhJuBl?1T zar6)%E4#Or)-@OfNvVz#o_3&DvNp?AK{pxDdTGDrMIW>?!xZQGMz+J(iAqrxZH+k- z3j<4{9LB@QySdJ^1Lb@9yUIA!M%(2Y8C#5;lb;2916*GGNt!Sp!lh+gtUA&C4sfTT z)py=k?_b2@>;5^{VgJ@Mf1hLP5==jxlONE5Ji>d5t@RO~e)V~mJ;Q?vAfJ5T=Yz@j z&ngF5H3*&CKNE1xNIvoN;+t&mIix!{7z&&q5~>8qW7J%D!|wTd^@pWU*{eH){#9j2!|{Xn{-2dZ`iNV_zlVJhWmxA07fASh zkmf=bl`Km>3~^7fBQYM%hd-B>*LuD?YIUdIUd3d&S8AZ64Jmj?aTnccp3PbvH&As< zXd*DQ(`7MUMfo%X{p(Z0m>bGlId9z9D4vG8Ums9qyn&6--C;nE0aG_t#_CX2sjJ$6 zy%MqS7-=d2_q*Gn5UxmM!dr32cbv>mTg|GDyvn3j?BxTn^DJUj8z_sx^%&~3$i3rX z+f&W(w>cPVC7R_=uk*D7JT+x1%CA7qP+Php(Qq@Xqi;obzaL&bz}-97*rbiJndEq? zKAc_AF{O#Xt!KdUm8Hfdh-VrP4`{#Cw;gLJebQQ2*HC}NZqh_!{3o_+ z&;V1`%UTxvtS21@AF{mSBHz!K=5YVJZ%F!u!3^#(8tsaBItfpluR#NV|L z$E(PdxA%HcByVWtbQ<85&Ty`^8fhUOiUo(5-*XhB+C&FGBm%$CK(Mc?z*&$&~Wr)52#mxeEe zYb)GK>*{IM)>V;Hwx;RB!pkcvKi;5_p!!OW*7TJC#JEIM^5Ww_tjo92w*q{Pt;*B~ zCnN9rfNlfxD;^&GYFoYk?DvWS@O#E5>FHtu{*51vK!j7)|Nf%CT8`LbioP<(Ea2Xo z=GP2|KbRM28>^&suFvxn)VJnMEqETBt?|W=vge_OwDxS`4gLexUrqbd%$0ZPwXkM< z#4zf0_5)^-=C~f0iXk(cJsHt3=n(%lQ|j_g_P;}2Z{H}-lt1<9@rqwVzz9+7Xs*35ALa;Li9sf<0=d^GLE zBbmEy84_%qcu)M;7af0aYrVmE=-KQ0RJfR^?b*_-otaUx2M*!)yV=P=Pj-chT#1uL z=)6H$>gw{Sl;vd{SP7So5U7ls9@1L_iH+E~+);qP)Zkl+1HEW)F~a15!Q9u+XwhzL zn~}R_Dwx5h;q!eQM7F~!b_aTE)i=g2yfA+1b*A|-VrEXd` zYP}`R_3lX#0*LB&FS735T{-u(Q;Ynz%<=zAU^|3N}6l#Ks{7Wb(ArQq&L4zLMmw(S-B>8L@6D`PIq{;I)>e5e_7-YUrJ%~#6e#*ZXo(b@6Oc}gwW9YXk8`3?s^@2D)C z9f((q|B13?^?#xa-qfKi1ai>O*heS`^p_npx9s_)Y^HI^W;dp(O`+A|z}vR!!&I>te*)6PjqZN4Ee3 zw@-b?c(6gHF4RTr^J5q3!0=%l*>Sh{pblrl{scXhqgJ^fGa+&W@9#4+35G|;ERV0Mx2KQ=576Q+GT=-IZ1FRYx z4(McIW>a1Fgt0;dS@Pl>5+^a>PVW1)5BB5C&@B8;UP>FF5_*%ZaT&RWq%t1_ZRh? zH;#C2VtEoruM-1uxc+InT6NFi<_@USEAQg%C>Hrbo?iY zgJ|~#TAm+tF&=707o+uj2){+;`fN9Pjfl>DESUVGH>FPF!wHsW*5_0UQODcs*^9e3 zJLoXG=>BLfB09$zjs-l*Kp>;wIgKkZHxL#L()ZcAi?KLSGJyz|owa@{U&LAq7z|k;;j~{L ztm3T3?!@$rZ!#j2*Dd#}-sKa`Q%H$$yigXF#LUhiOivz`D3BQ_cW^CA_9*VQYHSWP zgy^Ro8l%HeUbfDLvG_=%m?55T-vL+=ichET*nk4nYnw+N1lBMf=K}iukv_(1wSUz&j-y4SM`xCtH{3Q{F)R*+_77p24Uf!yXZ)QFfkE zM|sEQk*0Bh{%Lt??L&lwmlb&sqJyuQU4e9Na7dwrhNnkR!_Zc_O9&OhR*GJV#?V8? zX+~8R6P1&~b`m-v$2x2~majxjfA0gMQESK>0tPkCvDO@L9psv!YW%Yfw;Ph#oCk6t zp#6I~_2xNy={aC%6{4a1?B4xTL>5jVr1`7`#mB)0^Kd!r)245v{!Uxz+6A-CIx1E+ z7>{ppu=1z5u02zge4^6;v@SV8eh;4v^3;eE5Y(}5UB_11??3&hnDsK2MJo!$quaOy z9cAIuY*pkM%e?q{4862>W4WDhTs|2pZACm3#S{h4_r(O*45u@CzrJV)^Vn2-Sx_SA~?426n z&cU8Ot5Ty`0O3dbEN4k$PX5SoL_K-bcE|^+$3)I&=a1|B24XFvH<-+~)$+dTqbebB zXocP;6Rq`tv}97qlWgf$w}kL?vRV^}up6IQ2nElBG9A6_CU9dUqZQUt*Fgu^5vaYN zJOOF^jnCIX4|Z_fMm%&TGWG$4BhG|*UY@7=2QwM94Bo}odWXvX=cUo?wc1PdOsjkG z4!2^s)(@0598e@2iJq$WBALW)XWPZu^jY;o8BK$%?RR`8cn@bgz1jkV!#*wA53Y2! zFx7Xy%%#@($cFH5QX+y}^;?a?bxa}p5j$x4ATg^=OMee)eAGF7ZeR0jplIt+K7ouL z#T5nB$a*x9^6`{0fgh$R6OPnEfI1xSyicq*&Od|y@Ui{yfx>4DF{gwOQ&*mzad~9? zX+MFyIkfc=E8RdQTN0?%@F;y3+Jh06=9{;GN?7g2F@S=PBcj85A~88PD7pMY`@7iV0T zlw_7?zZ{|RyYQ;(Vt0v=-eKn{DpWOGY`nUfkZ`aaJ5tGcYhIWb=LCD{Tczcd*U`r_ z+&Hd^WAxmSqve%t^V`=rVWJ{={_iB2*yymW;WO-`tjdQ>`?QyJ=1dA(h{9Hy!ACrf zTPpXNWWs283d}7H-#pF*^lK%cAsORG(~}KQ*)EfL;V7H8bWi3X{3IT#C*o7<6N>u6 zN7AN#kr!gp8tiz6HYGU;3fM^feiKxW)mH2INbo)UpnKjfVM6X_*~kkU&nb-h-)cWd zPBws);Rv!Dkvi_9Ea<`(qpE%`zT|P(ad6v-V^l%d=%4zz|FDA5T39NahTd{JY$!tS z?F(=@)n6|*PHhitj^=pc>oZR>AH1r3ayESM&Q!5P>$~EI4{>!57s6IM-BC`SVzM9D zpKK_d!eXGWTJS_4*fhLC8ZV7T{_YsTp^c6XtV#O7PdIdB6;+bdxs)AIPXt@4Aq8S5 z4DsSbbr<)F=Jvw?_*k~>*3q`#%92q~pI)2G~$spEnNU$&Y4 zGWL-`IKbhc@#FtG@MyBgru8BKO1?yukn?hVf*mClB%ju>Nl%>Br-ct%#>08$NWRpz zhvmq|GT!fiE%B-M0OaB5)v1Re=_w*hgYzS`v1Lrl!tdr^B2ypIUrL1JQ<|`{iH&v^ z=a|ExDCZWFg%I6WSb<&VKH%=U2Pm|{hPA669W6-XnSu{Rnxnb$WS~~aXD6b6jX||_ zT5Njk)6?Bnp_!J#*)UuAp}-~1Ioe~E6Iq#G_jR`r_Hv{fr zj1OdD8C7AmitPClG^Jn;-7%F9tF^;*)M8I+hx8f!v6;TdkWl_5*IJNO?EYPNZqsz{ zfe`7W0HvpW;PS%oa7VN9e(L#efvn~n`*Qp43-7|!fV2IEGMcgCae7LZle4ezjkb@( zBdX&wqF3`DB3~%GvohUzolZVd|6E8@0dIlf+Au_&D4$;&?T?Md{jJV)8_ZhB}F z2IZN#hh}@Fq<6>K!eaUDO>UP{p4N|CsUwnkXDHj zJOihQM7PJUrkV&(@5A^#6ZQUKa+bx}y#Mx^>y^#U1Y1=x(t(KohKd`7g2XBe>nkZ< zjVY0p8`UI-*j=^T$%PDK{5KJyTCcCr>ei1BmJUqSYq<*Jl;963pZEw>ZFBc`K@zz< z*|FWqSZ-^bS+vz}Uv6EF9*10>xI{K9C6QSv={?o0FqO;LvG4o+YaG;N$Yx@crOoEt zYbb*aCW|o&r1e(4g~ofwct?iA@b#qo80D~Y7ZWOE^BiRc%cjY$PsnGM<7pRe0`V#y zrg&5flG*)E=u~CFm~*>gY;O*<3g6atR?fl0+tWWPjl(@cU8Ldtfo{|`sdZRW7MAK- zEfGq@7(sSVsM9I@nfdS3Ikn2$bc!~W1+QGXr8jrK=-S0TjTfhAD)9IigKW1Q50y)r zt^SnMi~Eq^eeq~iOV~4xnBUPUDdem^ya%sLKCVuG8I4MIH(Abo80DUgH!D3cAx6}( zZ(@}$b6l->JhiS^p_!w)AbX3g%}(N}E2kkAz&=u7e0vn5N>9zou-w#su}B1eyrz6N zcbA@IT~F7Ijbmkp65H|;RLmPb6zawq|2r=Q7Hlt;gGu?CISHZqIT^n|&ukK^^bc;N?mn# zEI<2Byt*~Ub`J(FtPyn{0_VMl_hCohqxb}^e4x^LpVy!1#4iMJPGfy2KTPIqAScqF z*qd>Pd-&7)Xr3GE9g=%X8JQFYIcOz%qM=>a{TxH+ zEp(OPe?@;tcdmjgiwFB$eg_!tTaqs!wmph(+^_vDp0|jhzx-q9hgjWBY^-<}{%7_? z^e9n$_Ax}?vUy)XZpf1r&dxEMFEML3nyJHQ+(7!o?lI()lz+swhLb0c`zj_-Tt4Y<;bn>g%zNvA)V7*lBOC$~L@px~Wzk@!5vKsHgB_iiMVaxjbhPC)!VN7=if93n^ieD!Z{A3g5W z8Ed5}JZC&3E>;u`8N=&HHLlJW`=s@o!Y4;9bzdH(WWdPadGpwj{jrefxR?=>V;i#q z58CPJYFOciAFc@QUv~iYfdX?AwFh?jeLtR05RwZxWjA?Vck=Y0wk_>SGF11LPQ zPQOo<<0=}SqOkv+$M_TP3)RC!WeP!uBp81V{9&W3Xxb`Bgnt6t&jSv2At~r&L_WiS z5QCjgKu;T!Y1>XpsKfqoU+H?D|zNfg*{ zL2&`s@@P`H7KOAuJSg!Ll-$#{ zHkh8QH6LROHv7h%%9FkcsMSOGMSy?w0^W?pg2~SZDbZ9ioC|pO^jy9TGGXsv zdi(_niQi!GV|MrVwm1KNH`?+uI1Wau4mijjhWl#!E}_CF)J?OdWR^)5l!3VA9*f+L z-MJHZvu83-n|OGVS2cL@XNMe z*cN*rzdeEtn^$05&43QMt0Ysk##nO>+4Ugl+i6i;(GN~qF&HJ()#>x?%I5wD@TUDWInL9_lMt2`p?snVC z-xB*+uREl+rF3Vs0m1K&g)j;bpPhZMKL&z)q>qv%SLixo$TtZ{UPOn~Pl}|gWpr@gMGJ0AZeOvPj5dFDmL1{i z0-wu^dixqF6*B&5sfRw}McO$qwcl_Z%CHv?+r_cXA%0<84?U2`jG(t8VE_tNLB;`;W27xS75z`tRco-DflC zkC(U-{6#lKulk(;xS>GkU2N#V`mwXF169Y!T%)^u0`#%hAxU&A3}n1uMu)Yi*i;9%@GxP@IptK#G;9Jt4HPHP+ z-D56fs8IZ{_pX&mb_hi@AvNh0s)%qs>+;OH%-%^Xo56*g=esWnF6`|jKDqb+_<&DzFKcef}-GYukU zj`yhEOQO~_tnocEBR%+y2R;7?md;N`(s88qg%6b9BIwOCYD9L8{*RI_z7Y*k(99Qo zFSAG#R$#^5Z(MdGG< - /// Detrmines whether an instance of query can be executed with this engine. - /// - /// instance of IQuery. - /// Boolean; True when supported. - bool CanExecute(IQuery query); - - /// - /// Executes a given query returning query result. - /// - /// Custom instance of IQuery. - /// Task of IQueryResult. - Task Execute(IQuery> query); -} -``` -Example Entity Framework implementation is below -``` -public class QueryEngine : IQueryEngine where T : DbContext -{ - private readonly IDbContextFactory _dbContextFactory; - - public QueryEngine(IDbContextFactory _dbContextFactory) - { - this._dbContextFactory = _dbContextFactory; - } - - public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; - - public Task Execute(IQuery query) - { - using (var dbcontext = _dbContextFactory.CreateDbContext()) - { - var result = ((ISQLQuery)query).Run(dbcontext); - return result; - } - } -} -``` -### ii. IQuery -With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query custom query engine. - -To do this, you need to extend `BaseQuery` where TQueryResult is `IQueryResult`. And, provide overrides for below methods. -- `bool IsContextResolved()` -Engine calls this method to confirm whether the query is ready for execution. Return true when query context is resolved. -- `void ResolveQuery(IDataContext context, IQueryResult parentQueryResult)` -This method is invoked by schemio to resolve the query context required for execution ith supporting query engine. `IQueryResult` parameter is only available when the custom query is configured in nested or child mode. - - -Example - EntityFramework Supported query implementation is shown below. -``` - public abstract class BaseSQLQuery - : BaseQuery, ISQLQuery - where TQueryResult : IQueryResult - { - private Func> QueryDelegate = null; - - public override bool IsContextResolved() => QueryDelegate != null; - - public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) - { - QueryDelegate = GetQuery(context, parentQueryResult); - } - - async Task ISQLQuery.Run(DbContext dbContext) - { - return await QueryDelegate(dbContext); - } - - /// - /// Get query delegate to return query result. - /// - /// - /// - /// - protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); - } -``` - -### iii. Custom Schema Paths - -Additionally, You can use your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. - -To do this you need to follow the below steps: -#### i. Use schema paths in Entity Configuration. - -Provide entity schema definition with query/transformer pairs using custom schema language paths. - -Example - with Dummy schema mapping -``` -.Map(For.Paths("customer$orders")) -``` -#### ii. ISchemaPathMatcher -Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. - -`Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. -``` -public interface ISchemaPathMatcher -{ - bool IsMatch(string inputPath, ISchemaPaths configuredPaths); -} -``` -Example implementation of XPathMatcher is below. -``` -public class XPathMatcher : ISchemaPathMatcher - { - private static readonly Regex ancestorRegex = new Regex(@"=ancestor::(?'path'.*?)(/@|\[.*\]/@)", RegexOptions.Compiled); - - public bool IsMatch(string inputXPath, ISchemaPaths configuredXPaths) - { - if (inputXPath == null) - return false; - - if (configuredXPaths.Paths.Any(x => inputXPath.ToLower().Contains(x.ToLower()))) - return true; - - if (configuredXPaths.Paths.Any(x => inputXPath.Contains("ancestor::") - && ancestorRegex.Matches(inputXPath).Select(match => match.Groups["path"].Value).Distinct().Any(match => x.EndsWith(match)))) - return true; - - return false; - } - } -``` \ No newline at end of file From d7354bbb69560349423739c15d1a39acae6ca58c Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Tue, 19 Nov 2024 23:02:43 +0000 Subject: [PATCH 47/64] Update DeveloperGuide.md --- DeveloperGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DeveloperGuide.md b/DeveloperGuide.md index f580c27..651bf2a 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -113,7 +113,7 @@ Execution Flow Please see the execution sequence below for queries and transformers nested in `CustomerConfiguration` implemented above. -image +image #### iii. Query Class `Query` - The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. @@ -432,7 +432,7 @@ When nested path for a nested query is included (eg. customer/orders/order/items Example - Control Flow -image +image ## Extending Schemio From 134f7537c77d5f56ab88003c196f81470eaa6788 Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Tue, 19 Nov 2024 23:07:22 +0000 Subject: [PATCH 48/64] Update README.md --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index da9e860..b37c28c 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Schemio is perfect fit for many use cases. Few examples that require the service ## Getting Started? ### i. Installation -Install the latest nuget package as appropriate for Core, SQL using Dapper or EntityFramework. +Install the latest nuget package as appropriate for `Core`, `Web API`, `SQL` using `Dapper` or `EntityFramework` using commands below. `Scemio.Core` - for installing schemio for `bespoke` implementation of query engine. ``` @@ -43,7 +43,10 @@ NuGet\Install-Package Schemio.SQL ``` NuGet\Install-Package Schemio.EntityFramework ``` - +`Schemio.API` - for installing schemio for Web API with `HttpClient` engine. +``` +NuGet\Install-Package Schemio.API +``` ### ii. Developer Guide Please see [Developer Guide](https://codeshayk.github.io/Schemio/) for details on how to implement schemio in your project. From c33cf13de0097905f820d21bca844e50ccbafd63 Mon Sep 17 00:00:00 2001 From: Ninja Date: Tue, 19 Nov 2024 23:12:48 +0000 Subject: [PATCH 49/64] - Update Developer Guide --- Images/Schemio-Control-Flow.png | Bin 110068 -> 110412 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Images/Schemio-Control-Flow.png b/Images/Schemio-Control-Flow.png index cfab755b2a1c353c8313fb4f156c20fce919554a..0f3c7db49c2f0232f9de49d8b2dd94e093718966 100644 GIT binary patch delta 79587 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 delta 79180 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�uVx#q8Z8qBx{p83d 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 Date: Tue, 19 Nov 2024 23:55:43 +0000 Subject: [PATCH 50/64] Rename DeveloperGuide.md to index.md --- DeveloperGuide.md | 570 ----------------------------- index.md | 909 ++++++++++++++++++++++++---------------------- 2 files changed, 471 insertions(+), 1008 deletions(-) delete mode 100644 DeveloperGuide.md diff --git a/DeveloperGuide.md b/DeveloperGuide.md deleted file mode 100644 index 651bf2a..0000000 --- a/DeveloperGuide.md +++ /dev/null @@ -1,570 +0,0 @@ -# Developer Guide - -## i. Installation - -`Schemio` allows you to aggregate data from heterogeneous data stores offering `SQL` & `API` packages out of the box below. SQL queries are supported by `Dapper` and `EntityFramework` engines. You could also `extend` Schemio to provide your own implementation(s) of `Query` and supporting `Query Engine` to retrieve data from `custom` data store(s). - -Below are the Nuget packages available. - -`Scemio.Core` - Install to extend schemio to implement `custom` querying engine. -``` -NuGet\Install-Package Schemio.Core -``` -`Schemio.SQL` - Install when you would like to include SQL `Dapper` queries to access SQL database. -``` -NuGet\Install-Package Schemio.SQL -``` -`Schemio.EntityFramework` - Install when you would like to include SQL `EntityFramework` queries to access SQL database. -``` -NuGet\Install-Package Schemio.EntityFramework -``` -`Schemio.Api` - Install when you would like to include web api queries with `HttpClient` query engine. -``` -NuGet\Install-Package Schemio.Api -``` -## ii. Implementation: Using Schemio - -To use **Schemio** you need to do the below steps -- **Step 1**: Define the aggregated `Entity`. -- **Step 2**: Setup the aggregate `Configuration` comprising of `Query`/`Transformer` hierarchical nested mappings. -- **Step 3**: Construct the `DataProvider` with required dependencies. - -### Step 1. Define Aggregate Entity. -To create an aggregate `Entity`, implement the class from `IEntity` interface. This is the entity that will be returned as aggregated result from multiple queries assembled to execute against homogeneous or heterogeneous data storage's. - -Below is an example `Customer` entity. - -``` -public class Customer : IEntity -{ - public int CustomerId { get; set; } - public string CustomerCode { get; set; } - public string CustomerName { get; set; } - public Communication Communication { get; set; } - public Order[] Orders { get; set; } -} -``` - -For the customer class, we can see there are three levels of nesting in the object graph. -- Level 1 with paths: `Customer` -- Level 2 with paths: `Customer.Communication` and `Customer.Orders` -- Level 3 with paths: `Customer.Orders.Items` - -If we choose XML Schema Definition (XSD) for the Customer entity then XPaths for nesting levels should be. -``` -- Level 1 with XPath: Customer -- Level 2 with XPaths: Customer/Communication and Customer/Orders -- Level 3 with XPath: Customer/Orders/Order/Items/Item -``` -### Step 2: Setup Entity Aggregate Configuration -To define `Entity Configuration`, derive from `EntityConfiguration` class where `TEntity` is aggregate entity in context (ie. `IEntity`). - -The `Entity Configuration` is basically `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. -* `Query` is an implementation to `fetch` data for mapped sections of object graph. -* `Transformer` is an implementation to `map` data fetched by the associated query to the relevant sections of the entity's object graph. - -Below is an example Entity Configuration for the Customer Entity. - -``` -internal class CustomerConfiguration : EntityConfiguration -{ - public override IEnumerable> GetSchema() - { - return CreateSchema.For() - .Map(For.Paths("customer"), - customer => customer.Dependents - .Map(For.Paths("customer/communication")) - .Map(For.Paths("customer/orders"), - customerOrders => customerOrders.Dependents - .Map(For.Paths("customer/orders/order/items")))) - .End(); - } -} -``` -`CustomerConfiguration` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. -`XPaths` are used to identify the schema paths in the object graph. Alternately, you could use your own representation to name the pairs or map the object graph. However, you would need to provide the `ISchemaPathmatcher` implementation to managing path matching. - -#### i. Query/Transformer Mapping -Every `Query` type in the Entity `Configuration` definition should have a complementing `Transformer` type. -You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. - -Below is the snippet from `CustomerConfiguration` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. -``` - .Map(For.Paths("customer")) -``` - -#### ii. Nested Query/Transformer Mappings -You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query context. - -The query/transformer mappings can be `nested` to `5` levels down. - -Below is snippet to show nesting of `CommunicationQuery` as child to `CustomerQuery`. -``` -.Map(For.Paths("customer"), -- Parent - customer => customer.Dependents - .Map(For.Paths("customer/communication")) -- Child -``` - -Execution Flow -* In parent/child hierarchy, the first parent query executes first, followed by its immediate children. The execution flows in sequence to the last child query in order of its nesting. -* While executing the output of the parent is passed in to the child query to resolve query context and get it ready for execution. -* Transformers are also executed in the same sequence to map data to the Aggregate Entity. -* When a query path for nested query is included for execution, all the parent queries involved in that object graph get included for execution in order of its nesting. - -Please see the execution sequence below for queries and transformers nested in `CustomerConfiguration` implemented above. - -image - -#### iii. Query Class -`Query` - The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. - -`QueryEngine` is an implementation of `IQueryEngine` to execute queries with supported data storage to return query result (ie. Result instance of `IQueryResult`). - -Depending on the Nuget package(s) installed, you could implement `SQL` and `API` queries. -* `SQL` queries execute to get data from SQL database using `Dapper` or `EntityFramework` engines. -* `API` query executes web api to call an `endpoint` using `HTTPClient` supported engine to get data. - -**Important**: You can combine heterogeneous queries in the Entity configuration to target different data stores. - -Example of SQL & API queries are below. -You need to override the `GetQuery(IDataContext context, IQueryResult parentQueryResult)` method to return query delegate (package specific implementation). -* `IDataContext` is the context parameter passed to DataProvider to get aggregated results (. Aggregated Entity). This parameter is always available for both parent and child queries. -* `IQueryResult` parameter is only available when query is configured in child mode, else will be null. - -##### `Schemio.SQL` - with `Dapper` Query implementation. - -1. Example Parent Query - CustomerQuery -``` -public class CustomerQuery : BaseSQLQuery -{ - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; - - return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition - ( - "select CustomerId as Id, " + - "Customer_Name as Name," + - "Customer_Code as Code " + - $"from TCustomer where customerId={customer.CustomerId}" - )); - } -} -``` -2. Example Child Query - OrdersQuery -``` -internal class OrdersQuery : BaseSQLQuery> -{ - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; - - return async connection => - { - var items = await connection.QueryAsync(new CommandDefinition - ( - "select OrderId, " + - "OrderNo, " + - "OrderDate " + - "from TOrder " + - $"where customerId={customer.Id}" - )); - - return new CollectionResult(items); - }; - } -} -``` - -##### `Schemio.EntityFramework` - with `EntityFramework` Query implementation - -1. Example Parent Query - CustomerQuery -``` -public class CustomerQuery : BaseSQLQuery -{ - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Executes as root or level 1 query. parentQueryResult will be null. - var customer = (CustomerContext)context.Entity; - - return async dbContext => - { - var result = await dbContext.Set() - .Where(c => c.Id == customer.CustomerId) - .Select(c => new CustomerResult - { - Id = c.Id, - Name = c.Name, - Code = c.Code - }) - .FirstOrDefaultAsync(); - - return result; - }; - } -} -``` -2. Example Child Query - OrdersQuery -``` - internal class OrdersQuery : BaseSQLQuery> - { - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; - - return async dbContext => - { - var items = await dbContext.Set() - .Where(p => p.Customer.Id == customer.Id) - .Select(c => new OrderResult - { - CustomerId = c.CustomerId, - OrderId = c.OrderId, - Date = c.Date, - OrderNo = c.OrderNo - }) - .ToListAsync(); - - return new CollectionResult(items); - }; - } - } -``` -##### `Schemio.Api` - with `HttpClient` Query implementation -1. Example Parent Query - CustomerQuery -``` -public class CustomerQuery : BaseApiQuery -{ - public CustomerQuery() : base(Endpoints.BaseAddress) - { - } - protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; - - return ()=> new Uri(string.Format($"v2/customers/{customer.CustomerId}); - } -} -``` -2. Example Child Query - OrdersQuery -``` -internal class OrdersQuery : BaseApiQuery> -{ - public OrdersQuery() : base(Endpoints.BaseAddress) - { - } - protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Execute as child to customer api. - var customer = (CustomerResult)parentApiResult; - - return ()=> new Uri(string.Format($"v2/customers/{customer.Id}/orders); - } -} -``` - -#### iv. Transformer Class -The purpose of the transformer class is to transform the data fetched by the linked query class and map to the configured object graph of the entity. - -To define a transformer class, you need to implement `BaseTransformer` -- where TEntity is Aggregate Entity implementing `IEntity`. eg. Customer. -- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. - -Example transformer - Customer Transformer -``` -internal class CustomerTransform : BaseTransformer -{ - public override Customer Transform(CustomerResult queryResult, Customer entity) - { - var customer = entity ?? new Customer(); - customer.CustomerId = queryResult.Id; - customer.CustomerName = queryResult.CustomerName; - customer.CustomerCode = queryResult.CustomerCode; - return customer; - } -} -``` - -**Note**: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. - -For the example query/transformer mapping -``` -.Map(For.Paths("customer/communication")) -``` -The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. - -### Step 3. DataProvider Setup -Data provider needs to be setup with required dependencies. Provide implementations of below dependencies to construct the data provider. - -#### Container Registrations - -With ServiceCollection, you need to register the below dependencies. - -``` - // Register core services - services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); - services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); - services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); - services.AddTransient(); - - // Register instance of ISchemaPathMatcher - Json, XPath or Custom. - services.AddTransient(c => new XPathMatcher()); - - // Enable logging - services.AddLogging(); - - //For Dapper SQL engine - Schemio.SQL - services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { - Providername = "System.Data.SqlClient", - ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" - }}); - - // For entity framework engine - Schemio.EntityFramework - services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); - services.AddTransient(c => new QueryEngine(c.GetService>()); - - // For HTTPClient Engine for web APIs - Schemio.API - - // Enable HttpClient - services.AddHttpClient(); - services.AddTransient(); - - // Register each entity configuration. eg CustomerConfiguration - services.AddTransient, CustomerConfiguration>(); - - ``` - -`Please Note:` You can combine multiple query engines and implement supporting types of queries to execute on target data platforms. - - -#### Using Fluent interface for registrations - -i. Example registration: Schemio.SQL - -``` -// Enable DbProviderFactory. - DbProviderFactories.RegisterFactory(DbProviderName, SqliteFactory.Instance); - - var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; - - var configuration = new SQLConfiguration { ConnectionSettings = new ConnectionSettings { ConnectionString = connectionString, ProviderName = DbProviderName } }; - -// Enable logging - services.AddLogging(); - - services.UseSchemio() - .WithEngine(c => new QueryEngine(configuration)) - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); -``` - -ii. Example registration: Schemio.EntityFramework - -``` - var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; - -// Enable DBContext Factory - services.AddDbContextFactory(options => - options.UseSqlite(connectionString)); - -// Enable logging - services.AddLogging(); - - services.UseSchemio() - .WithEngine(c => new QueryEngine(c.GetService>())) - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); - -``` -iii. Example registration: Schemio.API -``` - // Enable logging - services.AddLogging(); - - // Enable HttpClient - services.AddHttpClient(); - - services.UseSchemio() - .WithEngine() - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); - -``` -iv. Example registration: Multiple Engines -``` - // Enable logging - services.AddLogging(); - - // Enable HttpClient - services.AddHttpClient(); - - var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; - -// Enable DBContext Factory - services.AddDbContextFactory(options => - options.UseSqlite(connectionString)); - - services.UseSchemio() - .WithEngine() - .WithEngine(c => new QueryEngine(c.GetService>())) - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); -``` - -#### Use Data Provider - -##### i. Dependency Inject - IDataProvider - -To use Data provider, Inject `IDataProvider` where T is IEntity, using constructor & property injection method or explicitly Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` - -##### ii. Call DataProvider.GetData(IEntityContext context) method. -You need to call the `GetData()` method with an instance of parameter class derived from `IEntityContext` interface. - -The `IEntityContext` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. -- When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. -- When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. - -When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution. - -Example - Control Flow - -image - - -## Extending Schemio - -You could extend Schemio by providing your own custom implementation of the query engine (`IQueryEngine`) and query (`IQuery`) to execute queries on custom target data platform. - -To do this, you need to extend the base interfaces as depicted below. -### i. IQueryEngine -Implement `IQueryEngine` interface to provide the custom query engine to be used with schemio. -``` -public interface IQueryEngine -{ - ///

- /// Detrmines whether an instance of query can be executed with this engine. - /// - /// instance of IQuery. - /// Boolean; True when supported. - bool CanExecute(IQuery query); - - /// - /// Executes a given query returning query result. - /// - /// Custom instance of IQuery. - /// Task of IQueryResult. - Task Execute(IQuery> query); -} -``` -Example Entity Framework implementation is below -``` -public class QueryEngine : IQueryEngine where T : DbContext -{ - private readonly IDbContextFactory _dbContextFactory; - - public QueryEngine(IDbContextFactory _dbContextFactory) - { - this._dbContextFactory = _dbContextFactory; - } - - public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; - - public Task Execute(IQuery query) - { - using (var dbcontext = _dbContextFactory.CreateDbContext()) - { - var result = ((ISQLQuery)query).Run(dbcontext); - return result; - } - } -} -``` -### ii. IQuery -With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query custom query engine. - -To do this, you need to extend `BaseQuery` where TQueryResult is `IQueryResult`. And, provide overrides for below methods. -- `bool IsContextResolved()` -Engine calls this method to confirm whether the query is ready for execution. Return true when query context is resolved. -- `void ResolveQuery(IDataContext context, IQueryResult parentQueryResult)` -This method is invoked by schemio to resolve the query context required for execution ith supporting query engine. `IQueryResult` parameter is only available when the custom query is configured in nested or child mode. - - -Example - EntityFramework Supported query implementation is shown below. -``` - public abstract class BaseSQLQuery - : BaseQuery, ISQLQuery - where TQueryResult : IQueryResult - { - private Func> QueryDelegate = null; - - public override bool IsContextResolved() => QueryDelegate != null; - - public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) - { - QueryDelegate = GetQuery(context, parentQueryResult); - } - - async Task ISQLQuery.Run(DbContext dbContext) - { - return await QueryDelegate(dbContext); - } - - /// - /// Get query delegate to return query result. - /// - /// - /// - /// - protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); - } -``` - -### iii. Custom Schema Paths - -Additionally, You can use your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. - -To do this you need to follow the below steps: -#### i. Use schema paths in Entity Configuration. - -Provide entity schema definition with query/transformer pairs using custom schema language paths. - -Example - with Dummy schema mapping -``` -.Map(For.Paths("customer$orders")) -``` -#### ii. ISchemaPathMatcher -Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. - -`Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. -``` -public interface ISchemaPathMatcher -{ - bool IsMatch(string inputPath, ISchemaPaths configuredPaths); -} -``` -Example implementation of XPathMatcher is below. -``` -public class XPathMatcher : ISchemaPathMatcher - { - private static readonly Regex ancestorRegex = new Regex(@"=ancestor::(?'path'.*?)(/@|\[.*\]/@)", RegexOptions.Compiled); - - public bool IsMatch(string inputXPath, ISchemaPaths configuredXPaths) - { - if (inputXPath == null) - return false; - - if (configuredXPaths.Paths.Any(x => inputXPath.ToLower().Contains(x.ToLower()))) - return true; - - if (configuredXPaths.Paths.Any(x => inputXPath.Contains("ancestor::") - && ancestorRegex.Matches(inputXPath).Select(match => match.Groups["path"].Value).Distinct().Any(match => x.EndsWith(match)))) - return true; - - return false; - } - } -``` diff --git a/index.md b/index.md index aeb661e..651bf2a 100644 --- a/index.md +++ b/index.md @@ -1,518 +1,552 @@ # Developer Guide + ## i. Installation -Install the latest nuget package as appropriate. -`Scemio.Core` - for installing schemio for `bespoke` implementation of query engine. +`Schemio` allows you to aggregate data from heterogeneous data stores offering `SQL` & `API` packages out of the box below. SQL queries are supported by `Dapper` and `EntityFramework` engines. You could also `extend` Schemio to provide your own implementation(s) of `Query` and supporting `Query Engine` to retrieve data from `custom` data store(s). + +Below are the Nuget packages available. + +`Scemio.Core` - Install to extend schemio to implement `custom` querying engine. ``` NuGet\Install-Package Schemio.Core ``` -`Schemio.SQL` - for installing schemio for SQL with `Dapper` engine. +`Schemio.SQL` - Install when you would like to include SQL `Dapper` queries to access SQL database. ``` NuGet\Install-Package Schemio.SQL ``` -`Schemio.EntityFramework` - for installing schemio for SQL with `EntityFramework` engine. +`Schemio.EntityFramework` - Install when you would like to include SQL `EntityFramework` queries to access SQL database. ``` NuGet\Install-Package Schemio.EntityFramework ``` -## ii. Implementation: Usingse Schemio - -To use schemio you need to -> Step 1 - Setup the entity to be fetched. -> -> Step 2 - Construct the `DataProvider` with required dependencies. - -### Step 1. Entity Setup -Setting up an entity includes the following. -* Define the `entity` to be fetched using `DataProvider` - which is basically a class with entire object graph (with nested typed properties). -* Define the `entity schema` which is schema path mapping of the entire entity object graph. Each mapping consists of a `query` and `transformer` pair mapped to a sections of object graph (using XPaths or JsonPath for schema paths) - -#### 1.1 Entity -To mark the class as Entity, implement the class from `IEntity` interface. -Bear in mind this is the root entity to be fetched. - ->Below is an example `Customer` entity. -> -> ``` -> public class Customer : IEntity -> { -> public int CustomerId { get; set; } -> public string CustomerCode { get; set; } -> public string CustomerName { get; set; } -> public Communication Communication { get; set; } -> public Order[] Orders { get; set; } -> } -> ``` +`Schemio.Api` - Install when you would like to include web api queries with `HttpClient` query engine. +``` +NuGet\Install-Package Schemio.Api +``` +## ii. Implementation: Using Schemio + +To use **Schemio** you need to do the below steps +- **Step 1**: Define the aggregated `Entity`. +- **Step 2**: Setup the aggregate `Configuration` comprising of `Query`/`Transformer` hierarchical nested mappings. +- **Step 3**: Construct the `DataProvider` with required dependencies. + +### Step 1. Define Aggregate Entity. +To create an aggregate `Entity`, implement the class from `IEntity` interface. This is the entity that will be returned as aggregated result from multiple queries assembled to execute against homogeneous or heterogeneous data storage's. + +Below is an example `Customer` entity. + +``` +public class Customer : IEntity +{ + public int CustomerId { get; set; } + public string CustomerCode { get; set; } + public string CustomerName { get; set; } + public Communication Communication { get; set; } + public Order[] Orders { get; set; } +} +``` For the customer class, we can see there are three levels of nesting in the object graph. - Level 1 with paths: `Customer` - Level 2 with paths: `Customer.Communication` and `Customer.Orders` - Level 3 with paths: `Customer.Orders.Items` -If we choose XML Schema Definition (XSD) for the object schema of the above Customer class fo mapping with XPATHs -then below is the Customer XSD and XPaths for different nesting levels. - -> Customer XSD is -> ``` -> Coming soon... -> ``` - -> Schema mappings using XPaths are -> ``` -> - Level 1 with XPath: Customer -> - Level 2 with XPaths: Customer/Communication and Customer/Orders -> - Level 3 with XPath: Customer/Orders/Order/Items/Item - -#### 1.2 Entity Schema Definition -Define entity schema definition for the entity in context. - -* `Entity schema definition` is basically a configuration with hierarchy of `query/transformer` pairs mapped to the schema paths pointing to different levels of the entity's object graph. -* `Query` is an implementation to fetch data for a certain section of object graph from an underlying data storage. -* `Transformer` is an implementation to map the data fetched by the linked query to the relevant sections of the entity's object graph. - -To define Entity schema, implement `BaseEntitySchema` interface where T is entity in context. - -> -Example Entity Schema Definition (using XPaths) -> The `Customer` entity with `three` levels of `nesting` is configured below in `CustomerSchema` definition to show `query/transformer` pairs nested accordingly mapping to object graph using the XPath definitions. -> -> ``` -> internal class CustomerSchema : BaseEntitySchema -> { -> public override IEnumerable> GetSchema() -> { -> return CreateSchema.For() -> .Map(For.Paths("customer"), -> customer => customer.Dependents -> .Map(For.Paths("customer/communication")) -> .Map(For.Paths("customer/orders"), -> customerOrders => customerOrders.Dependents -> .Map(For.Paths("customer/orders/order/items"))) -> ).Create(); -> } -> } ->``` - -##### i. Query/Transformer Mapping -Every `Query` type in the `EntitySchema` definition should have a complementing `Transformer` type. +If we choose XML Schema Definition (XSD) for the Customer entity then XPaths for nesting levels should be. +``` +- Level 1 with XPath: Customer +- Level 2 with XPaths: Customer/Communication and Customer/Orders +- Level 3 with XPath: Customer/Orders/Order/Items/Item +``` +### Step 2: Setup Entity Aggregate Configuration +To define `Entity Configuration`, derive from `EntityConfiguration` class where `TEntity` is aggregate entity in context (ie. `IEntity`). + +The `Entity Configuration` is basically `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. +* `Query` is an implementation to `fetch` data for mapped sections of object graph. +* `Transformer` is an implementation to `map` data fetched by the associated query to the relevant sections of the entity's object graph. + +Below is an example Entity Configuration for the Customer Entity. + +``` +internal class CustomerConfiguration : EntityConfiguration +{ + public override IEnumerable> GetSchema() + { + return CreateSchema.For() + .Map(For.Paths("customer"), + customer => customer.Dependents + .Map(For.Paths("customer/communication")) + .Map(For.Paths("customer/orders"), + customerOrders => customerOrders.Dependents + .Map(For.Paths("customer/orders/order/items")))) + .End(); + } +} +``` +`CustomerConfiguration` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. +`XPaths` are used to identify the schema paths in the object graph. Alternately, you could use your own representation to name the pairs or map the object graph. However, you would need to provide the `ISchemaPathmatcher` implementation to managing path matching. + +#### i. Query/Transformer Mapping +Every `Query` type in the Entity `Configuration` definition should have a complementing `Transformer` type. You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. ->Below is the snippet from `CustomerSchema` definition. ->``` -> .Map(For.Paths("customer", "customer/code", "customer/name")) ->``` +Below is the snippet from `CustomerConfiguration` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. +``` + .Map(For.Paths("customer")) +``` -##### ii. Nested Query/Transformer Mappings -* You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query paramter. -* The query/transformer mappings can be `nested` to `5` levels down. -* When certain `schema paths` are included in the DataProvider `request` to fetch the Entity, the relevant query and transformer pairs get executed in the order of their nesting to hydrate the entity. +#### ii. Nested Query/Transformer Mappings +You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query context. ->Example nesting of Communication query under Customer query. ->``` -> .Map(For.Paths("customer"), -- Parent -> customer => customer.Dependents -> .Map(For.Paths("customer/communication")) -- Child ->``` - - -Please see the execution sequence below for queries and transformers nested in CustomerSchema implemented above. - -image - - -`Please Note:` If you need to support custom schema language for mapping the object graph, then see extending schemio section below. - - -#### 1.2.1 Query Class -The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. - -QueryEngine is an implementation of `IQueryEngine` to execute queries against a supported data storage to return a collection of query results (ie. of type IQueryResult). - -As explained above, You can configure a query in `Parent` or `Child` (nested) mode in nested hierarchies. - -i. Parent Query - -To define a `parent` or `root` query which is usually configured at level 1 to query the root entity, derive from `aseRootQuery` -* `TQueryParameter` is basically the class that holds the `inputs` required by the root query for execution. It is an implementation of `IQueryParameter` type. -* `TQueryResult` is the result that will be returned from executing the root query. It is an implementation of `IQueryResult` type. - -The query parameter needs to be resolved before executing the query with QueryEngine. - -In `parent` mode, the query parameter is resolved using the `IDataContext` parameter passed to data provider class. - - -> See example `CustomerQuery` implemented to be configured and run in parent mode below. -> ``` ->internal class CustomerQuery : BaseRootQuery -> { -> public override void ResolveRootQueryParameter(IDataContext context) -> { -> // Executes as Parent or Level 1 query. -> // The query parameter is resolved using IDataContext parameter of data provider class. -> -> var customer = (CustomerContext)context; -> QueryParameter = new CustomerParameter -> { -> CustomerId = customer.CustomerId -> }; -> } -> } ->``` - -ii. Child Query - -To define a `child` or `dependant` query which is usually configured as child at level below the root query to query, derive from `BaseChildQuery` -* `TQueryParameter` is basically the class that holds the `inputs` required by the child query for execution. It is an implementation of `IQueryParameter` type. -* `TQueryResult` is the result that will be returned by executing the child query. It is an implementation of `IQueryResult` type. - -Similar to Root query, the query parameter of child query needs to be resolved before executing with QueryEngine. - -In `child` mode, the query parameter is resolved using the `query result` of the `parent` query. You can have a maximum of `5` levels of query nestings. - -> See example `CustomerCommunicationQuery` implemented to be configured and run as child or nested query to customer query below. Please see `CustomerSchema` definition above for parent/child configuration setup. ->``` -> internal class CustomerCommunicationQuery : BaseChildQuery -> { -> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child to customer query. -> // The result from parent customer query is used to resolve the query parameter of the nested communication query. -> -> var customer = (CustomerResult)parentQueryResult; -> QueryParameter = new CustomerParameter -> { -> CustomerId = customer.Id -> }; -> } -> } ->``` - -#### Query Engines - -`Please Note:` The above query implementation examples are with respect to parent/child configuration. The actual storage specific query definition should vary with specific implementation of the QueryEngine. -> Please see supported Query engine implementations below. -- `Schemio.SQL` - provides the implementation of IQueryEngine to execute SQL queries. Uses `Dapper` for SQL data acess. -- `Schemio.EntityFramework` - provides implementation of IQueryEngine to execute `Entity Framework` queries. - -`Query using Schemio.SQL` -The SQL query needs to implement `BaseSQLRootQuery` or `BaseSQLChildQuery` based on parent or child implementation. -And, requires implementing `public abstract CommandDefinition GetCommandDefinition()` method to return `command definition` for query to be executed with `Dapper` supported QueryEngine. - -See below example `CustomerQuery` implemented as Root SQL query ->``` -> internal class CustomerQuery : BaseSQLRootQuery -> { -> public override void ResolveRootQueryParameter(IDataContext context) -> { -> // Executes as root or level 1 query. -> var customer = (CustomerContext)context.Entity; -> QueryParameter = new CustomerParameter -> { -> CustomerId = (int)customer.CustomerId -> }; -> } -> -> public override IEnumerable Execute(IDbConnection conn) -> { -> return conn.Query(new CommandDefinition -> ( -> "select CustomerId as Id, " + -> "Customer_Name as Name," + -> "Customer_Code as Code " + -> $"from TCustomer where customerId={QueryParameter.CustomerId}" -> )); -> } -> } ->``` -> -See below example `CustomerOrderItemsQuery` implemented as child SQL query. ->``` ->internal class CustomerOrderItemsQuery : BaseSQLChildQuery -> { -> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child query to order query taking OrderResult to resolve query parameter. -> var ordersResult = (OrderResult)parentQueryResult; -> -> QueryParameter ??= new OrderItemParameter(); -> QueryParameter.OrderIds.Add(ordersResult.OrderId); -> } -> -> public override IEnumerable Execute(IDbConnection conn) -> { -> return conn.Query(new CommandDefinition -> ( -> "select OrderId, " + -> "OrderItemId as ItemId, " + -> "Name, " + -> "Cost " + -> $"from TOrderItem where OrderId in ({QueryParameter.ToCsv()})" -> )); -> } -> } ->``` - -`Query using Schemio.EntityFramework` -The SQL query needs to implement `BaseSQLRootQuery` or `BaseSQLChildQuery` based on parent or child implementation. -And, requires implementing `public abstract IEnumerable Run(DbContext dbContext)` method to implement query using `DbContext` using entity framework. - -See below example `CustomerQuery` implemented as Root Entity framework query ->``` -> internal class CustomerQuery : BaseSQLRootQuery -> { -> public override void ResolveRootQueryParameter(IDataContext context) -> { -> // Executes as root or level 1 query. -> var customer = (CustomerContext)context.Entity; -> QueryParameter = new CustomerParameter -> { -> CustomerId = (int)customer.CustomerId -> }; -> } -> -> public override IEnumerable Run(DbContext dbContext) -> { -> return dbContext.Set() -> .Where(c => c.Id == QueryParameter.CustomerId) -> .Select(c => new CustomerResult -> { -> Id = c.Id, -> Name = c.Name, -> Code = c.Code -> }); -> } -> } ->``` -> -See below example `CustomerOrderItemsQuery` implemented as child Entity framework query. ->``` ->internal class CustomerOrderItemsQuery : BaseSQLChildQuery -> { -> public override void ResolveChildQueryParameter(IDataContext context, IQueryResult parentQueryResult) -> { -> // Execute as child query to order query taking OrderResult to resolve query parameter. -> var ordersResult = (CustomerOrderResult)parentQueryResult; -> -> QueryParameter ??= new OrderItemParameter(); -> QueryParameter.OrderIds.Add(ordersResult.OrderId); -> } -> -> public override IEnumerable Run(DbContext dbContext) -> { -> return dbContext.Set() -> .Where(p => QueryParameter.OrderIds.Contains(p.Order.OrderId)) -> .Select(c => new OrderItemResult -> { -> ItemId = c.ItemId, -> Name = c.Name, -> Cost = c.Cost, -> OrderId = c.Order.OrderId -> }); -> ; -> } -> } ->``` - - -#### 2.2 Tranformer Class -The purpose of the transformer class is to transform the data fetched by the linked query class and mapp to the configured object graph of the entity. +The query/transformer mappings can be `nested` to `5` levels down. + +Below is snippet to show nesting of `CommunicationQuery` as child to `CustomerQuery`. +``` +.Map(For.Paths("customer"), -- Parent + customer => customer.Dependents + .Map(For.Paths("customer/communication")) -- Child +``` -To define a transformer class, you need to implement `BaseTransformer` -- where TEntity is Entity implementing `IEntity`. eg. Customer. -- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. +Execution Flow +* In parent/child hierarchy, the first parent query executes first, followed by its immediate children. The execution flows in sequence to the last child query in order of its nesting. +* While executing the output of the parent is passed in to the child query to resolve query context and get it ready for execution. +* Transformers are also executed in the same sequence to map data to the Aggregate Entity. +* When a query path for nested query is included for execution, all the parent queries involved in that object graph get included for execution in order of its nesting. -Note: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. +Please see the execution sequence below for queries and transformers nested in `CustomerConfiguration` implemented above. -For the example query/transformer mapping ->``` -> .Map(For.Paths("customer")) ->``` +image -The customer transformer maps data only to the `customer` xpath mapped object graph of customer class. -ie. - `customer/id`, `customer/customercode`, `customer/customername` +#### iii. Query Class +`Query` - The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. -In below transformer example, `CustomerTransformer` is implemented to transform entity `Customer` with `CustomerResult` query result obtained from `CustomerQuery` execution. +`QueryEngine` is an implementation of `IQueryEngine` to execute queries with supported data storage to return query result (ie. Result instance of `IQueryResult`). -> ->``` ->internal class CustomerTransform : BaseTransformer -> { -> public override Customer Transform(CustomerResult queryResult, Customer entity) -> { -> var customer = entity ?? new Customer(); -> customer.CustomerId = queryResult.Id; -> customer.CustomerName = queryResult.CustomerName; -> customer.CustomerCode = queryResult.CustomerCode; -> return customer; -> } -> } ->``` +Depending on the Nuget package(s) installed, you could implement `SQL` and `API` queries. +* `SQL` queries execute to get data from SQL database using `Dapper` or `EntityFramework` engines. +* `API` query executes web api to call an `endpoint` using `HTTPClient` supported engine to get data. -### DataProvider Setup -Data provider needs to setup with required dependencies. Provide implementations of below dependencies to construct the data provider. +**Important**: You can combine heterogeneous queries in the Entity configuration to target different data stores. -- `ILogger>` - logger implementation. default no logger. -- `IEntitySchema` - mandatory entity schema definition for entity's object graph. -- `IQueryEngine` - implementation of query engine to execute queries (of type IQuery) with supported data storage. -- `ISchemaPathMatcher` - implementation of schema path matcher to use custom schema paths with entity schema definition. +Example of SQL & API queries are below. +You need to override the `GetQuery(IDataContext context, IQueryResult parentQueryResult)` method to return query delegate (package specific implementation). +* `IDataContext` is the context parameter passed to DataProvider to get aggregated results (. Aggregated Entity). This parameter is always available for both parent and child queries. +* `IQueryResult` parameter is only available when query is configured in child mode, else will be null. -Example constructors: +##### `Schemio.SQL` - with `Dapper` Query implementation. -i. With `EntitySchema` and `QueryEngine` implementations. +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseSQLQuery +{ + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. + var customer = (CustomerContext)context.Entity; + + return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition + ( + "select CustomerId as Id, " + + "Customer_Name as Name," + + "Customer_Code as Code " + + $"from TCustomer where customerId={customer.CustomerId}" + )); + } +} +``` +2. Example Child Query - OrdersQuery +``` +internal class OrdersQuery : BaseSQLQuery> +{ + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer query. + var customer = (CustomerResult)parentQueryResult; + return async connection => + { + var items = await connection.QueryAsync(new CommandDefinition + ( + "select OrderId, " + + "OrderNo, " + + "OrderDate " + + "from TOrder " + + $"where customerId={customer.Id}" + )); + + return new CollectionResult(items); + }; + } +} ``` - public DataProvider(IEntitySchema entitySchema, params IQueryEngine[] queryEngines) -``` -ii. With `Logger`, `EntitySchema`, `QueryEngine`, and `SchemaPathmMatcher` for custom schema paths mapping in entity schema definition. + +##### `Schemio.EntityFramework` - with `EntityFramework` Query implementation + +1. Example Parent Query - CustomerQuery ``` - public DataProvider(ILogger> logger, IEntitySchema entitySchema, ISchemaPathMatcher schemaPathMatcher, params IQueryEngine[] queryEngines) - +public class CustomerQuery : BaseSQLQuery +{ + protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. parentQueryResult will be null. + var customer = (CustomerContext)context.Entity; + + return async dbContext => + { + var result = await dbContext.Set() + .Where(c => c.Id == customer.CustomerId) + .Select(c => new CustomerResult + { + Id = c.Id, + Name = c.Name, + Code = c.Code + }) + .FirstOrDefaultAsync(); + + return result; + }; + } +} +``` +2. Example Child Query - OrdersQuery +``` + internal class OrdersQuery : BaseSQLQuery> + { + protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer query. + var customer = (CustomerResult)parentQueryResult; + + return async dbContext => + { + var items = await dbContext.Set() + .Where(p => p.Customer.Id == customer.Id) + .Select(c => new OrderResult + { + CustomerId = c.CustomerId, + OrderId = c.OrderId, + Date = c.Date, + OrderNo = c.OrderNo + }) + .ToListAsync(); + + return new CollectionResult(items); + }; + } + } +``` +##### `Schemio.Api` - with `HttpClient` Query implementation +1. Example Parent Query - CustomerQuery +``` +public class CustomerQuery : BaseApiQuery +{ + public CustomerQuery() : base(Endpoints.BaseAddress) + { + } + protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Executes as root or level 1 query. + var customer = (CustomerContext)context.Entity; + + return ()=> new Uri(string.Format($"v2/customers/{customer.CustomerId}); + } +} ``` -#### Schemio.SQL -Construct DataProvider using `Schemio.SQL.QueryEngine` query engine. +2. Example Child Query - OrdersQuery +``` +internal class OrdersQuery : BaseApiQuery> +{ + public OrdersQuery() : base(Endpoints.BaseAddress) + { + } + protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + { + // Execute as child to customer api. + var customer = (CustomerResult)parentApiResult; + + return ()=> new Uri(string.Format($"v2/customers/{customer.Id}/orders); + } +} +``` + +#### iv. Transformer Class +The purpose of the transformer class is to transform the data fetched by the linked query class and map to the configured object graph of the entity. + +To define a transformer class, you need to implement `BaseTransformer` +- where TEntity is Aggregate Entity implementing `IEntity`. eg. Customer. +- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. +Example transformer - Customer Transformer ``` -var provider = new DataProvider(new CustomerSchema(), new Schemio.SQL.QueryEngine(new SQLConfiguration())); +internal class CustomerTransform : BaseTransformer +{ + public override Customer Transform(CustomerResult queryResult, Customer entity) + { + var customer = entity ?? new Customer(); + customer.CustomerId = queryResult.Id; + customer.CustomerName = queryResult.CustomerName; + customer.CustomerCode = queryResult.CustomerCode; + return customer; + } +} ``` -#### Schemio.EntityFramework -Construct DataProvider using `Schemio.EntityFramework.QueryEngine` query engine. +**Note**: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. +For the example query/transformer mapping ``` -var provider = new DataProvider(new CustomerSchema(), Schemio.EntityFramework.QueryEngine()); +.Map(For.Paths("customer/communication")) ``` +The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. -### Using IOC for registrations +### Step 3. DataProvider Setup +Data provider needs to be setup with required dependencies. Provide implementations of below dependencies to construct the data provider. -With ServiceCollection, you should call the `services.UseSchemio()` method for IoC registration. +#### Container Registrations -To configure Data provider with SQL Query engine, use fluent registration apis as shown below - - ``` - services.UseSchemio(With.Schema(c => new CustomerSchema()) - .AddEngine(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { - Providername = "System.Data.SqlClient", - ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" - }})) - .LogWith(c => new Logger>(c.GetService()))); -``` +With ServiceCollection, you need to register the below dependencies. -To configure Data provider with Entity Framework Query engine, use fluent registration apis shown as below - +``` + // Register core services + services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); + services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); + services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); + services.AddTransient(); + + // Register instance of ISchemaPathMatcher - Json, XPath or Custom. + services.AddTransient(c => new XPathMatcher()); + + // Enable logging + services.AddLogging(); + + //For Dapper SQL engine - Schemio.SQL + services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { + Providername = "System.Data.SqlClient", + ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" + }}); + + // For entity framework engine - Schemio.EntityFramework + services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); + services.AddTransient(c => new QueryEngine(c.GetService>()); + + // For HTTPClient Engine for web APIs - Schemio.API + + // Enable HttpClient + services.AddHttpClient(); + services.AddTransient(); + + // Register each entity configuration. eg CustomerConfiguration + services.AddTransient, CustomerConfiguration>(); + ``` - services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); - services.AddLogging(); +`Please Note:` You can combine multiple query engines and implement supporting types of queries to execute on target data platforms. + + +#### Using Fluent interface for registrations + +i. Example registration: Schemio.SQL + +``` +// Enable DbProviderFactory. + DbProviderFactories.RegisterFactory(DbProviderName, SqliteFactory.Instance); + + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + + var configuration = new SQLConfiguration { ConnectionSettings = new ConnectionSettings { ConnectionString = connectionString, ProviderName = DbProviderName } }; + +// Enable logging + services.AddLogging(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(configuration)) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); +``` - services.UseSchemio(With.Schema(c => new CustomerSchema()) - .AddEngine(c => new QueryEngine(c.GetService>())) - .LogWith(c => new Logger>(c.GetService()))); +ii. Example registration: Schemio.EntityFramework ``` + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + +// Enable DBContext Factory + services.AddDbContextFactory(options => + options.UseSqlite(connectionString)); + +// Enable logging + services.AddLogging(); + + services.UseSchemio() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + +``` +iii. Example registration: Schemio.API +``` + // Enable logging + services.AddLogging(); + + // Enable HttpClient + services.AddHttpClient(); + + services.UseSchemio() + .WithEngine() + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + +``` +iv. Example registration: Multiple Engines +``` + // Enable logging + services.AddLogging(); + + // Enable HttpClient + services.AddHttpClient(); + + var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; + +// Enable DBContext Factory + services.AddDbContextFactory(options => + options.UseSqlite(connectionString)); + + services.UseSchemio() + .WithEngine() + .WithEngine(c => new QueryEngine(c.GetService>())) + .WithPathMatcher(c => new XPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); +``` + +#### Use Data Provider + +##### i. Dependency Inject - IDataProvider + +To use Data provider, Inject `IDataProvider` where T is IEntity, using constructor & property injection method or explicitly Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` + +##### ii. Call DataProvider.GetData(IEntityContext context) method. +You need to call the `GetData()` method with an instance of parameter class derived from `IEntityContext` interface. + +The `IEntityContext` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. +- When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. +- When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. + +When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution. + +Example - Control Flow -`Please Note:` You can combine multiple query engines and implement different types of queries to execute on different supported platforms. +image -To use Data provider, Inject IDataProvider using constructor & property injection method or explicity Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider<>))` -## Extend Schemio -### Custom Query Engine -To provide custom query engine and query implementations, you need to extend the base interfaces as depicted below -- IQueryEngine interface to implement the custom query engine to be used with schemio. +## Extending Schemio + +You could extend Schemio by providing your own custom implementation of the query engine (`IQueryEngine`) and query (`IQuery`) to execute queries on custom target data platform. + +To do this, you need to extend the base interfaces as depicted below. +### i. IQueryEngine +Implement `IQueryEngine` interface to provide the custom query engine to be used with schemio. ``` public interface IQueryEngine - { - /// - /// Detrmines whether an instance of query can be executed with this engine. - /// - /// instance of IQuery. - /// Boolean; True when supported. - bool CanExecute(IQuery query); - - /// - /// Executes a list of queries returning a list of aggregated results. - /// - /// List of IQuery instances. - /// List of query results. Instances of IQueryResult. - IEnumerable Execute(IEnumerable queries); - } +{ + /// + /// Detrmines whether an instance of query can be executed with this engine. + /// + /// instance of IQuery. + /// Boolean; True when supported. + bool CanExecute(IQuery query); + + /// + /// Executes a given query returning query result. + /// + /// Custom instance of IQuery. + /// Task of IQueryResult. + Task Execute(IQuery> query); +} ``` Example Entity Framework implementation is below ``` public class QueryEngine : IQueryEngine where T : DbContext +{ + private readonly IDbContextFactory _dbContextFactory; + + public QueryEngine(IDbContextFactory _dbContextFactory) { - private readonly IDbContextFactory _dbContextFactory; + this._dbContextFactory = _dbContextFactory; + } + + public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; - public QueryEngine(IDbContextFactory _dbContextFactory) + public Task Execute(IQuery query) + { + using (var dbcontext = _dbContextFactory.CreateDbContext()) { - this._dbContextFactory = _dbContextFactory; + var result = ((ISQLQuery)query).Run(dbcontext); + return result; } + } +} +``` +### ii. IQuery +With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query custom query engine. - public bool CanExecute(IQuery query) => query != null && query is ISQLQuery; +To do this, you need to extend `BaseQuery` where TQueryResult is `IQueryResult`. And, provide overrides for below methods. +- `bool IsContextResolved()` +Engine calls this method to confirm whether the query is ready for execution. Return true when query context is resolved. +- `void ResolveQuery(IDataContext context, IQueryResult parentQueryResult)` +This method is invoked by schemio to resolve the query context required for execution ith supporting query engine. `IQueryResult` parameter is only available when the custom query is configured in nested or child mode. - public IEnumerable Execute(IEnumerable queries) - { - var output = new List(); - using (var dbcontext = _dbContextFactory.CreateDbContext()) - { - foreach (var query in queries) - { - var results = ((ISQLQuery)query).Run(dbcontext); +Example - EntityFramework Supported query implementation is shown below. +``` + public abstract class BaseSQLQuery + : BaseQuery, ISQLQuery + where TQueryResult : IQueryResult + { + private Func> QueryDelegate = null; + + public override bool IsContextResolved() => QueryDelegate != null; + + public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) + { + QueryDelegate = GetQuery(context, parentQueryResult); + } + + async Task ISQLQuery.Run(DbContext dbContext) + { + return await QueryDelegate(dbContext); + } + + /// + /// Get query delegate to return query result. + /// + /// + /// + /// + protected abstract Func> GetQuery(IDataContext context, IQueryResult parentQueryResult); + } +``` + +### iii. Custom Schema Paths - if (results == null) - continue; +Additionally, You can use your own schema language instead of XPath/JSONPath to map aggregated entity's object graph, and register with schemio. - output.AddRange(results); - } +To do this you need to follow the below steps: +#### i. Use schema paths in Entity Configuration. - return output.ToArray(); - } - } - } -``` -- Provide base implementation supporting IQuery, IRootQuery & IChildQuery interfaces. -- You can implement the parent and child base class implementations to construct for queries to be executed with custom engine implementation above. +Provide entity schema definition with query/transformer pairs using custom schema language paths. -For Parent Query base implementation, see example below. -``` -public abstract class BaseSQLRootQuery - : BaseRootQuery, ISQLQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// Func> - public abstract IEnumerable Run(DbContext dbContext); - } +Example - with Dummy schema mapping ``` -For Child Query implementation, see example below. +.Map(For.Paths("customer$orders")) ``` -public abstract class BaseSQLChildQuery - : BaseChildQuery, ISQLQuery - where TQueryParameter : IQueryParameter - where TQueryResult : IQueryResult - { - /// - /// Get query delegate with implementation to return query result. - /// Delegate returns a collection from db. - /// - /// Func> - public abstract IEnumerable Run(DbContext dbContext); - } -``` -### Custom Schema Language -You can provide your own schema language support for use in entity schema definition to map sections of object graph. +#### ii. ISchemaPathMatcher +Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. -To do this you need to follow the below steps -* Provide entity schema definition with query/transformer pairs using custom schema language paths -* Provide implementation of `ISchemaPathMatcher` interface and implement `IsMatch()` method to provide logic for matching custom paths. This matcher is used by query builder to pick queries for matched paths against the configured p in Entity schema definition. +`Important`: This matcher is used by query builder to filter queries based matched paths, to include only required queries for execution to optimize performance. ``` public interface ISchemaPathMatcher - { - bool IsMatch(string inputPath, ISchemaPaths configuredPaths); - } +{ + bool IsMatch(string inputPath, ISchemaPaths configuredPaths); +} ``` -Example implementation of XPath matcher is below. +Example implementation of XPathMatcher is below. ``` public class XPathMatcher : ISchemaPathMatcher { @@ -534,4 +568,3 @@ public class XPathMatcher : ISchemaPathMatcher } } ``` - From bba5d68425a9b715ab305658481a7f58cdfbc823 Mon Sep 17 00:00:00 2001 From: Ninja Date: Wed, 20 Nov 2024 23:12:51 +0000 Subject: [PATCH 51/64] - Checkpoint: Add Schemio.API.Tests & Refactorings --- Schemio.sln | 11 +- index.md | 78 ++++++-- src/Schemio.API/IWebResponse.cs | 9 - src/Schemio.API/WebHeaderResult.cs | 12 ++ .../{BaseWebQuery.cs => WebQuery.cs} | 37 ++-- src/Schemio.Core/ISchemaPathMatcher.cs | 8 +- src/Schemio.Core/PathMatchers/JPathMatcher.cs | 2 +- src/Schemio.EntityFramework/IDbContext.cs | 9 - .../{BaseSQLQuery.cs => SQLQuery.cs} | 2 +- .../{BaseSQLQuery.cs => SQLQuery.cs} | 2 +- tests/Schemio.API.Tests/E2E.Tests/BaseTest.cs | 76 ++++++++ tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs | 168 ++++++++++++++++++ .../Schemio.API.Tests/EntitySetup/Customer.cs | 46 +++++ .../EntitySetup/CustomerConfiguration.cs | 25 +++ .../EntitySetup/CustomerContext.cs | 10 ++ .../QueryResults/CommunicationResult.cs | 17 ++ .../QueryResults/CustomerResult.cs | 9 + .../QueryResults/OrderItemResult.cs | 10 ++ .../EntitySetup/QueryResults/OrderResult.cs | 11 ++ .../Transforms/CommunicationTransform.cs | 29 +++ .../Transforms/CustomerTransform.cs | 20 +++ .../Transforms/OrderItemsTransform.cs | 31 ++++ .../EntitySetup/Transforms/OrdersTransform.cs | 27 +++ .../WebApis/CommunicationWebQuery.cs | 18 ++ .../EntitySetup/WebApis/CustomerWebQuery.cs | 42 +++++ .../EntitySetup/WebApis/Endpoints.cs | 26 +++ .../EntitySetup/WebApis/OrderItemsWebQuery.cs | 22 +++ .../EntitySetup/WebApis/OrdersWebQuery.cs | 20 +++ .../Schemio.API.Tests.csproj | 28 +++ .../Schemio.EntityFramework.Tests/BaseTest.cs | 4 - .../Queries/CommunicationQuery.cs | 2 +- .../EntitySchemas/Queries/CustomerQuery.cs | 2 +- .../EntitySchemas/Queries/OrderItemsQuery.cs | 2 +- .../EntitySchemas/Queries/OrdersQuery.cs | 2 +- tests/Schemio.SQL.Tests/BaseTest.cs | 4 - .../Queries/CommunicationQuery.cs | 2 +- .../Queries/CustomerQuery.cs | 2 +- .../Queries/OrderItemsQuery.cs | 2 +- .../Queries/OrdersQuery.cs | 2 +- 39 files changed, 756 insertions(+), 73 deletions(-) delete mode 100644 src/Schemio.API/IWebResponse.cs create mode 100644 src/Schemio.API/WebHeaderResult.cs rename src/Schemio.API/{BaseWebQuery.cs => WebQuery.cs} (84%) delete mode 100644 src/Schemio.EntityFramework/IDbContext.cs rename src/Schemio.EntityFramework/{BaseSQLQuery.cs => SQLQuery.cs} (95%) rename src/Schemio.SQL/{BaseSQLQuery.cs => SQLQuery.cs} (91%) create mode 100644 tests/Schemio.API.Tests/E2E.Tests/BaseTest.cs create mode 100644 tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/Customer.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/CustomerConfiguration.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/QueryResults/CommunicationResult.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/QueryResults/CustomerResult.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderItemResult.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderResult.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/Transforms/CommunicationTransform.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/Transforms/CustomerTransform.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/Transforms/OrderItemsTransform.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/Transforms/OrdersTransform.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/WebApis/CommunicationWebQuery.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/WebApis/Endpoints.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs create mode 100644 tests/Schemio.API.Tests/EntitySetup/WebApis/OrdersWebQuery.cs create mode 100644 tests/Schemio.API.Tests/Schemio.API.Tests.csproj diff --git a/Schemio.sln b/Schemio.sln index cb33b57..75e0047 100644 --- a/Schemio.sln +++ b/Schemio.sln @@ -10,7 +10,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{AF995FEF-BB94-48D0-B02B-6671DA73056B}" ProjectSection(SolutionItems) = preProject .gitignore = .gitignore - DeveloperGuide.md = DeveloperGuide.md + index.md = index.md LICENSE.md = LICENSE.md README.md = README.md EndProjectSection @@ -36,7 +36,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.EntityFramework", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.SQL", "src\Schemio.SQL\Schemio.SQL.csproj", "{52986844-698F-486B-AEC9-846AAF50CF46}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Schemio.API", "src\Schemio.API\Schemio.API.csproj", "{0C1A05D2-653D-4F88-B397-BA53E0BA7281}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.API", "src\Schemio.API\Schemio.API.csproj", "{0C1A05D2-653D-4F88-B397-BA53E0BA7281}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Schemio.API.Tests", "tests\Schemio.API.Tests\Schemio.API.Tests.csproj", "{D0EE40C1-87EF-413D-A046-DC37D58BC344}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -72,6 +74,10 @@ Global {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Debug|Any CPU.Build.0 = Debug|Any CPU {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Release|Any CPU.ActiveCfg = Release|Any CPU {0C1A05D2-653D-4F88-B397-BA53E0BA7281}.Release|Any CPU.Build.0 = Release|Any CPU + {D0EE40C1-87EF-413D-A046-DC37D58BC344}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D0EE40C1-87EF-413D-A046-DC37D58BC344}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0EE40C1-87EF-413D-A046-DC37D58BC344}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D0EE40C1-87EF-413D-A046-DC37D58BC344}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -85,6 +91,7 @@ Global {E8F8C13E-2E05-4092-84FD-B7B7B12DABBB} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} {52986844-698F-486B-AEC9-846AAF50CF46} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} {0C1A05D2-653D-4F88-B397-BA53E0BA7281} = {F41DA3D8-A0E9-4A05-8A35-78313C0F5804} + {D0EE40C1-87EF-413D-A046-DC37D58BC344} = {07BAE427-96CF-4F9B-80A9-48CFB0A89CF3} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C0FF62D6-1374-4939-A546-432862338528} diff --git a/index.md b/index.md index 651bf2a..913fb2c 100644 --- a/index.md +++ b/index.md @@ -131,11 +131,12 @@ You need to override the `GetQuery(IDataContext context, IQueryResult parentQuer * `IDataContext` is the context parameter passed to DataProvider to get aggregated results (. Aggregated Entity). This parameter is always available for both parent and child queries. * `IQueryResult` parameter is only available when query is configured in child mode, else will be null. -##### `Schemio.SQL` - with `Dapper` Query implementation. +##### `Schemio.SQL` - with `Dapper` Query implementation. +To create a SQL query you need to derive from `SQLQuery` where TQueryResult is `IQueryResult` implementation. 1. Example Parent Query - CustomerQuery ``` -public class CustomerQuery : BaseSQLQuery +public class CustomerQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { @@ -154,7 +155,7 @@ public class CustomerQuery : BaseSQLQuery ``` 2. Example Child Query - OrdersQuery ``` -internal class OrdersQuery : BaseSQLQuery> +internal class OrdersQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { @@ -179,10 +180,11 @@ internal class OrdersQuery : BaseSQLQuery> ``` ##### `Schemio.EntityFramework` - with `EntityFramework` Query implementation +To create a SQL query you need to derive from `SQLQuery` where TQueryResult is `IQueryResult` implementation. 1. Example Parent Query - CustomerQuery ``` -public class CustomerQuery : BaseSQLQuery +public class CustomerQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { @@ -208,7 +210,7 @@ public class CustomerQuery : BaseSQLQuery ``` 2. Example Child Query - OrdersQuery ``` - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { @@ -234,25 +236,62 @@ public class CustomerQuery : BaseSQLQuery } ``` ##### `Schemio.Api` - with `HttpClient` Query implementation +To create a Web API query you need to derive from `WebQuery` where TQueryResult is `IQueryResult` implementation. + +`Important`: If you need to get response headers in the result then TQueryResult should derive from `WebHeaderResult` class. + 1. Example Parent Query - CustomerQuery ``` -public class CustomerQuery : BaseApiQuery +public class CustomerWebQuery : WebQuery { - public CustomerQuery() : base(Endpoints.BaseAddress) - { - } - protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) + public CustomerWebQuery() : base(Endpoints.BaseAddress) { - // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; - - return ()=> new Uri(string.Format($"v2/customers/{customer.CustomerId}); + } + + protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) + { + // Executes as root or level 1 api. + var customerContext = (CustomerContext)context.Entity; + + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Customer, customerContext.CustomerId), UriKind.Absolute); + } + + /// + /// Override to pass outgoing request headers. + /// + /// + protected override IDictionary GetRequestHeaders() + { + return new Dictionary + { + { "x-meta-branch-code", "London" } + }; + } + + /// + /// Override to subscribe for given Response headers to be added to TQueryResult. + /// For receiving response headers, You need to implement the TQueryResult type from `WebHeaderResult` class instead of IQueryResult. + /// + /// + protected override IEnumerable GetResponseHeaders() + { + return new[] { "x-meta-branch-code" }; } } ``` +Note: CustomerResult is above query implements from `WebHeaderResult` class to support response headers. +``` +public class CustomerResult : WebHeaderResult +{ + public int Id { get; set; } + public string Code { get; set; } + public string Name { get; set; } +} +``` + 2. Example Child Query - OrdersQuery ``` -internal class OrdersQuery : BaseApiQuery> +internal class OrdersQuery : WebQuery> { public OrdersQuery() : base(Endpoints.BaseAddress) { @@ -284,6 +323,11 @@ internal class CustomerTransform : BaseTransformer customer.CustomerId = queryResult.Id; customer.CustomerName = queryResult.CustomerName; customer.CustomerCode = queryResult.CustomerCode; + + if (queryResult is WebHeaderResult webHeaderResult) + if (webHeaderResult.Headers.TryGetValue("x-meta-branch-code", out var branch)) + customer.Branch = branch; + return customer; } } @@ -484,7 +528,7 @@ public class QueryEngine : IQueryEngine where T : DbContext } ``` ### ii. IQuery -With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query custom query engine. +With the Query Engine implementation, you also need to provide custom implementation of `IQuery` for executing the query with custom query engine. To do this, you need to extend `BaseQuery` where TQueryResult is `IQueryResult`. And, provide overrides for below methods. - `bool IsContextResolved()` @@ -495,7 +539,7 @@ This method is invoked by schemio to resolve the query context required for exec Example - EntityFramework Supported query implementation is shown below. ``` - public abstract class BaseSQLQuery + public abstract class SQLQuery : BaseQuery, ISQLQuery where TQueryResult : IQueryResult { diff --git a/src/Schemio.API/IWebResponse.cs b/src/Schemio.API/IWebResponse.cs deleted file mode 100644 index 51e9325..0000000 --- a/src/Schemio.API/IWebResponse.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Schemio.Core; - -namespace Schemio.API -{ - public interface IWebResponse : IQueryResult - { - IDictionary Headers { get; internal set; } - } -} \ No newline at end of file diff --git a/src/Schemio.API/WebHeaderResult.cs b/src/Schemio.API/WebHeaderResult.cs new file mode 100644 index 0000000..d2ef135 --- /dev/null +++ b/src/Schemio.API/WebHeaderResult.cs @@ -0,0 +1,12 @@ +using Schemio.Core; + +namespace Schemio.API +{ + /// + /// Implement to return web query response with headers. + /// + public abstract class WebHeaderResult : IQueryResult + { + public IDictionary Headers { get; internal set; } + } +} \ No newline at end of file diff --git a/src/Schemio.API/BaseWebQuery.cs b/src/Schemio.API/WebQuery.cs similarity index 84% rename from src/Schemio.API/BaseWebQuery.cs rename to src/Schemio.API/WebQuery.cs index e8f4027..34f5f7a 100644 --- a/src/Schemio.API/BaseWebQuery.cs +++ b/src/Schemio.API/WebQuery.cs @@ -4,16 +4,16 @@ namespace Schemio.API { - public abstract class BaseWebQuery : BaseQuery, IWebQuery - where TQueryResult : IWebResponse + public abstract class WebQuery : BaseQuery, IWebQuery + where TQueryResult : IQueryResult { protected Uri BaseAddress; - protected BaseWebQuery() : this(string.Empty) + protected WebQuery() : this(string.Empty) { } - protected BaseWebQuery(string baseAddress) + protected WebQuery(string baseAddress) { if (!string.IsNullOrEmpty(baseAddress)) BaseAddress = new Uri(baseAddress); @@ -150,22 +150,27 @@ private void SetResponseHeaders(HttpResponseMessage response, TQueryResult? resu var headers = GetResponseHeaders(); - if (headers != null && headers.Any()) - foreach (var header in headers) - { - if (!response.Headers.Any(r => r.Key == header)) - continue; + if (headers == null || !headers.Any()) + return; - var responseHeader = response.Headers.First(r => r.Key == header); + if (!(result is WebHeaderResult webResult)) + throw new InvalidOperationException($"{typeof(TQueryResult).Name} should implement from WebHeaderResult for response Headers"); - var value = responseHeader.Value != null && responseHeader.Value.Any() - ? responseHeader.Value.ElementAt(0) - : string.Empty; + foreach (var header in headers) + { + if (!response.Headers.Any(r => r.Key == header)) + continue; - result.Headers ??= new Dictionary(); + var responseHeader = response.Headers.First(r => r.Key == header); - result.Headers.Add(responseHeader.Key, value); - } + var value = responseHeader.Value != null && responseHeader.Value.Any() + ? responseHeader.Value.ElementAt(0) + : string.Empty; + + webResult.Headers ??= new Dictionary(); + + webResult.Headers.Add(responseHeader.Key, value); + } } } } \ No newline at end of file diff --git a/src/Schemio.Core/ISchemaPathMatcher.cs b/src/Schemio.Core/ISchemaPathMatcher.cs index c52ef0f..1779c0a 100644 --- a/src/Schemio.Core/ISchemaPathMatcher.cs +++ b/src/Schemio.Core/ISchemaPathMatcher.cs @@ -1,7 +1,13 @@ -namespace Schemio.Core +namespace Schemio.Core { public interface ISchemaPathMatcher { + /// + /// Determines whether there is a match for given input path vs configured paths for entity's object graph. + /// + /// Input path from IEntityContext.SchemaPaths + /// Configured paths from EntityConfiguration + /// bool IsMatch(string inputPath, ISchemaPaths configuredPaths); } } \ No newline at end of file diff --git a/src/Schemio.Core/PathMatchers/JPathMatcher.cs b/src/Schemio.Core/PathMatchers/JPathMatcher.cs index a24b1b2..fa2d03d 100644 --- a/src/Schemio.Core/PathMatchers/JPathMatcher.cs +++ b/src/Schemio.Core/PathMatchers/JPathMatcher.cs @@ -5,7 +5,7 @@ namespace Schemio.Core.PathMatchers public class JPathMatcher : ISchemaPathMatcher { public bool IsMatch(string inputXPath, ISchemaPaths configuredXPaths) => - // Does the template xpath contain any of the mapping xpaths? + // Does the template path contain any of the mapping xpaths? inputXPath.IsNotNullOrEmpty() && configuredXPaths.Paths.Any(x => inputXPath.ToLower().Contains(x.ToLower())); } diff --git a/src/Schemio.EntityFramework/IDbContext.cs b/src/Schemio.EntityFramework/IDbContext.cs deleted file mode 100644 index 8bc0aca..0000000 --- a/src/Schemio.EntityFramework/IDbContext.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace Schemio.EntityFramework -{ - public interface IDbContext - { - DbSet Set() where TEntity : class; - } -} \ No newline at end of file diff --git a/src/Schemio.EntityFramework/BaseSQLQuery.cs b/src/Schemio.EntityFramework/SQLQuery.cs similarity index 95% rename from src/Schemio.EntityFramework/BaseSQLQuery.cs rename to src/Schemio.EntityFramework/SQLQuery.cs index eeca8c8..ad20b68 100644 --- a/src/Schemio.EntityFramework/BaseSQLQuery.cs +++ b/src/Schemio.EntityFramework/SQLQuery.cs @@ -3,7 +3,7 @@ namespace Schemio.EntityFramework { - public abstract class BaseSQLQuery + public abstract class SQLQuery : BaseQuery, ISQLQuery where TQueryResult : IQueryResult { diff --git a/src/Schemio.SQL/BaseSQLQuery.cs b/src/Schemio.SQL/SQLQuery.cs similarity index 91% rename from src/Schemio.SQL/BaseSQLQuery.cs rename to src/Schemio.SQL/SQLQuery.cs index b85111c..85fa883 100644 --- a/src/Schemio.SQL/BaseSQLQuery.cs +++ b/src/Schemio.SQL/SQLQuery.cs @@ -3,7 +3,7 @@ namespace Schemio.SQL { - public abstract class BaseSQLQuery : BaseQuery, ISQLQuery + public abstract class SQLQuery : BaseQuery, ISQLQuery where TQueryResult : IQueryResult { async Task ISQLQuery.Run(IDbConnection conn) diff --git a/tests/Schemio.API.Tests/E2E.Tests/BaseTest.cs b/tests/Schemio.API.Tests/E2E.Tests/BaseTest.cs new file mode 100644 index 0000000..ebb7a34 --- /dev/null +++ b/tests/Schemio.API.Tests/E2E.Tests/BaseTest.cs @@ -0,0 +1,76 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using NUnit.Framework; +using Schemio.API.Tests.EntitySetup; +using Schemio.Core; +using Schemio.Core.PathMatchers; +using WireMock.RequestBuilders; +using WireMock.ResponseBuilders; +using WireMock.Server; + +namespace Schemio.API.Tests.E2E.Tests +{ + [TestFixture] + public class BaseTest + { + protected WireMockServer server; + protected ServiceProvider serviceProvider; + protected IDataProvider dataProvider; + + [OneTimeTearDown] + public void OneTimeTearDown() + { + if (serviceProvider is IDisposable disposable) + disposable.Dispose(); + + server.Stop(); + + if (server is IDisposable sdisposable) + sdisposable.Dispose(); + } + + public void StubApi(string endpoint, object body, IDictionary headers = null) + { + // Arrange (start WireMock.Net server) + + var response = Response.Create() + .WithStatusCode(200) + .WithBodyAsJson(body); + + if (headers != null) + response.WithHeaders(headers); + + server + .Given(Request.Create().WithUrl(endpoint).UsingGet()) + .RespondWith(response); + + // Act (use a HttpClient which connects to the URL where WireMock.Net is running) + var result = new HttpClient().GetAsync(endpoint).Result; + var raw = result.Content.ReadAsStringAsync().Result; + + // Assert + //Check.That(response).IsEqualTo(EXPECTED_RESULT); + } + + [OneTimeSetUp] + public void OneTimeSetup() + { + server = WireMockServer.Start(5000); + + var services = new ServiceCollection(); + + services.AddLogging(c => c.AddConsole()); + services.AddHttpClient(); + + services.UseSchemio() + .WithEngine() + .WithPathMatcher(c => new JPathMatcher()) + .WithEntityConfiguration(c => new CustomerConfiguration()); + + // 4. Build the service provider + serviceProvider = services.BuildServiceProvider(); + + dataProvider = serviceProvider.GetService>(); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs b/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs new file mode 100644 index 0000000..df2c54f --- /dev/null +++ b/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs @@ -0,0 +1,168 @@ +using Schemio.Core.Helpers; +using NUnit.Framework; +using Schemio.API.Tests.EntitySetup; +using Schemio.API.Tests.EntitySetup.WebApis; +using static Schemio.API.Tests.EntitySetup.Customer; +using static Schemio.API.Tests.EntitySetup.Customer.Contacts; + +namespace Schemio.API.Tests.E2E.Tests +{ + [TestFixture] + public class E2ETests : BaseTest + { + [SetUp] + public void Setup() + { + StubApi(string.Format(Endpoints.BaseAddress + Endpoints.Customer, Endpoints.Ids.CustomerId), new { Id = 1000, Name = "John McKinsey", Code = "THG-UY6789" }, new Dictionary { { "x-meta-branch-code", "London" } }); + StubApi(string.Format(Endpoints.BaseAddress + Endpoints.Communication, Endpoints.Ids.CustomerId), new { Id = 4567, Telephone = "07675998878", Email = "John.McKinsy@gmail.com", HouseNo = "22", City = "London", Region = "London", PostalCode = "W12 6GH", Country = "United Kingdom" }); + StubApi(string.Format(Endpoints.BaseAddress + Endpoints.Orders, Endpoints.Ids.CustomerId), new[] { new { OrderId = 1234, OrderNo = "GHK-897GB", Date = "2024-01-01T00:00:00" } }); + StubApi(string.Format(Endpoints.BaseAddress + Endpoints.OrderItems, Endpoints.Ids.CustomerId, Endpoints.Ids.OrderId), new[] { new { OrderId = 1234, ItemId = 2244, Name = "Pen", Cost = 12.00m }, new { OrderId = 1234, ItemId = 6677, Name = "Book", Cost = 15.00m } }); + } + + [TearDown] + public void Teardown() + { + } + + [Test] + public void TestDataProviderToFetchWholeContractWhenNamesAreNull() + { + var customer = dataProvider.GetData(new CustomerContext + { + CustomerId = Endpoints.Ids.CustomerId + }); + + var expected = new Customer + { + Id = 1000, + Name = "John McKinsey", + Code = "THG-UY6789", + Branch = "London", // Received via response header + Communication = new Contacts + { + ContactId = 4567, + Phone = "07675998878", + Email = "John.McKinsy@gmail.com", + PostalAddress = new Address + { + HouseNo = "22", + City = "London", + Region = "London", + PostalCode = "W12 6GH", + Country = "United Kingdom", + } + }, + Orders = + [ + new Order + { + OrderId = 1234, + OrderNo = "GHK-897GB", + Date = DateTime.Parse("2024-01-01T00:00:00"), + Items = + [ + new Order.OrderItem + { + ItemId = 2244, Name = "Pen", Cost = 12.00m + }, + new Order.OrderItem + { + ItemId = 6677, Name = "Book", Cost = 15.00m + } + ] + } + ] + }; + + AssertAreEqual(expected, customer); + } + + [Test] + public void TestDataProviderToFetchPartialCustomerOrdersContractWhenNamesAreIncluded() + { + var customer = dataProvider.GetData(new CustomerContext + { + CustomerId = Endpoints.Ids.CustomerId, + SchemaPaths = ["customer.orders.items"] + }); + + var expected = new Customer + { + Id = 1000, + Name = "John McKinsey", + Code = "THG-UY6789", + Branch = "London", + Orders = + [ + new Order + { + OrderId = 1234, + OrderNo = "GHK-897GB", + Date = DateTime.Parse("2024-01-01T00:00:00"), + Items = + [ + new Order.OrderItem + { + ItemId = 2244, Name = "Pen", Cost = 12.00m + }, + new Order.OrderItem + { + ItemId = 6677, Name = "Book", Cost = 15.00m + } + ] + } + ] + }; + + AssertAreEqual(expected, customer); + } + + [Test] + public void TestDataProviderToFetchPartialCustomerCommunicationContractWhenNamesAreIncluded() + { + var customer = dataProvider.GetData(new CustomerContext + { + CustomerId = Endpoints.Ids.CustomerId, + SchemaPaths = ["customer.communication"] + }); + + var expected = new Customer + { + Id = 1000, + Name = "John McKinsey", + Code = "THG-UY6789", + Branch = "London", + Communication = new Contacts + { + ContactId = 4567, + Phone = "07675998878", + Email = "John.McKinsy@gmail.com", + PostalAddress = new Address + { + HouseNo = "22", + City = "London", + Region = "London", + PostalCode = "W12 6GH", + Country = "United Kingdom", + } + } + }; + + AssertAreEqual(expected, customer); + } + + private void AssertAreEqual(Customer expected, Customer actual) + { + var actualCustomer = actual.ToJson(); + var expectedCustomer = expected.ToJson(); + + Console.WriteLine("expected:"); + Console.WriteLine(expectedCustomer); + + Console.WriteLine("actual:"); + Console.WriteLine(actualCustomer); + + Assert.That(actualCustomer, Is.EqualTo(expectedCustomer)); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/Customer.cs b/tests/Schemio.API.Tests/EntitySetup/Customer.cs new file mode 100644 index 0000000..b9edab2 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/Customer.cs @@ -0,0 +1,46 @@ +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup +{ + public class Customer : IEntity + { + public int Id { get; set; } + public string Code { get; set; } + public string Name { get; set; } + public string Branch { get; set; } + public Contacts Communication { get; set; } + public Order[] Orders { get; set; } + + public class Contacts + { + public int ContactId { get; set; } + public string Phone { get; set; } + public string Email { get; set; } + public Address PostalAddress { get; set; } + + public class Address + { + public string HouseNo { get; set; } + public string City { get; set; } + public string Region { get; set; } + public string PostalCode { get; set; } + public string Country { get; set; } + } + } + + public class Order + { + public int OrderId { get; set; } + public string OrderNo { get; set; } + public DateTime Date { get; set; } + public OrderItem[] Items { get; set; } + + public class OrderItem + { + public int ItemId { get; set; } + public string Name { get; set; } + public decimal Cost { get; set; } + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/CustomerConfiguration.cs b/tests/Schemio.API.Tests/EntitySetup/CustomerConfiguration.cs new file mode 100644 index 0000000..da5f523 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/CustomerConfiguration.cs @@ -0,0 +1,25 @@ +using Schemio.API.Tests.EntitySetup.ResultTransformers; +using Schemio.API.Tests.EntitySetup.WebApis; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup +{ + internal class CustomerConfiguration : EntityConfiguration + { + /// + /// Constructs the api aggregate with web apis and result transformers to map data to aggregated contract. + /// + /// Mappings + public override IEnumerable> GetSchema() + { + return CreateSchema.For() + .Map(For.Paths("customer"), + customer => customer.Dependents + .Map(For.Paths("customer.communication")) + .Map(For.Paths("customer.orders"), + customerOrders => customerOrders.Dependents + .Map(For.Paths("customer.orders.items"))) + ).End(); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs new file mode 100644 index 0000000..d10e4f9 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs @@ -0,0 +1,10 @@ +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup +{ + internal class CustomerContext : IEntityContext + { + public int CustomerId { get; set; } + public string[] SchemaPaths { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/QueryResults/CommunicationResult.cs b/tests/Schemio.API.Tests/EntitySetup/QueryResults/CommunicationResult.cs new file mode 100644 index 0000000..729c021 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/QueryResults/CommunicationResult.cs @@ -0,0 +1,17 @@ +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.QueryResults +{ + [CacheResult] + public class CommunicationResult : IQueryResult + { + public int Id { get; set; } + public string Telephone { get; set; } + public string Email { get; set; } + public string HouseNo { get; set; } + public string City { get; set; } + public string Region { get; set; } + public string PostalCode { get; set; } + public string Country { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/QueryResults/CustomerResult.cs b/tests/Schemio.API.Tests/EntitySetup/QueryResults/CustomerResult.cs new file mode 100644 index 0000000..0a55954 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/QueryResults/CustomerResult.cs @@ -0,0 +1,9 @@ +namespace Schemio.API.Tests.EntitySetup.QueryResults +{ + public class CustomerResult : WebHeaderResult + { + public int Id { get; set; } + public string Code { get; set; } + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderItemResult.cs b/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderItemResult.cs new file mode 100644 index 0000000..260a388 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderItemResult.cs @@ -0,0 +1,10 @@ +namespace Schemio.API.Tests.EntitySetup.QueryResults +{ + public class OrderItemResult + { + public int OrderId { get; set; } + public int ItemId { get; set; } + public string Name { get; set; } + public decimal Cost { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderResult.cs b/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderResult.cs new file mode 100644 index 0000000..6a5a26d --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/QueryResults/OrderResult.cs @@ -0,0 +1,11 @@ +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.QueryResults +{ + public class OrderResult : IQueryResult + { + public int OrderId { get; set; } + public string OrderNo { get; set; } + public DateTime Date { get; set; } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/Transforms/CommunicationTransform.cs b/tests/Schemio.API.Tests/EntitySetup/Transforms/CommunicationTransform.cs new file mode 100644 index 0000000..d7fc36d --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/Transforms/CommunicationTransform.cs @@ -0,0 +1,29 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.ResultTransformers +{ + public class CommunicationTransform : BaseTransformer + { + public override void Transform(CommunicationResult apiResult, Customer contract) + { + var customer = contract ?? new Customer(); + customer.Communication = new Customer.Contacts + { + ContactId = apiResult.Id, + Email = apiResult.Email, + Phone = apiResult.Telephone + }; + + if (apiResult.HouseNo != null) + customer.Communication.PostalAddress = new Customer.Contacts.Address + { + HouseNo = apiResult.HouseNo, + City = apiResult.City, + Country = apiResult.Country, + PostalCode = apiResult.PostalCode, + Region = apiResult.Region + }; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/Transforms/CustomerTransform.cs b/tests/Schemio.API.Tests/EntitySetup/Transforms/CustomerTransform.cs new file mode 100644 index 0000000..3f53a6f --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/Transforms/CustomerTransform.cs @@ -0,0 +1,20 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.ResultTransformers +{ + public class CustomerTransform : BaseTransformer + { + public override void Transform(CustomerResult result, Customer contract) + { + var customer = contract ?? new Customer(); + customer.Id = result.Id; + customer.Name = result.Name; + customer.Code = result.Code; + + if (result is WebHeaderResult webResult) + if (webResult.Headers.TryGetValue("x-meta-branch-code", out var branch)) + customer.Branch = branch; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/Transforms/OrderItemsTransform.cs b/tests/Schemio.API.Tests/EntitySetup/Transforms/OrderItemsTransform.cs new file mode 100644 index 0000000..8c5912a --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/Transforms/OrderItemsTransform.cs @@ -0,0 +1,31 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; +using Schemio.Core.Helpers; +using static Schemio.API.Tests.EntitySetup.Customer.Order; + +namespace Schemio.API.Tests.EntitySetup.ResultTransformers +{ + public class OrderItemsTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer customer) + { + if (collectionResult == null || !collectionResult.Any() || customer.Orders == null) + return; + + foreach (var result in collectionResult) + { + var order = customer.Orders.FirstOrDefault(o => o.OrderId == result.OrderId); + if (order == null) + continue; + + order.Items = ArrayUtil.EnsureAndResizeArray(order.Items, out var index); + order.Items[index] = new OrderItem + { + ItemId = result.ItemId, + Name = result.Name, + Cost = result.Cost + }; + } + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/Transforms/OrdersTransform.cs b/tests/Schemio.API.Tests/EntitySetup/Transforms/OrdersTransform.cs new file mode 100644 index 0000000..8f71f72 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/Transforms/OrdersTransform.cs @@ -0,0 +1,27 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; +using static Schemio.API.Tests.EntitySetup.Customer; + +namespace Schemio.API.Tests.EntitySetup.ResultTransformers +{ + public class OrdersTransform : BaseTransformer, Customer> + { + public override void Transform(CollectionResult collectionResult, Customer contract) + { + if (collectionResult == null || !collectionResult.Any()) + return; + + var customer = contract ?? new Customer(); + + customer.Orders = new Order[collectionResult.Count]; + + for (var index = 0; index < collectionResult.Count; index++) + customer.Orders[index] = new Order + { + Date = collectionResult[index].Date, + OrderId = collectionResult[index].OrderId, + OrderNo = collectionResult[index].OrderNo + }; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/CommunicationWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/CommunicationWebQuery.cs new file mode 100644 index 0000000..6207527 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/CommunicationWebQuery.cs @@ -0,0 +1,18 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.WebApis +{ + internal class CommunicationWebQuery : WebQuery + { + public CommunicationWebQuery() : base(Endpoints.BaseAddress) + { + } + + protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) + { + var customer = (CustomerResult)parentApiResult; + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Communication, customer.Id), UriKind.Absolute); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs new file mode 100644 index 0000000..ef798d7 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs @@ -0,0 +1,42 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.WebApis +{ + public class CustomerWebQuery : WebQuery + { + public CustomerWebQuery() : base(Endpoints.BaseAddress) + { + } + + protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) + { + // Executes as root or level 1 api. + var customerContext = (CustomerContext)context.Entity; + + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Customer, customerContext.CustomerId), UriKind.Absolute); + } + + /// + /// Override to pass outgoing request headers. + /// + /// + protected override IDictionary GetRequestHeaders() + { + return new Dictionary + { + { "x-meta-branch-code", "London" } + }; + } + + /// + /// Override to subscribe for given Response headers to be added to Web query Result. + /// For receiving response headers, You need to implement the TQueryResult type from WebResult class instead of IQueryResult. + /// + /// + protected override IEnumerable GetResponseHeaders() + { + return new[] { "x-meta-branch-code" }; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/Endpoints.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/Endpoints.cs new file mode 100644 index 0000000..e59bf16 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/Endpoints.cs @@ -0,0 +1,26 @@ +namespace Schemio.API.Tests.EntitySetup.WebApis +{ + public static class Endpoints + { + public const string Customer = "v2/clients/{0}"; + public const string Communication = "v2/clients/{0}/communication"; + public const string Orders = "v2/clients/{0}/orders"; + public const string OrderItems = "v2/clients/{0}/orders/items?$filter=orderId in {1}"; + + public const string BaseAddress = "http://localhost:5000/"; + + public static class Ids + { + public const int CustomerId = 1000; + public const int OrderId = 1234; + } + + public static class Response + { + public const string Customer = @"{""id"": 1000, ""code"": ""ABC-2244"",""name"": ""John McKinsy""}"; + public const string Communication = @"{ 'contactId': 4567, 'phone': '07675998878', 'email': 'John.McKinsy@gmail.com', 'postalAddress': { 'addressId': 3456, 'houseNo': '22', 'city': 'London', 'region': 'London', 'postalCode': 'W12 6GH', 'country': 'United Kingdom' } }"; + public const string Orders = @"{ 'orderId': 1234, 'orderNo': 'GHK-897GB', 'date': '2024-01-01T00:00:00' }"; + public const string OrderItems = @"[{ 'itemId': 2244, 'name': 'Pen', 'cost': 12.0 }, { 'itemId': 6677, 'name': 'Book', 'cost': 15.0 }]"; + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs new file mode 100644 index 0000000..7330f02 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs @@ -0,0 +1,22 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; +using Schemio.Core.Helpers; + +namespace Schemio.API.Tests.EntitySetup.WebApis +{ + internal class OrderItemsWebQuery : WebQuery> + { + public OrderItemsWebQuery() : base(Endpoints.BaseAddress) + { + } + + protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) + { + // Execute as nested api to order parent api taking OrderResult to resolve api parameter. + var orders = (CollectionResult)parentApiResult; + var customerContext = (CustomerContext)context.Entity; + + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.OrderItems, customerContext.CustomerId, orders.Select(o => o.OrderId).ToCSV()), UriKind.Absolute); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/OrdersWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrdersWebQuery.cs new file mode 100644 index 0000000..daa43b8 --- /dev/null +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrdersWebQuery.cs @@ -0,0 +1,20 @@ +using Schemio.API.Tests.EntitySetup.QueryResults; +using Schemio.Core; + +namespace Schemio.API.Tests.EntitySetup.WebApis +{ + internal class OrdersWebQuery : WebQuery> + { + public OrdersWebQuery() : base(Endpoints.BaseAddress) + { + } + + protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) + { + // Execute as child to customer api. + var customer = (CustomerResult)parentApiResult; + + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Orders, customer.Id), UriKind.Absolute); + } + } +} \ No newline at end of file diff --git a/tests/Schemio.API.Tests/Schemio.API.Tests.csproj b/tests/Schemio.API.Tests/Schemio.API.Tests.csproj new file mode 100644 index 0000000..5a1ea0b --- /dev/null +++ b/tests/Schemio.API.Tests/Schemio.API.Tests.csproj @@ -0,0 +1,28 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index 93d65ba..a9dec25 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -38,10 +38,6 @@ public void Setup() services.AddLogging(); - //services.UseSchemio(new XPathMatcher(), - // c => new QueryEngine(c.GetService>())) - // .AddEntitySchema(); - services.UseSchemio() .WithEngine(c => new QueryEngine(c.GetService>())) .WithPathMatcher(c => new XPathMatcher()) diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs index 9135c5a..914b098 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CommunicationQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index 8a8d10b..d63855a 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs index b9efa05..6c306ec 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrderItemsQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs index 306f388..a16eae5 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/OrdersQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index a6c059a..f701f36 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -5,7 +5,6 @@ using Schemio.Core.Helpers; using Schemio.Core.PathMatchers; using Schemio.SQL; -using Schemio.SQL.Tests.EntitySetup; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas; @@ -43,9 +42,6 @@ public void Setup() services.AddLogging(); - //services.UseSchemio(new XPathMatcher(), c => new QueryEngine(configuration)) - // .AddEntitySchema(); - services.UseSchemio() .WithEngine(c => new QueryEngine(configuration)) .WithPathMatcher(c => new XPathMatcher()) diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs index 0a1b735..0a75dd9 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CommunicationQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class CommunicationQuery : BaseSQLQuery + internal class CommunicationQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs index d254f27..d1b9b5d 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - public class CustomerQuery : BaseSQLQuery + public class CustomerQuery : SQLQuery { protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs index 141a162..4256ae7 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrderItemsQuery.cs @@ -5,7 +5,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrderItemsQuery : BaseSQLQuery> + internal class OrderItemsQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs index 60f17b4..e49a354 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/OrdersQuery.cs @@ -4,7 +4,7 @@ namespace Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries { - internal class OrdersQuery : BaseSQLQuery> + internal class OrdersQuery : SQLQuery> { protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) { From f5de1055585b196843bac015875da30fb95b52b7 Mon Sep 17 00:00:00 2001 From: Ninja Date: Wed, 20 Nov 2024 23:30:42 +0000 Subject: [PATCH 52/64] - Refactor IoC ServiceExtensions --- index.md | 2 +- src/Schemio.API/WebQuery.cs | 2 +- src/Schemio.Core/ServicesExtensions.cs | 51 ++++++++++---------------- 3 files changed, 22 insertions(+), 33 deletions(-) diff --git a/index.md b/index.md index 913fb2c..d2ae4ff 100644 --- a/index.md +++ b/index.md @@ -299,7 +299,7 @@ internal class OrdersQuery : WebQuery> protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Execute as child to customer api. - var customer = (CustomerResult)parentApiResult; + var customer = (CustomerResult)parentQueryResult; return ()=> new Uri(string.Format($"v2/customers/{customer.Id}/orders); } diff --git a/src/Schemio.API/WebQuery.cs b/src/Schemio.API/WebQuery.cs index 34f5f7a..99c3e95 100644 --- a/src/Schemio.API/WebQuery.cs +++ b/src/Schemio.API/WebQuery.cs @@ -39,7 +39,7 @@ protected virtual IDictionary GetRequestHeaders() /// /// Override to get custom incoming headers with the api response. - /// The headers collection will be present on `IApiResult.Headers` when api response includes any of the headers defined in this method. + /// The headers collection will be present on `WebHeaderResult.Headers` when api response includes any of the headers defined in this method. /// /// protected virtual IEnumerable GetResponseHeaders() diff --git a/src/Schemio.Core/ServicesExtensions.cs b/src/Schemio.Core/ServicesExtensions.cs index 9094514..263be61 100644 --- a/src/Schemio.Core/ServicesExtensions.cs +++ b/src/Schemio.Core/ServicesExtensions.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Schemio.Core.Impl; using Schemio.Core.PathMatchers; @@ -6,40 +7,13 @@ namespace Schemio.Core { public static class ServicesExtensions { - public static IServiceCollection UseSchemio(this IServiceCollection services, - ISchemaPathMatcher schemaPathMatcher = null, - params Func[] queryEngines - ) - { - services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); - services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); - services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); - - services.AddTransient(); - services.AddTransient(c => schemaPathMatcher ?? new XPathMatcher()); - - if (queryEngines != null && queryEngines.Length > 0) - foreach (var engine in queryEngines) - services.AddTransient(c => engine(c)); - - return services; - } - - public static IServiceCollection AddEntitySchema(this IServiceCollection services) - where TEntity : IEntity - where TSchema : IEntityConfiguration - { - services.AddTransient(typeof(IEntityConfiguration), typeof(TSchema)); - - return services; - } - public static SchemioOptionsBuilder UseSchemio(this IServiceCollection services) { services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); services.AddTransient(); + services.AddTransient(); return new SchemioOptionsBuilder(services); } @@ -54,11 +28,11 @@ public SchemioOptionsBuilder(IServiceCollection services) public IServiceCollection Services { get; } - public ISchemioOptions WithEngine(Func queryEngines) + public ISchemioOptions WithEngine(Func queryEngine) { - if (queryEngines != null) + if (queryEngine != null) { - Services.AddTransient(c => queryEngines(c)); + Services.AddTransient(c => queryEngine(c)); } return this; @@ -81,14 +55,29 @@ public ISchemioOptions WithEngines(Func queryE return this; } + /// + /// Register an instance of ISchemaPathMatcher. Default is XPathMatcher. + /// + /// + /// public ISchemioOptions WithPathMatcher(Func pathMatcher) { if (pathMatcher != null) + { + Services.RemoveAll(); Services.AddTransient(c => pathMatcher(c)); + } return this; } + /// + /// Register and instance of EntityConfiguration + /// You could register configuration for multiple entities. + /// + /// IEntity + /// Instance of EntityConfiguration[typeparamref name="T"] + /// public ISchemioOptions WithEntityConfiguration(Func> entityConfiguration) where T : class, IEntity { if (entityConfiguration != null) From a0cfdd91007f9a891eb9de370f7b98acb006ff32 Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 01:25:47 +0000 Subject: [PATCH 53/64] - Rename IEntityContext to IEntityRequest --- index.md | 14 +++++++------- src/Schemio.Core/DataContext.cs | 6 +++--- src/Schemio.Core/IDataContext.cs | 2 +- src/Schemio.Core/IDataProvider.cs | 2 +- src/Schemio.Core/IEntityContextValidator.cs | 2 +- .../{IEntityContext.cs => IEntityRequest.cs} | 2 +- src/Schemio.Core/ISchemaPathMatcher.cs | 2 +- src/Schemio.Core/Impl/DataProvider.cs | 17 ++--------------- src/Schemio.Core/Impl/QueryBuilder.cs | 4 ++-- src/Schemio.Core/XML/XMLDataProvider.cs | 6 +++--- tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs | 6 +++--- .../{CustomerContext.cs => CustomerRequest.cs} | 2 +- .../EntitySetup/WebApis/CustomerWebQuery.cs | 2 +- .../EntitySetup/WebApis/OrderItemsWebQuery.cs | 2 +- .../DataProvider.Tests/EntityBuilderTests.cs | 2 +- .../Configuration/Queries/CustomerQuery.cs | 2 +- .../EntitySetup/CustomerContext.cs | 2 +- .../Schemio.EntityFramework.Tests/E2E.Tests.cs | 6 +++--- .../{CustomerContext.cs => CustomerRequest.cs} | 2 +- .../EntitySchemas/Queries/CustomerQuery.cs | 2 +- tests/Schemio.SQL.Tests/E2E.Tests.cs | 8 ++++---- .../{CustomerContext.cs => CustomerRequest.cs} | 2 +- .../Queries/CustomerQuery.cs | 2 +- 23 files changed, 42 insertions(+), 55 deletions(-) rename src/Schemio.Core/{IEntityContext.cs => IEntityRequest.cs} (83%) rename tests/Schemio.API.Tests/EntitySetup/{CustomerContext.cs => CustomerRequest.cs} (76%) rename tests/Schemio.EntityFramework.Tests/EntitySetup/{CustomerContext.cs => CustomerRequest.cs} (77%) rename tests/Schemio.SQL.Tests/EntitySetup/{CustomerContext.cs => CustomerRequest.cs} (76%) diff --git a/index.md b/index.md index d2ae4ff..3d66219 100644 --- a/index.md +++ b/index.md @@ -141,7 +141,7 @@ public class CustomerQuery : SQLQuery protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; + var customer = (CustomerRequest)context.Request; return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( @@ -189,7 +189,7 @@ public class CustomerQuery : SQLQuery protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. parentQueryResult will be null. - var customer = (CustomerContext)context.Entity; + var customer = (CustomerRequest)context.Request; return async dbContext => { @@ -251,9 +251,9 @@ public class CustomerWebQuery : WebQuery protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) { // Executes as root or level 1 api. - var customerContext = (CustomerContext)context.Entity; + var customerRequest = (CustomerRequest)context.Request; - return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Customer, customerContext.CustomerId), UriKind.Absolute); + return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Customer, customerRequest.CustomerId), UriKind.Absolute); } /// @@ -465,10 +465,10 @@ iv. Example registration: Multiple Engines To use Data provider, Inject `IDataProvider` where T is IEntity, using constructor & property injection method or explicitly Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` -##### ii. Call DataProvider.GetData(IEntityContext context) method. -You need to call the `GetData()` method with an instance of parameter class derived from `IEntityContext` interface. +##### ii. Call DataProvider.GetData(IEntityRequest context) method. +You need to call the `GetData()` method with an instance of parameter class derived from `IEntityRequest` interface. -The `IEntityContext` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. +The `IEntityRequest` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. - When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. - When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. diff --git a/src/Schemio.Core/DataContext.cs b/src/Schemio.Core/DataContext.cs index 140e743..2e528fe 100644 --- a/src/Schemio.Core/DataContext.cs +++ b/src/Schemio.Core/DataContext.cs @@ -2,13 +2,13 @@ namespace Schemio.Core { internal class DataContext : IDataContext { - public DataContext(IEntityContext entityContext) + public DataContext(IEntityRequest request) { - Entity = entityContext; + Request = request; Cache = new Dictionary(); } public Dictionary Cache { get; set; } - public IEntityContext Entity { get; set; } + public IEntityRequest Request { get; set; } } } \ No newline at end of file diff --git a/src/Schemio.Core/IDataContext.cs b/src/Schemio.Core/IDataContext.cs index 151268f..e53967c 100644 --- a/src/Schemio.Core/IDataContext.cs +++ b/src/Schemio.Core/IDataContext.cs @@ -2,6 +2,6 @@ namespace Schemio.Core { public interface IDataContext : IEntityContextCache { - IEntityContext Entity { get; } + IEntityRequest Request { get; } } } \ No newline at end of file diff --git a/src/Schemio.Core/IDataProvider.cs b/src/Schemio.Core/IDataProvider.cs index 12329e8..ef3899b 100644 --- a/src/Schemio.Core/IDataProvider.cs +++ b/src/Schemio.Core/IDataProvider.cs @@ -2,6 +2,6 @@ namespace Schemio.Core { public interface IDataProvider where TEntity : IEntity { - TEntity GetData(IEntityContext context); + TEntity GetData(IEntityRequest request); } } \ No newline at end of file diff --git a/src/Schemio.Core/IEntityContextValidator.cs b/src/Schemio.Core/IEntityContextValidator.cs index f1accbe..62f3d29 100644 --- a/src/Schemio.Core/IEntityContextValidator.cs +++ b/src/Schemio.Core/IEntityContextValidator.cs @@ -2,6 +2,6 @@ namespace Schemio.Core { public interface IEntityContextValidator { - public void Validate(IEntityContext context); + public void Validate(IEntityRequest context); } } \ No newline at end of file diff --git a/src/Schemio.Core/IEntityContext.cs b/src/Schemio.Core/IEntityRequest.cs similarity index 83% rename from src/Schemio.Core/IEntityContext.cs rename to src/Schemio.Core/IEntityRequest.cs index 1e85b70..f26d15f 100644 --- a/src/Schemio.Core/IEntityContext.cs +++ b/src/Schemio.Core/IEntityRequest.cs @@ -1,6 +1,6 @@ namespace Schemio.Core { - public interface IEntityContext + public interface IEntityRequest { /// /// Entity schema paths for data retrieval. diff --git a/src/Schemio.Core/ISchemaPathMatcher.cs b/src/Schemio.Core/ISchemaPathMatcher.cs index 1779c0a..51e71de 100644 --- a/src/Schemio.Core/ISchemaPathMatcher.cs +++ b/src/Schemio.Core/ISchemaPathMatcher.cs @@ -5,7 +5,7 @@ public interface ISchemaPathMatcher /// /// Determines whether there is a match for given input path vs configured paths for entity's object graph. /// - /// Input path from IEntityContext.SchemaPaths + /// Input path from IEntityRequest.SchemaPaths /// Configured paths from EntityConfiguration /// bool IsMatch(string inputPath, ISchemaPaths configuredPaths); diff --git a/src/Schemio.Core/Impl/DataProvider.cs b/src/Schemio.Core/Impl/DataProvider.cs index 0c4b8df..484c758 100644 --- a/src/Schemio.Core/Impl/DataProvider.cs +++ b/src/Schemio.Core/Impl/DataProvider.cs @@ -41,9 +41,9 @@ public DataProvider( this.entityBuilder = entityBuilder; } - public TEntity GetData(IEntityContext entityContext) + public TEntity GetData(IEntityRequest request) { - var context = new DataContext(entityContext); + var context = new DataContext(request); return GetData(context); } @@ -53,19 +53,6 @@ internal TEntity GetData(IDataContext context) var watch = System.Diagnostics.Stopwatch.StartNew(); var queries = queryBuilder.Build(context); - //foreach (var item in queries.Queries) - //{ - // Console.WriteLine("L1 Query To Execute: " + item.GetType().Name); - - // foreach (var item2 in item.Children) - // { - // Console.WriteLine("L2 Query To Execute: " + item2.GetType().Name); - - // foreach (var item3 in item2.Children) - // Console.WriteLine("L3 Query To Execute: " + item3.GetType().Name); - // } - //} - watch.Stop(); logger?.LogInformation("Query builder executed in " + watch.ElapsedMilliseconds + " ms"); diff --git a/src/Schemio.Core/Impl/QueryBuilder.cs b/src/Schemio.Core/Impl/QueryBuilder.cs index 5de3cea..2ed81c2 100644 --- a/src/Schemio.Core/Impl/QueryBuilder.cs +++ b/src/Schemio.Core/Impl/QueryBuilder.cs @@ -57,8 +57,8 @@ private QueryList GetMappedQueries(IReadOnlyCollection> private IEnumerable FilterByPaths(IDataContext context, IEnumerable> mappings) { - var matchedMappings = context.Entity.SchemaPaths != null - ? mappings.Where(mapping => context.Entity.SchemaPaths.Any(Path => schemaPathMatcher.IsMatch(Path, mapping.SchemaPaths))) + var matchedMappings = context.Request?.SchemaPaths != null + ? mappings.Where(mapping => context.Request.SchemaPaths.Any(Path => schemaPathMatcher.IsMatch(Path, mapping.SchemaPaths))) .ToList() : mappings; diff --git a/src/Schemio.Core/XML/XMLDataProvider.cs b/src/Schemio.Core/XML/XMLDataProvider.cs index d4e859d..f3e1872 100644 --- a/src/Schemio.Core/XML/XMLDataProvider.cs +++ b/src/Schemio.Core/XML/XMLDataProvider.cs @@ -28,7 +28,7 @@ public XMLDataProvider(IEntityContextValidator entityContextValidator, /// /// /// XDocument - public virtual XDocument GetData(IEntityContext context) + public virtual XDocument GetData(IEntityRequest context) { // Log Request context. LogRequest(context); @@ -63,8 +63,8 @@ private XDocument TransformToXmlDocument(T dataSource) return doc; } - private void LogRequest(IEntityContext context) => logger.LogInformation(context.GetType().Name); + private void LogRequest(IEntityRequest context) => logger.LogInformation(context.GetType().Name); - private void ValidateRequest(IEntityContext context) => entityContextValidator.Validate(context); + private void ValidateRequest(IEntityRequest context) => entityContextValidator.Validate(context); } } \ No newline at end of file diff --git a/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs b/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs index df2c54f..b44161a 100644 --- a/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs +++ b/tests/Schemio.API.Tests/E2E.Tests/E2ETests.cs @@ -27,7 +27,7 @@ public void Teardown() [Test] public void TestDataProviderToFetchWholeContractWhenNamesAreNull() { - var customer = dataProvider.GetData(new CustomerContext + var customer = dataProvider.GetData(new CustomerRequest { CustomerId = Endpoints.Ids.CustomerId }); @@ -80,7 +80,7 @@ public void TestDataProviderToFetchWholeContractWhenNamesAreNull() [Test] public void TestDataProviderToFetchPartialCustomerOrdersContractWhenNamesAreIncluded() { - var customer = dataProvider.GetData(new CustomerContext + var customer = dataProvider.GetData(new CustomerRequest { CustomerId = Endpoints.Ids.CustomerId, SchemaPaths = ["customer.orders.items"] @@ -120,7 +120,7 @@ public void TestDataProviderToFetchPartialCustomerOrdersContractWhenNamesAreIncl [Test] public void TestDataProviderToFetchPartialCustomerCommunicationContractWhenNamesAreIncluded() { - var customer = dataProvider.GetData(new CustomerContext + var customer = dataProvider.GetData(new CustomerRequest { CustomerId = Endpoints.Ids.CustomerId, SchemaPaths = ["customer.communication"] diff --git a/tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.API.Tests/EntitySetup/CustomerRequest.cs similarity index 76% rename from tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs rename to tests/Schemio.API.Tests/EntitySetup/CustomerRequest.cs index d10e4f9..3568b57 100644 --- a/tests/Schemio.API.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.API.Tests/EntitySetup/CustomerRequest.cs @@ -2,7 +2,7 @@ namespace Schemio.API.Tests.EntitySetup { - internal class CustomerContext : IEntityContext + internal class CustomerRequest : IEntityRequest { public int CustomerId { get; set; } public string[] SchemaPaths { get; set; } diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs index ef798d7..1f5d26f 100644 --- a/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/CustomerWebQuery.cs @@ -12,7 +12,7 @@ public CustomerWebQuery() : base(Endpoints.BaseAddress) protected override Func GetQuery(IDataContext context, IQueryResult parentApiResult) { // Executes as root or level 1 api. - var customerContext = (CustomerContext)context.Entity; + var customerContext = (CustomerRequest)context.Request; return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.Customer, customerContext.CustomerId), UriKind.Absolute); } diff --git a/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs index 7330f02..9d68217 100644 --- a/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs +++ b/tests/Schemio.API.Tests/EntitySetup/WebApis/OrderItemsWebQuery.cs @@ -14,7 +14,7 @@ protected override Func GetQuery(IDataContext context, IQueryResult parentA { // Execute as nested api to order parent api taking OrderResult to resolve api parameter. var orders = (CollectionResult)parentApiResult; - var customerContext = (CustomerContext)context.Entity; + var customerContext = (CustomerRequest)context.Request; return () => new Uri(string.Format(Endpoints.BaseAddress + Endpoints.OrderItems, customerContext.CustomerId, orders.Select(o => o.OrderId).ToCSV()), UriKind.Absolute); } diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs index d3ac786..1d77a96 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs @@ -78,7 +78,7 @@ public override IEnumerable> GetSchema() } } - internal class EntityContext : IEntityContext + internal class EntityContext : IEntityRequest { public int CustomerId { get; set; } public string[] SchemaPaths { get; set; } diff --git a/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs index 944a679..003c58c 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/Configuration/Queries/CustomerQuery.cs @@ -9,7 +9,7 @@ public class CustomerQuery : BaseQuery public override void ResolveQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; + var customer = (CustomerContext)context.Request; QueryParameter = new { customer.CustomerId diff --git a/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs index 9a98422..17dcab3 100644 --- a/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.Core.Tests/EntitySetup/CustomerContext.cs @@ -1,6 +1,6 @@ namespace Schemio.Core.Tests.EntitySetup { - internal class CustomerContext : IEntityContext + internal class CustomerContext : IEntityRequest { public int CustomerId { get; set; } public string[] SchemaPaths { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs b/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs index 48d4f96..860c2b0 100644 --- a/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs +++ b/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs @@ -19,7 +19,7 @@ public void Setup() [Test] public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1 }); @@ -68,7 +68,7 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() [Test] public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1, SchemaPaths = new[] { "Customer/Communication" } @@ -102,7 +102,7 @@ public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() [Test] public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1, SchemaPaths = new[] { "Customer/orders/order/items/item" } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerRequest.cs similarity index 77% rename from tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs rename to tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerRequest.cs index 9339619..e33b242 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/CustomerRequest.cs @@ -2,7 +2,7 @@ namespace Schemio.EntityFramework.Tests.EntitySetup { - internal class CustomerContext : IEntityContext + internal class CustomerRequest : IEntityRequest { public int CustomerId { get; set; } public string[] SchemaPaths { get; set; } diff --git a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs index d63855a..4e8daa8 100644 --- a/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs +++ b/tests/Schemio.EntityFramework.Tests/EntitySetup/EntitySchemas/Queries/CustomerQuery.cs @@ -9,7 +9,7 @@ public class CustomerQuery : SQLQuery protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. parentQueryResult will be null. - var customer = (CustomerContext)context.Entity; + var customer = (CustomerRequest)context.Request; return async dbContext => { diff --git a/tests/Schemio.SQL.Tests/E2E.Tests.cs b/tests/Schemio.SQL.Tests/E2E.Tests.cs index bdf8c1d..23dc60d 100644 --- a/tests/Schemio.SQL.Tests/E2E.Tests.cs +++ b/tests/Schemio.SQL.Tests/E2E.Tests.cs @@ -20,7 +20,7 @@ public void Setup() [Test] public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1 }); @@ -69,7 +69,7 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() [Test] public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1, SchemaPaths = new[] { "Customer/orders/order/items/item" } @@ -105,7 +105,7 @@ public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() [Test] public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() { - var customer = _provider.GetData(new CustomerContext + var customer = _provider.GetData(new CustomerRequest { CustomerId = 1, SchemaPaths = new[] { "Customer/Communication" } @@ -139,7 +139,7 @@ public void TestDataProviderToFetchEntityWhenPathsContainsCommunication() [Test] public void TestDataProviderToCacheResultForResultsWithAttributeApplied() { - var context = new DataContext(new CustomerContext + var context = new DataContext(new CustomerRequest { CustomerId = 1 }); diff --git a/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs b/tests/Schemio.SQL.Tests/EntitySetup/CustomerRequest.cs similarity index 76% rename from tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs rename to tests/Schemio.SQL.Tests/EntitySetup/CustomerRequest.cs index 08db7e7..6234c15 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/CustomerContext.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/CustomerRequest.cs @@ -2,7 +2,7 @@ namespace Schemio.SQL.Tests.EntitySetup { - internal class CustomerContext : IEntityContext + internal class CustomerRequest : IEntityRequest { public int CustomerId { get; set; } public string[] SchemaPaths { get; set; } diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs index d1b9b5d..fb5c2ca 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Queries/CustomerQuery.cs @@ -9,7 +9,7 @@ public class CustomerQuery : SQLQuery protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) { // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; + var customer = (CustomerRequest)context.Request; return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition ( From bfcfe229cb44da3357f57e562c9a0bd07865a2d9 Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 20:44:30 +0000 Subject: [PATCH 54/64] - Update Readme --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b37c28c..b8c163e 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,15 @@ | Schemio.Core|[![NuGet version](https://badge.fury.io/nu/Schemio.Core.svg)](https://badge.fury.io/nu/Schemio.Core) | Provides `core` functionality to configure nested queries and transformers. With ability to map schema paths (XPath/JSONPath) to entity's object graph. `No QueryEngine` provided and requires implementing IQueryEngine to execute IQuery instances. | | Schemio.SQL|[![NuGet version](https://badge.fury.io/nu/Schemio.SQL.svg)](https://badge.fury.io/nu/Schemio.SQL)| Provides schemio with query engine using `Dapper` to execute SQL queries. | | Schemio.EntityFramework|[![NuGet version](https://badge.fury.io/nu/Schemio.EntityFramework.svg)](https://badge.fury.io/nu/Schemio.EntityFramework)| Provides schemio with `Entity Framework` query engine to execute queries using DbContext. | -| Schemio.Api|[![NuGet version](https://badge.fury.io/nu/Schemio.Api.svg)](https://badge.fury.io/nu/Schemio.Api)| Provides schemio with `Web Api` query engine to execute apis using HttpClient. | +| Schemio.API|[![NuGet version](https://badge.fury.io/nu/Schemio.Api.svg)](https://badge.fury.io/nu/Schemio.Api)| Provides schemio with `Web Api` query engine to execute apis using HttpClient. | ## Concept ### What is Schemio? -`Schemio` is a data aggregation framework that +`Schemio` is a data aggregation framework using queries that can target different data platforms. + +Key benefits: - allows fetching `aggregated` data from `heterogeneous` data storages. You could combine queries targetting different data platforms (example. `SQL`, `API`, `Cache`) to return an aggregated data `entity`. -- allows `selectively` fetching only `parts` of the aggregated data entity. You could retrieve an aggregated data entity with only `sections` of its `object graph` `populated` with data depending upon the `context` passed with the request. +- allows `selectively` fetching only `parts` of the aggregated data entity. You could retrieve an aggregated data entity with only `sections` of its `object graph` populated with data depending upon the `schema paths` passed with the request. ### When to use Schemio? Schemio is perfect fit for many use cases. Few examples that require the service tier to dynamically fetch aggregated data with high performance, availability and scalability are From 95dd2502093fe2d3f7fe0f1a544564b0c6181cc9 Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 22:24:25 +0000 Subject: [PATCH 55/64] - Target .Net 9.0 --- src/Schemio.API/Schemio.API.csproj | 2 +- src/Schemio.Core/Schemio.Core.csproj | 8 +-- .../Schemio.EntityFramework.csproj | 4 +- .../Motley - Backup (1).SQL.csproj | 55 ------------------- .../Motley - Backup (10).SQL.csproj | 55 ------------------- .../Motley - Backup (100).SQL.csproj | 55 ------------------- .../Motley - Backup (101).SQL.csproj | 55 ------------------- .../Motley - Backup (102).SQL.csproj | 55 ------------------- .../Motley - Backup (103).SQL.csproj | 55 ------------------- .../Motley - Backup (104).SQL.csproj | 55 ------------------- .../Motley - Backup (105).SQL.csproj | 55 ------------------- .../Motley - Backup (106).SQL.csproj | 55 ------------------- .../Motley - Backup (107).SQL.csproj | 55 ------------------- .../Motley - Backup (108).SQL.csproj | 55 ------------------- .../Motley - Backup (109).SQL.csproj | 55 ------------------- .../Motley - Backup (11).SQL.csproj | 55 ------------------- .../Motley - Backup (110).SQL.csproj | 55 ------------------- .../Motley - Backup (111).SQL.csproj | 55 ------------------- .../Motley - Backup (112).SQL.csproj | 55 ------------------- .../Motley - Backup (113).SQL.csproj | 55 ------------------- .../Motley - Backup (114).SQL.csproj | 55 ------------------- .../Motley - Backup (115).SQL.csproj | 55 ------------------- .../Motley - Backup (116).SQL.csproj | 55 ------------------- .../Motley - Backup (117).SQL.csproj | 55 ------------------- .../Motley - Backup (118).SQL.csproj | 55 ------------------- .../Motley - Backup (119).SQL.csproj | 55 ------------------- .../Motley - Backup (12).SQL.csproj | 55 ------------------- .../Motley - Backup (120).SQL.csproj | 55 ------------------- .../Motley - Backup (121).SQL.csproj | 55 ------------------- .../Motley - Backup (122).SQL.csproj | 55 ------------------- .../Motley - Backup (123).SQL.csproj | 55 ------------------- .../Motley - Backup (124).SQL.csproj | 55 ------------------- .../Motley - Backup (125).SQL.csproj | 55 ------------------- .../Motley - Backup (126).SQL.csproj | 55 ------------------- .../Motley - Backup (127).SQL.csproj | 55 ------------------- .../Motley - Backup (128).SQL.csproj | 55 ------------------- .../Motley - Backup (129).SQL.csproj | 55 ------------------- .../Motley - Backup (13).SQL.csproj | 55 ------------------- .../Motley - Backup (130).SQL.csproj | 55 ------------------- .../Motley - Backup (131).SQL.csproj | 55 ------------------- .../Motley - Backup (132).SQL.csproj | 55 ------------------- .../Motley - Backup (133).SQL.csproj | 55 ------------------- .../Motley - Backup (134).SQL.csproj | 55 ------------------- .../Motley - Backup (135).SQL.csproj | 55 ------------------- .../Motley - Backup (136).SQL.csproj | 55 ------------------- .../Motley - Backup (137).SQL.csproj | 55 ------------------- .../Motley - Backup (138).SQL.csproj | 55 ------------------- .../Motley - Backup (139).SQL.csproj | 55 ------------------- .../Motley - Backup (14).SQL.csproj | 55 ------------------- .../Motley - Backup (140).SQL.csproj | 55 ------------------- .../Motley - Backup (141).SQL.csproj | 55 ------------------- .../Motley - Backup (142).SQL.csproj | 55 ------------------- .../Motley - Backup (143).SQL.csproj | 55 ------------------- .../Motley - Backup (144).SQL.csproj | 55 ------------------- .../Motley - Backup (145).SQL.csproj | 55 ------------------- .../Motley - Backup (146).SQL.csproj | 55 ------------------- .../Motley - Backup (147).SQL.csproj | 55 ------------------- .../Motley - Backup (148).SQL.csproj | 55 ------------------- .../Motley - Backup (149).SQL.csproj | 55 ------------------- .../Motley - Backup (15).SQL.csproj | 55 ------------------- .../Motley - Backup (150).SQL.csproj | 55 ------------------- .../Motley - Backup (151).SQL.csproj | 55 ------------------- .../Motley - Backup (152).SQL.csproj | 55 ------------------- .../Motley - Backup (153).SQL.csproj | 55 ------------------- .../Motley - Backup (154).SQL.csproj | 55 ------------------- .../Motley - Backup (155).SQL.csproj | 55 ------------------- .../Motley - Backup (156).SQL.csproj | 55 ------------------- .../Motley - Backup (157).SQL.csproj | 55 ------------------- .../Motley - Backup (158).SQL.csproj | 55 ------------------- .../Motley - Backup (159).SQL.csproj | 55 ------------------- .../Motley - Backup (16).SQL.csproj | 55 ------------------- .../Motley - Backup (160).SQL.csproj | 55 ------------------- .../Motley - Backup (161).SQL.csproj | 55 ------------------- .../Motley - Backup (162).SQL.csproj | 55 ------------------- .../Motley - Backup (163).SQL.csproj | 55 ------------------- .../Motley - Backup (164).SQL.csproj | 55 ------------------- .../Motley - Backup (165).SQL.csproj | 55 ------------------- .../Motley - Backup (166).SQL.csproj | 55 ------------------- .../Motley - Backup (167).SQL.csproj | 55 ------------------- .../Motley - Backup (168).SQL.csproj | 55 ------------------- .../Motley - Backup (169).SQL.csproj | 55 ------------------- .../Motley - Backup (17).SQL.csproj | 55 ------------------- .../Motley - Backup (170).SQL.csproj | 55 ------------------- .../Motley - Backup (171).SQL.csproj | 55 ------------------- .../Motley - Backup (172).SQL.csproj | 55 ------------------- .../Motley - Backup (173).SQL.csproj | 55 ------------------- .../Motley - Backup (174).SQL.csproj | 55 ------------------- .../Motley - Backup (175).SQL.csproj | 55 ------------------- .../Motley - Backup (176).SQL.csproj | 55 ------------------- .../Motley - Backup (177).SQL.csproj | 55 ------------------- .../Motley - Backup (178).SQL.csproj | 55 ------------------- .../Motley - Backup (179).SQL.csproj | 55 ------------------- .../Motley - Backup (18).SQL.csproj | 55 ------------------- .../Motley - Backup (180).SQL.csproj | 55 ------------------- .../Motley - Backup (181).SQL.csproj | 55 ------------------- .../Motley - Backup (182).SQL.csproj | 55 ------------------- .../Motley - Backup (183).SQL.csproj | 55 ------------------- .../Motley - Backup (184).SQL.csproj | 55 ------------------- .../Motley - Backup (185).SQL.csproj | 55 ------------------- .../Motley - Backup (186).SQL.csproj | 55 ------------------- .../Motley - Backup (187).SQL.csproj | 55 ------------------- .../Motley - Backup (188).SQL.csproj | 55 ------------------- .../Motley - Backup (189).SQL.csproj | 55 ------------------- .../Motley - Backup (19).SQL.csproj | 55 ------------------- .../Motley - Backup (190).SQL.csproj | 55 ------------------- .../Motley - Backup (191).SQL.csproj | 55 ------------------- .../Motley - Backup (192).SQL.csproj | 55 ------------------- .../Motley - Backup (193).SQL.csproj | 55 ------------------- .../Motley - Backup (194).SQL.csproj | 55 ------------------- .../Motley - Backup (195).SQL.csproj | 55 ------------------- .../Motley - Backup (196).SQL.csproj | 55 ------------------- .../Motley - Backup (197).SQL.csproj | 55 ------------------- .../Motley - Backup (198).SQL.csproj | 55 ------------------- .../Motley - Backup (199).SQL.csproj | 55 ------------------- .../Motley - Backup (2).SQL.csproj | 55 ------------------- .../Motley - Backup (20).SQL.csproj | 55 ------------------- .../Motley - Backup (200).SQL.csproj | 55 ------------------- .../Motley - Backup (201).SQL.csproj | 55 ------------------- .../Motley - Backup (202).SQL.csproj | 55 ------------------- .../Motley - Backup (203).SQL.csproj | 55 ------------------- .../Motley - Backup (204).SQL.csproj | 55 ------------------- .../Motley - Backup (205).SQL.csproj | 55 ------------------- .../Motley - Backup (206).SQL.csproj | 55 ------------------- .../Motley - Backup (207).SQL.csproj | 55 ------------------- .../Motley - Backup (208).SQL.csproj | 55 ------------------- .../Motley - Backup (209).SQL.csproj | 55 ------------------- .../Motley - Backup (21).SQL.csproj | 55 ------------------- .../Motley - Backup (210).SQL.csproj | 55 ------------------- .../Motley - Backup (211).SQL.csproj | 55 ------------------- .../Motley - Backup (212).SQL.csproj | 55 ------------------- .../Motley - Backup (213).SQL.csproj | 55 ------------------- .../Motley - Backup (214).SQL.csproj | 55 ------------------- .../Motley - Backup (215).SQL.csproj | 55 ------------------- .../Motley - Backup (216).SQL.csproj | 55 ------------------- .../Motley - Backup (217).SQL.csproj | 55 ------------------- .../Motley - Backup (218).SQL.csproj | 55 ------------------- .../Motley - Backup (219).SQL.csproj | 55 ------------------- .../Motley - Backup (22).SQL.csproj | 55 ------------------- .../Motley - Backup (220).SQL.csproj | 55 ------------------- .../Motley - Backup (221).SQL.csproj | 55 ------------------- .../Motley - Backup (222).SQL.csproj | 54 ------------------ .../Motley - Backup (23).SQL.csproj | 55 ------------------- .../Motley - Backup (24).SQL.csproj | 55 ------------------- .../Motley - Backup (25).SQL.csproj | 55 ------------------- .../Motley - Backup (26).SQL.csproj | 55 ------------------- .../Motley - Backup (27).SQL.csproj | 55 ------------------- .../Motley - Backup (28).SQL.csproj | 55 ------------------- .../Motley - Backup (29).SQL.csproj | 55 ------------------- .../Motley - Backup (3).SQL.csproj | 55 ------------------- .../Motley - Backup (30).SQL.csproj | 55 ------------------- .../Motley - Backup (31).SQL.csproj | 55 ------------------- .../Motley - Backup (32).SQL.csproj | 55 ------------------- .../Motley - Backup (33).SQL.csproj | 55 ------------------- .../Motley - Backup (34).SQL.csproj | 55 ------------------- .../Motley - Backup (35).SQL.csproj | 55 ------------------- .../Motley - Backup (36).SQL.csproj | 55 ------------------- .../Motley - Backup (37).SQL.csproj | 55 ------------------- .../Motley - Backup (38).SQL.csproj | 55 ------------------- .../Motley - Backup (39).SQL.csproj | 55 ------------------- .../Motley - Backup (4).SQL.csproj | 55 ------------------- .../Motley - Backup (40).SQL.csproj | 55 ------------------- .../Motley - Backup (41).SQL.csproj | 55 ------------------- .../Motley - Backup (42).SQL.csproj | 55 ------------------- .../Motley - Backup (43).SQL.csproj | 55 ------------------- .../Motley - Backup (44).SQL.csproj | 55 ------------------- .../Motley - Backup (45).SQL.csproj | 55 ------------------- .../Motley - Backup (46).SQL.csproj | 55 ------------------- .../Motley - Backup (47).SQL.csproj | 55 ------------------- .../Motley - Backup (48).SQL.csproj | 55 ------------------- .../Motley - Backup (49).SQL.csproj | 55 ------------------- .../Motley - Backup (5).SQL.csproj | 55 ------------------- .../Motley - Backup (50).SQL.csproj | 55 ------------------- .../Motley - Backup (51).SQL.csproj | 55 ------------------- .../Motley - Backup (52).SQL.csproj | 55 ------------------- .../Motley - Backup (53).SQL.csproj | 55 ------------------- .../Motley - Backup (54).SQL.csproj | 55 ------------------- .../Motley - Backup (55).SQL.csproj | 55 ------------------- .../Motley - Backup (56).SQL.csproj | 55 ------------------- .../Motley - Backup (57).SQL.csproj | 55 ------------------- .../Motley - Backup (58).SQL.csproj | 55 ------------------- .../Motley - Backup (59).SQL.csproj | 55 ------------------- .../Motley - Backup (6).SQL.csproj | 55 ------------------- .../Motley - Backup (60).SQL.csproj | 55 ------------------- .../Motley - Backup (61).SQL.csproj | 55 ------------------- .../Motley - Backup (62).SQL.csproj | 55 ------------------- .../Motley - Backup (63).SQL.csproj | 55 ------------------- .../Motley - Backup (64).SQL.csproj | 55 ------------------- .../Motley - Backup (65).SQL.csproj | 55 ------------------- .../Motley - Backup (66).SQL.csproj | 55 ------------------- .../Motley - Backup (67).SQL.csproj | 55 ------------------- .../Motley - Backup (68).SQL.csproj | 55 ------------------- .../Motley - Backup (69).SQL.csproj | 55 ------------------- .../Motley - Backup (7).SQL.csproj | 55 ------------------- .../Motley - Backup (70).SQL.csproj | 55 ------------------- .../Motley - Backup (71).SQL.csproj | 55 ------------------- .../Motley - Backup (72).SQL.csproj | 55 ------------------- .../Motley - Backup (73).SQL.csproj | 55 ------------------- .../Motley - Backup (74).SQL.csproj | 55 ------------------- .../Motley - Backup (75).SQL.csproj | 55 ------------------- .../Motley - Backup (76).SQL.csproj | 55 ------------------- .../Motley - Backup (77).SQL.csproj | 55 ------------------- .../Motley - Backup (78).SQL.csproj | 55 ------------------- .../Motley - Backup (79).SQL.csproj | 55 ------------------- .../Motley - Backup (8).SQL.csproj | 55 ------------------- .../Motley - Backup (80).SQL.csproj | 55 ------------------- .../Motley - Backup (81).SQL.csproj | 55 ------------------- .../Motley - Backup (82).SQL.csproj | 55 ------------------- .../Motley - Backup (83).SQL.csproj | 55 ------------------- .../Motley - Backup (84).SQL.csproj | 55 ------------------- .../Motley - Backup (85).SQL.csproj | 55 ------------------- .../Motley - Backup (86).SQL.csproj | 55 ------------------- .../Motley - Backup (87).SQL.csproj | 55 ------------------- .../Motley - Backup (88).SQL.csproj | 55 ------------------- .../Motley - Backup (89).SQL.csproj | 55 ------------------- .../Motley - Backup (9).SQL.csproj | 55 ------------------- .../Motley - Backup (90).SQL.csproj | 55 ------------------- .../Motley - Backup (91).SQL.csproj | 55 ------------------- .../Motley - Backup (92).SQL.csproj | 55 ------------------- .../Motley - Backup (93).SQL.csproj | 55 ------------------- .../Motley - Backup (94).SQL.csproj | 55 ------------------- .../Motley - Backup (95).SQL.csproj | 55 ------------------- .../Motley - Backup (96).SQL.csproj | 55 ------------------- .../Motley - Backup (97).SQL.csproj | 55 ------------------- .../Motley - Backup (98).SQL.csproj | 55 ------------------- .../Motley - Backup (99).SQL.csproj | 55 ------------------- src/Schemio.SQL/Motley - Backup.SQL.csproj | 55 ------------------- src/Schemio.SQL/Schemio.SQL.csproj | 6 +- .../Schemio.API.Tests.csproj | 20 ++++--- .../DataProvider.Tests/EntityBuilderTests.cs | 2 +- .../DataProvider.Tests/QueryBuilderTests.cs | 18 +++--- .../Schemio.Core.Tests.csproj | 20 ++++--- .../Schemio.EntityFramework.Tests/BaseTest.cs | 4 +- .../Schemio.EntityFramework.Tests.csproj | 24 +++++--- tests/Schemio.SQL.Tests/BaseTest.cs | 4 +- .../Schemio.SQL.Tests.csproj | 26 +++++---- 235 files changed, 83 insertions(+), 12319 deletions(-) delete mode 100644 src/Schemio.SQL/Motley - Backup (1).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (10).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (100).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (101).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (102).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (103).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (104).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (105).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (106).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (107).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (108).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (109).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (11).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (110).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (111).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (112).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (113).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (114).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (115).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (116).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (117).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (118).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (119).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (12).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (120).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (121).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (122).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (123).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (124).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (125).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (126).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (127).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (128).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (129).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (13).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (130).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (131).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (132).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (133).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (134).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (135).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (136).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (137).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (138).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (139).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (14).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (140).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (141).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (142).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (143).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (144).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (145).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (146).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (147).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (148).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (149).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (15).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (150).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (151).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (152).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (153).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (154).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (155).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (156).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (157).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (158).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (159).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (16).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (160).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (161).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (162).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (163).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (164).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (165).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (166).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (167).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (168).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (169).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (17).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (170).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (171).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (172).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (173).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (174).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (175).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (176).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (177).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (178).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (179).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (18).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (180).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (181).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (182).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (183).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (184).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (185).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (186).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (187).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (188).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (189).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (19).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (190).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (191).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (192).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (193).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (194).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (195).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (196).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (197).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (198).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (199).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (2).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (20).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (200).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (201).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (202).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (203).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (204).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (205).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (206).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (207).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (208).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (209).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (21).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (210).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (211).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (212).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (213).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (214).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (215).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (216).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (217).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (218).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (219).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (22).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (220).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (221).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (222).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (23).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (24).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (25).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (26).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (27).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (28).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (29).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (3).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (30).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (31).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (32).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (33).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (34).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (35).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (36).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (37).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (38).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (39).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (4).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (40).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (41).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (42).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (43).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (44).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (45).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (46).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (47).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (48).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (49).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (5).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (50).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (51).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (52).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (53).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (54).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (55).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (56).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (57).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (58).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (59).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (6).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (60).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (61).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (62).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (63).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (64).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (65).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (66).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (67).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (68).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (69).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (7).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (70).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (71).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (72).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (73).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (74).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (75).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (76).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (77).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (78).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (79).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (8).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (80).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (81).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (82).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (83).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (84).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (85).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (86).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (87).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (88).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (89).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (9).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (90).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (91).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (92).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (93).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (94).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (95).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (96).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (97).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (98).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup (99).SQL.csproj delete mode 100644 src/Schemio.SQL/Motley - Backup.SQL.csproj diff --git a/src/Schemio.API/Schemio.API.csproj b/src/Schemio.API/Schemio.API.csproj index d51b5fc..fe22f30 100644 --- a/src/Schemio.API/Schemio.API.csproj +++ b/src/Schemio.API/Schemio.API.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable diff --git a/src/Schemio.Core/Schemio.Core.csproj b/src/Schemio.Core/Schemio.Core.csproj index 00fcd1a..8579bc0 100644 --- a/src/Schemio.Core/Schemio.Core.csproj +++ b/src/Schemio.Core/Schemio.Core.csproj @@ -1,7 +1,7 @@ - + - net8.0 + net9.0 enable enable true @@ -39,8 +39,8 @@ - - + + diff --git a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj index 3635f2d..a7c656c 100644 --- a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj +++ b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable true enable @@ -43,7 +43,7 @@ - + diff --git a/src/Schemio.SQL/Motley - Backup (1).SQL.csproj b/src/Schemio.SQL/Motley - Backup (1).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (1).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (10).SQL.csproj b/src/Schemio.SQL/Motley - Backup (10).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (10).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (100).SQL.csproj b/src/Schemio.SQL/Motley - Backup (100).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (100).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (101).SQL.csproj b/src/Schemio.SQL/Motley - Backup (101).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (101).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (102).SQL.csproj b/src/Schemio.SQL/Motley - Backup (102).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (102).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (103).SQL.csproj b/src/Schemio.SQL/Motley - Backup (103).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (103).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (104).SQL.csproj b/src/Schemio.SQL/Motley - Backup (104).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (104).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (105).SQL.csproj b/src/Schemio.SQL/Motley - Backup (105).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (105).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (106).SQL.csproj b/src/Schemio.SQL/Motley - Backup (106).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (106).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (107).SQL.csproj b/src/Schemio.SQL/Motley - Backup (107).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (107).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (108).SQL.csproj b/src/Schemio.SQL/Motley - Backup (108).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (108).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (109).SQL.csproj b/src/Schemio.SQL/Motley - Backup (109).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (109).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (11).SQL.csproj b/src/Schemio.SQL/Motley - Backup (11).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (11).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (110).SQL.csproj b/src/Schemio.SQL/Motley - Backup (110).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (110).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (111).SQL.csproj b/src/Schemio.SQL/Motley - Backup (111).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (111).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (112).SQL.csproj b/src/Schemio.SQL/Motley - Backup (112).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (112).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (113).SQL.csproj b/src/Schemio.SQL/Motley - Backup (113).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (113).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (114).SQL.csproj b/src/Schemio.SQL/Motley - Backup (114).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (114).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (115).SQL.csproj b/src/Schemio.SQL/Motley - Backup (115).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (115).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (116).SQL.csproj b/src/Schemio.SQL/Motley - Backup (116).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (116).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (117).SQL.csproj b/src/Schemio.SQL/Motley - Backup (117).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (117).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (118).SQL.csproj b/src/Schemio.SQL/Motley - Backup (118).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (118).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (119).SQL.csproj b/src/Schemio.SQL/Motley - Backup (119).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (119).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (12).SQL.csproj b/src/Schemio.SQL/Motley - Backup (12).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (12).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (120).SQL.csproj b/src/Schemio.SQL/Motley - Backup (120).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (120).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (121).SQL.csproj b/src/Schemio.SQL/Motley - Backup (121).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (121).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (122).SQL.csproj b/src/Schemio.SQL/Motley - Backup (122).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (122).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (123).SQL.csproj b/src/Schemio.SQL/Motley - Backup (123).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (123).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (124).SQL.csproj b/src/Schemio.SQL/Motley - Backup (124).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (124).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (125).SQL.csproj b/src/Schemio.SQL/Motley - Backup (125).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (125).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (126).SQL.csproj b/src/Schemio.SQL/Motley - Backup (126).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (126).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (127).SQL.csproj b/src/Schemio.SQL/Motley - Backup (127).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (127).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (128).SQL.csproj b/src/Schemio.SQL/Motley - Backup (128).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (128).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (129).SQL.csproj b/src/Schemio.SQL/Motley - Backup (129).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (129).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (13).SQL.csproj b/src/Schemio.SQL/Motley - Backup (13).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (13).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (130).SQL.csproj b/src/Schemio.SQL/Motley - Backup (130).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (130).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (131).SQL.csproj b/src/Schemio.SQL/Motley - Backup (131).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (131).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (132).SQL.csproj b/src/Schemio.SQL/Motley - Backup (132).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (132).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (133).SQL.csproj b/src/Schemio.SQL/Motley - Backup (133).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (133).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (134).SQL.csproj b/src/Schemio.SQL/Motley - Backup (134).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (134).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (135).SQL.csproj b/src/Schemio.SQL/Motley - Backup (135).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (135).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (136).SQL.csproj b/src/Schemio.SQL/Motley - Backup (136).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (136).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (137).SQL.csproj b/src/Schemio.SQL/Motley - Backup (137).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (137).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (138).SQL.csproj b/src/Schemio.SQL/Motley - Backup (138).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (138).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (139).SQL.csproj b/src/Schemio.SQL/Motley - Backup (139).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (139).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (14).SQL.csproj b/src/Schemio.SQL/Motley - Backup (14).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (14).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (140).SQL.csproj b/src/Schemio.SQL/Motley - Backup (140).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (140).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (141).SQL.csproj b/src/Schemio.SQL/Motley - Backup (141).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (141).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (142).SQL.csproj b/src/Schemio.SQL/Motley - Backup (142).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (142).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (143).SQL.csproj b/src/Schemio.SQL/Motley - Backup (143).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (143).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (144).SQL.csproj b/src/Schemio.SQL/Motley - Backup (144).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (144).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (145).SQL.csproj b/src/Schemio.SQL/Motley - Backup (145).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (145).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (146).SQL.csproj b/src/Schemio.SQL/Motley - Backup (146).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (146).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (147).SQL.csproj b/src/Schemio.SQL/Motley - Backup (147).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (147).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (148).SQL.csproj b/src/Schemio.SQL/Motley - Backup (148).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (148).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (149).SQL.csproj b/src/Schemio.SQL/Motley - Backup (149).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (149).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (15).SQL.csproj b/src/Schemio.SQL/Motley - Backup (15).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (15).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (150).SQL.csproj b/src/Schemio.SQL/Motley - Backup (150).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (150).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (151).SQL.csproj b/src/Schemio.SQL/Motley - Backup (151).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (151).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (152).SQL.csproj b/src/Schemio.SQL/Motley - Backup (152).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (152).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (153).SQL.csproj b/src/Schemio.SQL/Motley - Backup (153).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (153).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (154).SQL.csproj b/src/Schemio.SQL/Motley - Backup (154).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (154).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (155).SQL.csproj b/src/Schemio.SQL/Motley - Backup (155).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (155).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (156).SQL.csproj b/src/Schemio.SQL/Motley - Backup (156).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (156).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (157).SQL.csproj b/src/Schemio.SQL/Motley - Backup (157).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (157).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (158).SQL.csproj b/src/Schemio.SQL/Motley - Backup (158).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (158).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (159).SQL.csproj b/src/Schemio.SQL/Motley - Backup (159).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (159).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (16).SQL.csproj b/src/Schemio.SQL/Motley - Backup (16).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (16).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (160).SQL.csproj b/src/Schemio.SQL/Motley - Backup (160).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (160).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (161).SQL.csproj b/src/Schemio.SQL/Motley - Backup (161).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (161).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (162).SQL.csproj b/src/Schemio.SQL/Motley - Backup (162).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (162).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (163).SQL.csproj b/src/Schemio.SQL/Motley - Backup (163).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (163).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (164).SQL.csproj b/src/Schemio.SQL/Motley - Backup (164).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (164).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (165).SQL.csproj b/src/Schemio.SQL/Motley - Backup (165).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (165).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (166).SQL.csproj b/src/Schemio.SQL/Motley - Backup (166).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (166).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (167).SQL.csproj b/src/Schemio.SQL/Motley - Backup (167).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (167).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (168).SQL.csproj b/src/Schemio.SQL/Motley - Backup (168).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (168).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (169).SQL.csproj b/src/Schemio.SQL/Motley - Backup (169).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (169).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (17).SQL.csproj b/src/Schemio.SQL/Motley - Backup (17).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (17).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (170).SQL.csproj b/src/Schemio.SQL/Motley - Backup (170).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (170).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (171).SQL.csproj b/src/Schemio.SQL/Motley - Backup (171).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (171).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (172).SQL.csproj b/src/Schemio.SQL/Motley - Backup (172).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (172).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (173).SQL.csproj b/src/Schemio.SQL/Motley - Backup (173).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (173).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (174).SQL.csproj b/src/Schemio.SQL/Motley - Backup (174).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (174).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (175).SQL.csproj b/src/Schemio.SQL/Motley - Backup (175).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (175).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (176).SQL.csproj b/src/Schemio.SQL/Motley - Backup (176).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (176).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (177).SQL.csproj b/src/Schemio.SQL/Motley - Backup (177).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (177).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (178).SQL.csproj b/src/Schemio.SQL/Motley - Backup (178).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (178).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (179).SQL.csproj b/src/Schemio.SQL/Motley - Backup (179).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (179).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (18).SQL.csproj b/src/Schemio.SQL/Motley - Backup (18).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (18).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (180).SQL.csproj b/src/Schemio.SQL/Motley - Backup (180).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (180).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (181).SQL.csproj b/src/Schemio.SQL/Motley - Backup (181).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (181).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (182).SQL.csproj b/src/Schemio.SQL/Motley - Backup (182).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (182).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (183).SQL.csproj b/src/Schemio.SQL/Motley - Backup (183).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (183).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (184).SQL.csproj b/src/Schemio.SQL/Motley - Backup (184).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (184).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (185).SQL.csproj b/src/Schemio.SQL/Motley - Backup (185).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (185).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (186).SQL.csproj b/src/Schemio.SQL/Motley - Backup (186).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (186).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (187).SQL.csproj b/src/Schemio.SQL/Motley - Backup (187).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (187).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (188).SQL.csproj b/src/Schemio.SQL/Motley - Backup (188).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (188).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (189).SQL.csproj b/src/Schemio.SQL/Motley - Backup (189).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (189).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (19).SQL.csproj b/src/Schemio.SQL/Motley - Backup (19).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (19).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (190).SQL.csproj b/src/Schemio.SQL/Motley - Backup (190).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (190).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (191).SQL.csproj b/src/Schemio.SQL/Motley - Backup (191).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (191).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (192).SQL.csproj b/src/Schemio.SQL/Motley - Backup (192).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (192).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (193).SQL.csproj b/src/Schemio.SQL/Motley - Backup (193).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (193).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (194).SQL.csproj b/src/Schemio.SQL/Motley - Backup (194).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (194).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (195).SQL.csproj b/src/Schemio.SQL/Motley - Backup (195).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (195).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (196).SQL.csproj b/src/Schemio.SQL/Motley - Backup (196).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (196).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (197).SQL.csproj b/src/Schemio.SQL/Motley - Backup (197).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (197).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (198).SQL.csproj b/src/Schemio.SQL/Motley - Backup (198).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (198).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (199).SQL.csproj b/src/Schemio.SQL/Motley - Backup (199).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (199).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (2).SQL.csproj b/src/Schemio.SQL/Motley - Backup (2).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (2).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (20).SQL.csproj b/src/Schemio.SQL/Motley - Backup (20).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (20).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (200).SQL.csproj b/src/Schemio.SQL/Motley - Backup (200).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (200).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (201).SQL.csproj b/src/Schemio.SQL/Motley - Backup (201).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (201).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (202).SQL.csproj b/src/Schemio.SQL/Motley - Backup (202).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (202).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (203).SQL.csproj b/src/Schemio.SQL/Motley - Backup (203).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (203).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (204).SQL.csproj b/src/Schemio.SQL/Motley - Backup (204).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (204).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (205).SQL.csproj b/src/Schemio.SQL/Motley - Backup (205).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (205).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (206).SQL.csproj b/src/Schemio.SQL/Motley - Backup (206).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (206).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (207).SQL.csproj b/src/Schemio.SQL/Motley - Backup (207).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (207).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (208).SQL.csproj b/src/Schemio.SQL/Motley - Backup (208).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (208).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (209).SQL.csproj b/src/Schemio.SQL/Motley - Backup (209).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (209).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (21).SQL.csproj b/src/Schemio.SQL/Motley - Backup (21).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (21).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (210).SQL.csproj b/src/Schemio.SQL/Motley - Backup (210).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (210).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (211).SQL.csproj b/src/Schemio.SQL/Motley - Backup (211).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (211).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (212).SQL.csproj b/src/Schemio.SQL/Motley - Backup (212).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (212).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (213).SQL.csproj b/src/Schemio.SQL/Motley - Backup (213).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (213).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (214).SQL.csproj b/src/Schemio.SQL/Motley - Backup (214).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (214).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (215).SQL.csproj b/src/Schemio.SQL/Motley - Backup (215).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (215).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (216).SQL.csproj b/src/Schemio.SQL/Motley - Backup (216).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (216).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (217).SQL.csproj b/src/Schemio.SQL/Motley - Backup (217).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (217).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (218).SQL.csproj b/src/Schemio.SQL/Motley - Backup (218).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (218).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (219).SQL.csproj b/src/Schemio.SQL/Motley - Backup (219).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (219).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (22).SQL.csproj b/src/Schemio.SQL/Motley - Backup (22).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (22).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (220).SQL.csproj b/src/Schemio.SQL/Motley - Backup (220).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (220).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (221).SQL.csproj b/src/Schemio.SQL/Motley - Backup (221).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (221).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (222).SQL.csproj b/src/Schemio.SQL/Motley - Backup (222).SQL.csproj deleted file mode 100644 index f8e4eb3..0000000 --- a/src/Schemio.SQL/Motley - Backup (222).SQL.csproj +++ /dev/null @@ -1,54 +0,0 @@ - - - - net8.0 - enable - enable - true - Schemio with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Schemio - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Schemio/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (23).SQL.csproj b/src/Schemio.SQL/Motley - Backup (23).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (23).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (24).SQL.csproj b/src/Schemio.SQL/Motley - Backup (24).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (24).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (25).SQL.csproj b/src/Schemio.SQL/Motley - Backup (25).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (25).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (26).SQL.csproj b/src/Schemio.SQL/Motley - Backup (26).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (26).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (27).SQL.csproj b/src/Schemio.SQL/Motley - Backup (27).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (27).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (28).SQL.csproj b/src/Schemio.SQL/Motley - Backup (28).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (28).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (29).SQL.csproj b/src/Schemio.SQL/Motley - Backup (29).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (29).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (3).SQL.csproj b/src/Schemio.SQL/Motley - Backup (3).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (3).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (30).SQL.csproj b/src/Schemio.SQL/Motley - Backup (30).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (30).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (31).SQL.csproj b/src/Schemio.SQL/Motley - Backup (31).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (31).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (32).SQL.csproj b/src/Schemio.SQL/Motley - Backup (32).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (32).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (33).SQL.csproj b/src/Schemio.SQL/Motley - Backup (33).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (33).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (34).SQL.csproj b/src/Schemio.SQL/Motley - Backup (34).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (34).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (35).SQL.csproj b/src/Schemio.SQL/Motley - Backup (35).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (35).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (36).SQL.csproj b/src/Schemio.SQL/Motley - Backup (36).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (36).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (37).SQL.csproj b/src/Schemio.SQL/Motley - Backup (37).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (37).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (38).SQL.csproj b/src/Schemio.SQL/Motley - Backup (38).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (38).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (39).SQL.csproj b/src/Schemio.SQL/Motley - Backup (39).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (39).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (4).SQL.csproj b/src/Schemio.SQL/Motley - Backup (4).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (4).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (40).SQL.csproj b/src/Schemio.SQL/Motley - Backup (40).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (40).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (41).SQL.csproj b/src/Schemio.SQL/Motley - Backup (41).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (41).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (42).SQL.csproj b/src/Schemio.SQL/Motley - Backup (42).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (42).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (43).SQL.csproj b/src/Schemio.SQL/Motley - Backup (43).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (43).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (44).SQL.csproj b/src/Schemio.SQL/Motley - Backup (44).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (44).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (45).SQL.csproj b/src/Schemio.SQL/Motley - Backup (45).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (45).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (46).SQL.csproj b/src/Schemio.SQL/Motley - Backup (46).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (46).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (47).SQL.csproj b/src/Schemio.SQL/Motley - Backup (47).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (47).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (48).SQL.csproj b/src/Schemio.SQL/Motley - Backup (48).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (48).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (49).SQL.csproj b/src/Schemio.SQL/Motley - Backup (49).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (49).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (5).SQL.csproj b/src/Schemio.SQL/Motley - Backup (5).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (5).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (50).SQL.csproj b/src/Schemio.SQL/Motley - Backup (50).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (50).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (51).SQL.csproj b/src/Schemio.SQL/Motley - Backup (51).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (51).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (52).SQL.csproj b/src/Schemio.SQL/Motley - Backup (52).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (52).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (53).SQL.csproj b/src/Schemio.SQL/Motley - Backup (53).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (53).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (54).SQL.csproj b/src/Schemio.SQL/Motley - Backup (54).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (54).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (55).SQL.csproj b/src/Schemio.SQL/Motley - Backup (55).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (55).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (56).SQL.csproj b/src/Schemio.SQL/Motley - Backup (56).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (56).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (57).SQL.csproj b/src/Schemio.SQL/Motley - Backup (57).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (57).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (58).SQL.csproj b/src/Schemio.SQL/Motley - Backup (58).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (58).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (59).SQL.csproj b/src/Schemio.SQL/Motley - Backup (59).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (59).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (6).SQL.csproj b/src/Schemio.SQL/Motley - Backup (6).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (6).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (60).SQL.csproj b/src/Schemio.SQL/Motley - Backup (60).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (60).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (61).SQL.csproj b/src/Schemio.SQL/Motley - Backup (61).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (61).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (62).SQL.csproj b/src/Schemio.SQL/Motley - Backup (62).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (62).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (63).SQL.csproj b/src/Schemio.SQL/Motley - Backup (63).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (63).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (64).SQL.csproj b/src/Schemio.SQL/Motley - Backup (64).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (64).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (65).SQL.csproj b/src/Schemio.SQL/Motley - Backup (65).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (65).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (66).SQL.csproj b/src/Schemio.SQL/Motley - Backup (66).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (66).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (67).SQL.csproj b/src/Schemio.SQL/Motley - Backup (67).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (67).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (68).SQL.csproj b/src/Schemio.SQL/Motley - Backup (68).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (68).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (69).SQL.csproj b/src/Schemio.SQL/Motley - Backup (69).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (69).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (7).SQL.csproj b/src/Schemio.SQL/Motley - Backup (7).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (7).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (70).SQL.csproj b/src/Schemio.SQL/Motley - Backup (70).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (70).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (71).SQL.csproj b/src/Schemio.SQL/Motley - Backup (71).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (71).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (72).SQL.csproj b/src/Schemio.SQL/Motley - Backup (72).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (72).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (73).SQL.csproj b/src/Schemio.SQL/Motley - Backup (73).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (73).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (74).SQL.csproj b/src/Schemio.SQL/Motley - Backup (74).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (74).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (75).SQL.csproj b/src/Schemio.SQL/Motley - Backup (75).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (75).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (76).SQL.csproj b/src/Schemio.SQL/Motley - Backup (76).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (76).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (77).SQL.csproj b/src/Schemio.SQL/Motley - Backup (77).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (77).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (78).SQL.csproj b/src/Schemio.SQL/Motley - Backup (78).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (78).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (79).SQL.csproj b/src/Schemio.SQL/Motley - Backup (79).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (79).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (8).SQL.csproj b/src/Schemio.SQL/Motley - Backup (8).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (8).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (80).SQL.csproj b/src/Schemio.SQL/Motley - Backup (80).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (80).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (81).SQL.csproj b/src/Schemio.SQL/Motley - Backup (81).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (81).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (82).SQL.csproj b/src/Schemio.SQL/Motley - Backup (82).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (82).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (83).SQL.csproj b/src/Schemio.SQL/Motley - Backup (83).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (83).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (84).SQL.csproj b/src/Schemio.SQL/Motley - Backup (84).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (84).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (85).SQL.csproj b/src/Schemio.SQL/Motley - Backup (85).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (85).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (86).SQL.csproj b/src/Schemio.SQL/Motley - Backup (86).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (86).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (87).SQL.csproj b/src/Schemio.SQL/Motley - Backup (87).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (87).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (88).SQL.csproj b/src/Schemio.SQL/Motley - Backup (88).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (88).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (89).SQL.csproj b/src/Schemio.SQL/Motley - Backup (89).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (89).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (9).SQL.csproj b/src/Schemio.SQL/Motley - Backup (9).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (9).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (90).SQL.csproj b/src/Schemio.SQL/Motley - Backup (90).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (90).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (91).SQL.csproj b/src/Schemio.SQL/Motley - Backup (91).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (91).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (92).SQL.csproj b/src/Schemio.SQL/Motley - Backup (92).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (92).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (93).SQL.csproj b/src/Schemio.SQL/Motley - Backup (93).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (93).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (94).SQL.csproj b/src/Schemio.SQL/Motley - Backup (94).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (94).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (95).SQL.csproj b/src/Schemio.SQL/Motley - Backup (95).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (95).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (96).SQL.csproj b/src/Schemio.SQL/Motley - Backup (96).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (96).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (97).SQL.csproj b/src/Schemio.SQL/Motley - Backup (97).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (97).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (98).SQL.csproj b/src/Schemio.SQL/Motley - Backup (98).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (98).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup (99).SQL.csproj b/src/Schemio.SQL/Motley - Backup (99).SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup (99).SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Motley - Backup.SQL.csproj b/src/Schemio.SQL/Motley - Backup.SQL.csproj deleted file mode 100644 index cfdd0b3..0000000 --- a/src/Schemio.SQL/Motley - Backup.SQL.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - net8.0 - enable - enable - true - Motley with SQL - Code Shayk - Code Shayk - graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch motley-sql dapper-sql dapper - https://github.com/CodeShayk/Motley - git - README.md - ninja-icon-16.png - https://github.com/CodeShayk/Motley/wiki/i.-Home - Copyright (c) 2024 Code Shayk - .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Dapper for querying SQL database. - LICENSE.md - True - True - snupkg - True - - - - True - - - - - True - \ - - - True - \ - - - True - \ - - - - - - - - - - - - - - diff --git a/src/Schemio.SQL/Schemio.SQL.csproj b/src/Schemio.SQL/Schemio.SQL.csproj index 7d4bcbd..14b92f8 100644 --- a/src/Schemio.SQL/Schemio.SQL.csproj +++ b/src/Schemio.SQL/Schemio.SQL.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable true @@ -43,8 +43,8 @@ - - + + diff --git a/tests/Schemio.API.Tests/Schemio.API.Tests.csproj b/tests/Schemio.API.Tests/Schemio.API.Tests.csproj index 5a1ea0b..efbeb65 100644 --- a/tests/Schemio.API.Tests/Schemio.API.Tests.csproj +++ b/tests/Schemio.API.Tests/Schemio.API.Tests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable @@ -10,12 +10,18 @@ - - - - - - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs index 1d77a96..14ae66b 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/EntityBuilderTests.cs @@ -49,7 +49,7 @@ public void TestTransformExecutorForCorrectExecutionOfConfiguredTransforms() Assert.That(orderItemsCollectionTransforms.Count() == 1); Assert.That(orderItemsCollectionTransforms.ElementAt(0).InvocationCount == 1); - Assert.IsNotNull(entity); + Assert.That(entity, Is.Not.Null); } public class MockTransform : BaseTransformer diff --git a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs index 48e5ca7..5f23466 100644 --- a/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs +++ b/tests/Schemio.Core.Tests/DataProvider.Tests/QueryBuilderTests.cs @@ -44,7 +44,7 @@ public void TestQueryBuilderForCorrectParentQueryList() var result = _queryBuilder.Build(context); - Assert.IsNotNull(result); + Assert.That(result, Is.Not.Null); // returns parent query with filtered out child communication query. @@ -63,7 +63,7 @@ public void TestQueryBuilderForCorrectParentQueryListWithOneChildren() var result = _queryBuilder.Build(context); - Assert.IsNotNull(result); + Assert.That(result, Is.Not.Null); // returns parent query with filtered out child communication query. @@ -85,7 +85,7 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildren() var result = _queryBuilder.Build(context); - Assert.IsNotNull(result); + Assert.That(result, Is.Not.Null); // returns parent query with filtered out children - communication & orders query. @@ -99,8 +99,8 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildren() var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CommunicationQuery)); var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrdersQuery)); - Assert.IsNotNull(communicationChildQuery); - Assert.IsNotNull(ordersChildQuery); + Assert.That(communicationChildQuery, Is.Not.Null); + Assert.That(ordersChildQuery, Is.Not.Null); // nested child query for order item not included as order items are excluded from paths Assert.That(ordersChildQuery.Children.Count, Is.EqualTo(0)); @@ -113,7 +113,7 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildrenAndOneChildF var result = _queryBuilder.Build(context); - Assert.IsNotNull(result); + Assert.That(result, Is.Not.Null); // returns parent query with filtered out children - communication & orders query. @@ -127,14 +127,14 @@ public void TestQueryBuilderForCorrectParentQueryListWithTwoChildrenAndOneChildF var communicationChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(CommunicationQuery)); var ordersChildQuery = parentQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrdersQuery)); - Assert.IsNotNull(communicationChildQuery); - Assert.IsNotNull(ordersChildQuery); + Assert.That(communicationChildQuery, Is.Not.Null); + Assert.That(ordersChildQuery, Is.Not.Null); // nested child query for order item in order query children as order items are included in paths Assert.That(ordersChildQuery.Children.Count, Is.EqualTo(1)); var orderItemsChildQuery = ordersChildQuery.Children.FirstOrDefault(x => x.GetType() == typeof(OrderItemsQuery)); - Assert.IsNotNull(orderItemsChildQuery); + Assert.That(orderItemsChildQuery, Is.Not.Null); } } } \ No newline at end of file diff --git a/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj b/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj index 5e102b1..efd5bc7 100644 --- a/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj +++ b/tests/Schemio.Core.Tests/Schemio.Core.Tests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable @@ -9,12 +9,18 @@ - - - - - - + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/tests/Schemio.EntityFramework.Tests/BaseTest.cs b/tests/Schemio.EntityFramework.Tests/BaseTest.cs index a9dec25..c44f222 100644 --- a/tests/Schemio.EntityFramework.Tests/BaseTest.cs +++ b/tests/Schemio.EntityFramework.Tests/BaseTest.cs @@ -1,3 +1,4 @@ +using System; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Schemio.Core; @@ -50,7 +51,8 @@ public void Setup() [OneTimeTearDown] public void TearDown() { - _serviceProvider = null; + if (_serviceProvider is IDisposable disposable) + disposable.Dispose(); } } } \ No newline at end of file diff --git a/tests/Schemio.EntityFramework.Tests/Schemio.EntityFramework.Tests.csproj b/tests/Schemio.EntityFramework.Tests/Schemio.EntityFramework.Tests.csproj index 36e3bce..7aa3bf6 100644 --- a/tests/Schemio.EntityFramework.Tests/Schemio.EntityFramework.Tests.csproj +++ b/tests/Schemio.EntityFramework.Tests/Schemio.EntityFramework.Tests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable @@ -10,14 +10,20 @@ - - - - - - - - + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/tests/Schemio.SQL.Tests/BaseTest.cs b/tests/Schemio.SQL.Tests/BaseTest.cs index f701f36..009bfba 100644 --- a/tests/Schemio.SQL.Tests/BaseTest.cs +++ b/tests/Schemio.SQL.Tests/BaseTest.cs @@ -1,3 +1,4 @@ +using System; using System.Data.Common; using Microsoft.Data.Sqlite; using Microsoft.Extensions.DependencyInjection; @@ -54,7 +55,8 @@ public void Setup() [OneTimeTearDown] public void TearDown() { - _serviceProvider = null; + if (_serviceProvider is IDisposable disposable) + disposable.Dispose(); } } } \ No newline at end of file diff --git a/tests/Schemio.SQL.Tests/Schemio.SQL.Tests.csproj b/tests/Schemio.SQL.Tests/Schemio.SQL.Tests.csproj index da8f385..82a43e1 100644 --- a/tests/Schemio.SQL.Tests/Schemio.SQL.Tests.csproj +++ b/tests/Schemio.SQL.Tests/Schemio.SQL.Tests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable @@ -10,15 +10,21 @@ - - - - - - - - - + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + From 06e8c1616e57e732673707767305f3921d0dcc92 Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 22:35:15 +0000 Subject: [PATCH 56/64] - Update ReadMe --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b8c163e..570a3bd 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Master-Build](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml) [![GitHub Release](https://img.shields.io/github/v/release/CodeShayk/Schemio?logo=github&sort=semver)](https://github.com/CodeShayk/Schemio/releases/latest) [![Master-CodeQL](https://github.com/CodeShayk/Schemio/actions/workflows/Master-CodeQL.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Master-CodeQL.yml) -[![.Net 8.0](https://img.shields.io/badge/.Net-8.0-blue)](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) +[![.Net 9.0](https://img.shields.io/badge/.Net-9.0-blue)](https://dotnet.microsoft.com/en-us/download/dotnet/9.0) -- #### Nuget Packages | Package | Latest | Details | From a87f31bcf848f97a04f2c4c0bfca76ced5f5708f Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 23:11:42 +0000 Subject: [PATCH 57/64] - Update version on assemblies --- src/Schemio.API/IWebQuery.cs | 2 + src/Schemio.API/QueryEngine.cs | 2 + src/Schemio.API/Schemio.API.csproj | 37 ++++++++++++++++++- src/Schemio.API/WebHeaderResult.cs | 1 + src/Schemio.API/WebQuery.cs | 6 +++ src/Schemio.Core/Schemio.Core.csproj | 1 + .../Schemio.EntityFramework.csproj | 1 + src/Schemio.SQL/Schemio.SQL.csproj | 1 + 8 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/Schemio.API/IWebQuery.cs b/src/Schemio.API/IWebQuery.cs index 1c50a43..81fc2d3 100644 --- a/src/Schemio.API/IWebQuery.cs +++ b/src/Schemio.API/IWebQuery.cs @@ -1,3 +1,5 @@ +using System.Net.Http; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Schemio.Core; diff --git a/src/Schemio.API/QueryEngine.cs b/src/Schemio.API/QueryEngine.cs index 2ea14c9..c6326b1 100644 --- a/src/Schemio.API/QueryEngine.cs +++ b/src/Schemio.API/QueryEngine.cs @@ -1,3 +1,5 @@ +using System.Net.Http; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Schemio.Core; using Schemio.Core.Helpers; diff --git a/src/Schemio.API/Schemio.API.csproj b/src/Schemio.API/Schemio.API.csproj index fe22f30..31f291e 100644 --- a/src/Schemio.API/Schemio.API.csproj +++ b/src/Schemio.API/Schemio.API.csproj @@ -2,15 +2,48 @@ net9.0 - enable + true enable + Schemio with EntityFramework + Code Shayk + Code Shayk + .Net Library to hydrate data entities by object graph using schema paths (supports XPath & JSONPath). Supports Web API using HttpClient. + Copyright (c) 2024 Code Shayk + https://github.com/CodeShayk/Schemio/wiki/i.-Home + ninja-icon-16.png + README.md + https://github.com/CodeShayk/Schemio + git + graphql json-schema xsd data-mapping query-engine data-mapper data-schema schema-mapping object-tree-query object-graph-query schema-mapper xsd-data-object object-graph-data entity-data entity-data-fetch hydrate-object object-hydration object-data object-fetch schemio-Api HttpCliet + LICENSE.md + True + True + snupkg + True + 2.0.0 + + + + True - + + True + \ + + + True + \ + + + True + \ + + diff --git a/src/Schemio.API/WebHeaderResult.cs b/src/Schemio.API/WebHeaderResult.cs index d2ef135..00f798b 100644 --- a/src/Schemio.API/WebHeaderResult.cs +++ b/src/Schemio.API/WebHeaderResult.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using Schemio.Core; namespace Schemio.API diff --git a/src/Schemio.API/WebQuery.cs b/src/Schemio.API/WebQuery.cs index 99c3e95..ad6b34b 100644 --- a/src/Schemio.API/WebQuery.cs +++ b/src/Schemio.API/WebQuery.cs @@ -1,3 +1,9 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Schemio.Core; using Schemio.Core.Helpers; diff --git a/src/Schemio.Core/Schemio.Core.csproj b/src/Schemio.Core/Schemio.Core.csproj index 8579bc0..578a7ac 100644 --- a/src/Schemio.Core/Schemio.Core.csproj +++ b/src/Schemio.Core/Schemio.Core.csproj @@ -21,6 +21,7 @@ True snupkg True + 2.0.0 diff --git a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj index a7c656c..b9dcc86 100644 --- a/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj +++ b/src/Schemio.EntityFramework/Schemio.EntityFramework.csproj @@ -21,6 +21,7 @@ True snupkg True + 2.0.0 diff --git a/src/Schemio.SQL/Schemio.SQL.csproj b/src/Schemio.SQL/Schemio.SQL.csproj index 14b92f8..1946be3 100644 --- a/src/Schemio.SQL/Schemio.SQL.csproj +++ b/src/Schemio.SQL/Schemio.SQL.csproj @@ -21,6 +21,7 @@ True snupkg True + 2.0.0 From 3f9f5720f7d13a544f80e3fd322de64d4b906b10 Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 23:32:21 +0000 Subject: [PATCH 58/64] - Realse v2.0.0 --- README.md | 4 ++-- src/Schemio.Core/Schemio.Core.csproj | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 570a3bd..b73dc13 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ninja Schemio v1.0 +# Schemio v2.0 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/CodeShayk/Schemio/blob/master/LICENSE.md) [![Master-Build](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml) [![GitHub Release](https://img.shields.io/github/v/release/CodeShayk/Schemio?logo=github&sort=semver)](https://github.com/CodeShayk/Schemio/releases/latest) @@ -66,7 +66,7 @@ The main branch is now on .NET 8.0. The following previous versions are availabl | Version | Release Notes | Developer Guide | | -------- | --------|--------| | [`v1.0.0`](https://github.com/CodeShayk/Schemio/tree/v1.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v1.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v1.0.0/index.md) | -| [`Pre-Release v2.0.0`](https://github.com/CodeShayk/Schemio/tree/v2.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v2.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v2.0.0/index.md) | +| [`v2.0.0`](https://github.com/CodeShayk/Schemio/tree/v2.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v2.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v2.0.0/index.md) | ## Credits Thank you for reading. Please fork, explore, contribute and report. Happy Coding !! :) diff --git a/src/Schemio.Core/Schemio.Core.csproj b/src/Schemio.Core/Schemio.Core.csproj index 578a7ac..3157a7e 100644 --- a/src/Schemio.Core/Schemio.Core.csproj +++ b/src/Schemio.Core/Schemio.Core.csproj @@ -22,6 +22,12 @@ snupkg True 2.0.0 + Changes +- `Entity Schema` renamed to `Entity Configuration` and requires implementing `EntityContfiguration<TEntity>`. +- `IRootQuery`, `IChildQuery`, `BaseRootQuery<TParameter, TResult>` & `BaseChildQuery<TParameter,TResult>` removed. +- Both Parent and child queries need to implement `BaseQuery<TResult>` and provide override for `isContextResolved()` and `ResolveQuery()` methods. +- `IoC` registration streamlined with `fluent interface` for container configuration. +- Renamed `IEntityContext` to `IEntityRequest`. From b573360eb33008f92f760bca917e47b31553f8b4 Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 23:45:11 +0000 Subject: [PATCH 59/64] - Update Readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b73dc13..bcaa74a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Schemio v2.0 +# ninja Schemio v2.0 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/CodeShayk/Schemio/blob/master/LICENSE.md) [![Master-Build](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml/badge.svg)](https://github.com/CodeShayk/Schemio/actions/workflows/Build-Master.yml) [![GitHub Release](https://img.shields.io/github/v/release/CodeShayk/Schemio?logo=github&sort=semver)](https://github.com/CodeShayk/Schemio/releases/latest) From 350454d7b3ad2b9c82cb7858951235740da0a4e9 Mon Sep 17 00:00:00 2001 From: Ninja Date: Thu, 21 Nov 2024 23:50:47 +0000 Subject: [PATCH 60/64] - Update github actions --- .github/workflows/PullRequest-CI.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/PullRequest-CI.yml b/.github/workflows/PullRequest-CI.yml index 6d47951..ca5b535 100644 --- a/.github/workflows/PullRequest-CI.yml +++ b/.github/workflows/PullRequest-CI.yml @@ -30,7 +30,7 @@ jobs: beta_Version: ${{ steps.gitversion.outputs.nuGetVersion }} branchName: ${{ steps.gitversion.outputs.branchName }} env: - working-directory: /home/runner/work/Motley/Motley + working-directory: /home/runner/work/Schemio/Schemio steps: - name: Step-01 Install GitVersion @@ -87,7 +87,7 @@ jobs: env: github-token: '${{ secrets.GH_Packages }}' nuget-token: '${{ secrets.NUGET_API_KEY }}' - working-directory: /home/runner/work/Motley/Motley + working-directory: /home/runner/work/Schemio/Schemio steps: - name: Step-01 Retrieve Build Artifacts uses: actions/download-artifact@v3 @@ -109,7 +109,7 @@ jobs: env: github-token: '${{ secrets.GH_Packages }}' nuget-token: '${{ secrets.NUGET_API_KEY }}' - working-directory: /home/runner/work/Motley/Motley + working-directory: /home/runner/work/Schemio/Schemio steps: - uses: actions/checkout@v2 @@ -119,15 +119,15 @@ jobs: # dotnet-version: '6.0.x' # Publish - - name: publish Motley package + - name: publish Schemio package id: publish_nuget uses: Rebel028/publish-nuget@v2.8.0 with: # Filepath of the project to be packaged, relative to root of repository - PROJECT_FILE_PATH: Motley/Motley.csproj + PROJECT_FILE_PATH: Schemio/Schemio.csproj # NuGet package id, used for version detection & defaults to project name - PACKAGE_NAME: Motley + PACKAGE_NAME: Schemio # Filepath with version info, relative to root of repository & defaults to PROJECT_FILE_PATH # VERSION_FILE_PATH: Directory.Build.props From bc605cd29c82d22a101c194345c76a7c64e29982 Mon Sep 17 00:00:00 2001 From: Ninja Date: Fri, 22 Nov 2024 00:00:36 +0000 Subject: [PATCH 61/64] - Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bbf79bb..55f3cc9 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ If you are having problems, please let me know by [raising a new issue](https:// This project is licensed with the [MIT license](LICENSE). ## Version History -The main branch is now on .NET 8.0. The following previous versions are available: +The main branch is now on .NET 9.0. The following previous versions are available: | Version | Release Notes | Developer Guide | | -------- | --------|--------| | [`v1.0.0`](https://github.com/CodeShayk/Schemio/tree/v1.0.0) | [Notes](https://github.com/CodeShayk/Schemio/releases/tag/v1.0.0) | [Guide](https://github.com/CodeShayk/Schemio/blob/v1.0.0/index.md) | From ddd8cc048e2c23fc6ed0c1f4ed9fa98759d28ef8 Mon Sep 17 00:00:00 2001 From: Ninja Date: Fri, 22 Nov 2024 00:22:44 +0000 Subject: [PATCH 62/64] - Update --- .github/workflows/PullRequest-CodeQL.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/PullRequest-CodeQL.yml b/.github/workflows/PullRequest-CodeQL.yml index c1b075e..741c609 100644 --- a/.github/workflows/PullRequest-CodeQL.yml +++ b/.github/workflows/PullRequest-CodeQL.yml @@ -73,4 +73,4 @@ jobs: - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 with: - category: "/language:${{matrix.language}}" \ No newline at end of file + category: "/language:${{matrix.language}}" From 9e8b2170ddc4b1eef52b0076c3512634742502fd Mon Sep 17 00:00:00 2001 From: Ninja Date: Fri, 22 Nov 2024 00:31:07 +0000 Subject: [PATCH 63/64] - Update dotnet version in GH actions --- .github/workflows/PullRequest-CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/PullRequest-CI.yml b/.github/workflows/PullRequest-CI.yml index ca5b535..c3c8441 100644 --- a/.github/workflows/PullRequest-CI.yml +++ b/.github/workflows/PullRequest-CI.yml @@ -52,7 +52,7 @@ jobs: - name: Step-04 Install .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 6.0.x + dotnet-version: 9.0.x - name: Step-05 Restore dependencies run: dotnet restore From 530aed609e0fa324b177ff0dabc9908fa572e927 Mon Sep 17 00:00:00 2001 From: Ninja Date: Fri, 22 Nov 2024 14:21:53 +0000 Subject: [PATCH 64/64] - Fix Datatime Github Issue. --- .../Schemio.EntityFramework.Tests/Customer.db | Bin 32768 -> 32768 bytes .../CustomerDbContext.cs | 3 ++- .../E2E.Tests.cs | 4 ++-- tests/Schemio.SQL.Tests/Customer.db | Bin 32768 -> 32768 bytes tests/Schemio.SQL.Tests/E2E.Tests.cs | 4 ++-- .../Transforms/OrdersTransform.cs | 3 ++- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/Schemio.EntityFramework.Tests/Customer.db b/tests/Schemio.EntityFramework.Tests/Customer.db index 1d5c292d0c3996d1828f44ae5327d6939d33cd48..82716c1a6f5eefeff869674c4ee716ebf9353461 100644 GIT binary patch delta 122 zcmZo@U}|V!njp<6KT*b+QGR2>LVs@l^9)S<>lpag@!#7lD6oh>NS=|ELE4xzD#Fmn zILyPyNZ-&v-^jqoP{Gj1%Fx)#z=VN;fnQpYF)G5u)XdM_P=N`g9?mt^H#7vPH-f8Y IT9lvw0Pxxxp8x;= delta 89 zcmZo@U}|V!njp<6IZ?)$QF3F#LVs=s1_mbn^9=ki_|I<^6gbRpD9*&nAg#z46=7m( p=I3r`tZ!(jZ)9L(#3aTDlHiPrFf=j_^Dr{fH#7iA7%oas006*q6Y2l} diff --git a/tests/Schemio.EntityFramework.Tests/CustomerDbContext.cs b/tests/Schemio.EntityFramework.Tests/CustomerDbContext.cs index 93a31f3..225b9c7 100644 --- a/tests/Schemio.EntityFramework.Tests/CustomerDbContext.cs +++ b/tests/Schemio.EntityFramework.Tests/CustomerDbContext.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Microsoft.EntityFrameworkCore; using Schemio.Core.Helpers; using Schemio.EntityFramework.Tests.Domain; @@ -54,7 +55,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) eb.HasKey(b => b.OrderId); eb.Property(b => b.OrderNo); eb.Property(b => b.Date).HasColumnName("OrderDate") - .HasConversion(v => v.ToShortDateString(), s => s.IsNotNullOrEmpty() ? DateTime.ParseExact(s, "dd/MM/yyyy", null) : DateTime.MinValue); + .HasConversion(v => v.ToShortDateString(), s => s.IsNotNullOrEmpty() ? DateTime.ParseExact(s, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture) : DateTime.MinValue); eb.HasOne(b => b.Customer); eb.HasMany(b => b.Items); }); diff --git a/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs b/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs index 860c2b0..da03464 100644 --- a/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs +++ b/tests/Schemio.EntityFramework.Tests/E2E.Tests.cs @@ -47,7 +47,7 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() Orders = [ new Order { OrderId = 1, OrderNo = "ZX123VH", - Date = DateTime.Parse("2021-10-22T00:00:00"), + Date = DateTime.Parse("2021-10-22T12:13:04"), Items = [ new OrderItem @@ -117,7 +117,7 @@ public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() { OrderId = 1, OrderNo = "ZX123VH", - Date = DateTime.Parse("2021-10-22T00:00:00"), + Date = DateTime.Parse("2021-10-22T12:13:04"), Items = [ new OrderItem diff --git a/tests/Schemio.SQL.Tests/Customer.db b/tests/Schemio.SQL.Tests/Customer.db index 1d5c292d0c3996d1828f44ae5327d6939d33cd48..da2682cf0a18e222c6607cdb9255d4fbe1b774ce 100644 GIT binary patch delta 122 zcmZo@U}|V!njp<6H&Mo!QEp?xLVs@l^9)S<>lpag@!#7lD6oh>NS=|ELE4xzD#Fmn zILyPyNZ-&v-^jqoP{Gj1%Fx)#z=VN;fnQpYF)G5u)XdM_P=N`g9?mt^H#7vPH-f8Y IT9lvw0Pp=8od5s; delta 89 zcmZo@U}|V!njp<6IZ?)$QF3F#LVs=s1_mbn^9=ki_|I<^6gbRpD9*&nAg#z46=7m( p=I3r`tZ!(jZ)9L(#3aTDlHiPrFf=j_^Dr{fH#7iA7%oas006*q6Y2l} diff --git a/tests/Schemio.SQL.Tests/E2E.Tests.cs b/tests/Schemio.SQL.Tests/E2E.Tests.cs index 23dc60d..2fd1f5f 100644 --- a/tests/Schemio.SQL.Tests/E2E.Tests.cs +++ b/tests/Schemio.SQL.Tests/E2E.Tests.cs @@ -48,7 +48,7 @@ public void TestDataProviderToFetchWholeEntityWhenPathsAreNull() Orders = [ new Order { OrderId = 1, OrderNo = "ZX123VH", - Date = DateTime.Parse("2021-10-22T00:00:00"), + Date = DateTime.Parse("2021-10-22T12:13:04"), Items = [ new OrderItem @@ -84,7 +84,7 @@ public void TestDataProviderToFetchEntityWhenPathsContainsOrderItems() { OrderId = 1, OrderNo = "ZX123VH", - Date = DateTime.Parse("2021-10-22T00:00:00"), + Date = DateTime.Parse("2021-10-22T12:13:04"), Items = [ new OrderItem diff --git a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrdersTransform.cs b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrdersTransform.cs index c11a122..47306f3 100644 --- a/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrdersTransform.cs +++ b/tests/Schemio.SQL.Tests/EntitySetup/EntityConfiguration/Transforms/OrdersTransform.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Schemio.Core; using Schemio.SQL.Tests.EntitySetup.Entities; using Schemio.SQL.Tests.EntitySetup.EntitySchemas.Queries; @@ -19,7 +20,7 @@ public override void Transform(CollectionResult collectionResult, C { customer.Orders[index] = new Order { - Date = DateTime.Parse(collectionResult[index].OrderDate), + Date = DateTime.ParseExact(collectionResult[index].OrderDate, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture), OrderId = collectionResult[index].OrderId, OrderNo = collectionResult[index].OrderNo };

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 literal 0 HcmV?d00001 From 80991356b89f17bf3b824c06918ac978ae8b9d43 Mon Sep 17 00:00:00 2001 From: Code Ninja Date: Tue, 19 Nov 2024 00:09:04 +0000 Subject: [PATCH 46/64] Delete Developer Guide.md --- Developer Guide.md | 567 --------------------------------------------- 1 file changed, 567 deletions(-) delete mode 100644 Developer Guide.md diff --git a/Developer Guide.md b/Developer Guide.md deleted file mode 100644 index 334e198..0000000 --- a/Developer Guide.md +++ /dev/null @@ -1,567 +0,0 @@ -# Developer Guide - -## i. Installation - -`Schemio` allows you to aggregate data from heterogeneous data stores offering `SQL` & `API` packages out of the box below. SQL queries are supported by `Dapper` and `EntityFramework` engines. You could also `extend` Schemio to provide your own implementation(s) of `Query` and supporting `Query Engine` to retrieve data from `custom` data store(s). - -Below are the Nuget packages available. - -`Scemio.Core` - Install to extend schemio to implement `custom` querying engine. -``` -NuGet\Install-Package Schemio.Core -``` -`Schemio.SQL` - Install when you would like to include SQL `Dapper` queries to access SQL database. -``` -NuGet\Install-Package Schemio.SQL -``` -`Schemio.EntityFramework` - Install when you would like to include SQL `EntityFramework` queries to access SQL database. -``` -NuGet\Install-Package Schemio.EntityFramework -``` -`Schemio.Api` - Install when you would like to include web api queries with `HttpClient` query engine. -``` -NuGet\Install-Package Schemio.Api -``` -## ii. Implementation: Using Schemio - -To use **Schemio** you need to do the below steps -- **Step 1**: Define the aggregated `Entity`. -- **Step 2**: Setup the aggregate `Configuration` comprising of `Query`/`Transformer` hierarchical nested mappings. -- **Step 3**: Construct the `DataProvider` with required dependencies. - -### Step 1. Define Aggregate Entity. -To create an aggregate `Entity`, implement the class from `IEntity` interface. This is the entity that will be returned as aggregated result from multiple queries assembled to execute against homogeneous or heterogeneous data storage's. - -Below is an example `Customer` entity. - -``` -public class Customer : IEntity -{ - public int CustomerId { get; set; } - public string CustomerCode { get; set; } - public string CustomerName { get; set; } - public Communication Communication { get; set; } - public Order[] Orders { get; set; } -} -``` - -For the customer class, we can see there are three levels of nesting in the object graph. -- Level 1 with paths: `Customer` -- Level 2 with paths: `Customer.Communication` and `Customer.Orders` -- Level 3 with paths: `Customer.Orders.Items` - -If we choose XML Schema Definition (XSD) for the Customer entity then XPaths for nesting levels should be. -``` -- Level 1 with XPath: Customer -- Level 2 with XPaths: Customer/Communication and Customer/Orders -- Level 3 with XPath: Customer/Orders/Order/Items/Item -``` -### Step 2: Setup Entity Aggregate Configuration -To define `Entity Configuration`, derive from `EntityConfiguration` class where `TEntity` is aggregate entity in context (ie. `IEntity`). - -The `Entity Configuration` is basically `hierarchies` of `Query` & `Transformer` pairs mapped to the schema `paths` pointing to various `nesting` levels in the entity's object graph. -* `Query` is an implementation to `fetch` data for mapped sections of object graph. -* `Transformer` is an implementation to `map` data fetched by the associated query to the relevant sections of the entity's object graph. - -Below is an example Entity Configuration for the Customer Entity. - -``` -internal class CustomerConfiguration : EntityConfiguration -{ - public override IEnumerable> GetSchema() - { - return CreateSchema.For() - .Map(For.Paths("customer"), - customer => customer.Dependents - .Map(For.Paths("customer/communication")) - .Map(For.Paths("customer/orders"), - customerOrders => customerOrders.Dependents - .Map(For.Paths("customer/orders/order/items")))) - .End(); - } -} -``` -`CustomerConfiguration` shows `query/transformer` pairs mapped at three levels of nesting as per the `Customer` entity object graph. -`XPaths` are used to identify the schema paths in the object graph. Alternately, you could use your own representation to name the pairs or map the object graph. However, you would need to provide the `ISchemaPathmatcher` implementation to managing path matching. - -#### i. Query/Transformer Mapping -Every `Query` type in the Entity `Configuration` definition should have a complementing `Transformer` type. -You could map multiple `schema paths` to a given query/transformer pair. Currently, `XPath` and `JSONPath` schema languages are supported. - -Below is the snippet from `CustomerConfiguration` definition shows that `CustomerQuery` has associated `CustomerTransform` and the pair is mapped to the root `Customer` object. -``` - .Map(For.Paths("customer")) -``` - -#### ii. Nested Query/Transformer Mappings -You could nest query/transformer pairs in a `parent/child` hierarchy. In which case the output of the parent query will serve as the input to the child query to resolve its query context. - -The query/transformer mappings can be `nested` to `5` levels down. - -Below is snippet to show nesting of `CommunicationQuery` as child to `CustomerQuery`. -``` -.Map(For.Paths("customer"), -- Parent - customer => customer.Dependents - .Map(For.Paths("customer/communication")) -- Child -``` - -Execution Flow -* In parent/child hierarchy, the first parent query executes first, followed by its immediate children. The execution flows in sequence to the last child query in order of its nesting. -* While executing the output of the parent is passed in to the child query to resolve query context and get it ready for execution. -* Transformers are also executed in the same sequence to map data to the Aggregate Entity. -* When a query path for nested query is included for execution, all the parent queries involved in that object graph get included for execution in order of its nesting. - -Please see the execution sequence below for queries and transformers nested in `CustomerConfiguration` implemented above. - -image - -#### iii. Query Class -`Query` - The purpose of a query class is to execute with supported QueryEngine to fetch data from data storage. - -`QueryEngine` is an implementation of `IQueryEngine` to execute queries with supported data storage to return query result (ie. Result instance of `IQueryResult`). - -Depending on the Nuget package(s) installed, you could implement `SQL` and `API` queries. -* `SQL` queries execute to get data from SQL database using `Dapper` or `EntityFramework` engines. -* `API` query executes web api to call an `endpoint` using `HTTPClient` supported engine to get data. - -**Important**: You can combine heterogeneous queries in the Entity configuration to target different data stores. - -Example of SQL & API queries are below. -You need to override the `GetQuery(IDataContext context, IQueryResult parentQueryResult)` method to return query delegate (package specific implementation). -* `IDataContext` is the context parameter passed to DataProvider to get aggregated results (. Aggregated Entity). This parameter is always available for both parent and child queries. -* `IQueryResult` parameter is only available when query is configured in child mode, else will be null. - -##### `Schemio.SQL` - with `Dapper` Query implementation. - -1. Example Parent Query - CustomerQuery -``` -public class CustomerQuery : BaseSQLQuery -{ - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; - - return connection => connection.QueryFirstOrDefaultAsync(new CommandDefinition - ( - "select CustomerId as Id, " + - "Customer_Name as Name," + - "Customer_Code as Code " + - $"from TCustomer where customerId={customer.CustomerId}" - )); - } -} -``` -2. Example Child Query - OrdersQuery -``` -internal class OrdersQuery : BaseSQLQuery> -{ - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; - - return async connection => - { - var items = await connection.QueryAsync(new CommandDefinition - ( - "select OrderId, " + - "OrderNo, " + - "OrderDate " + - "from TOrder " + - $"where customerId={customer.Id}" - )); - - return new CollectionResult(items); - }; - } -} -``` - -##### `Schemio.EntityFramework` - with `EntityFramework` Query implementation - -1. Example Parent Query - CustomerQuery -``` -public class CustomerQuery : BaseSQLQuery -{ - protected override Func> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Executes as root or level 1 query. parentQueryResult will be null. - var customer = (CustomerContext)context.Entity; - - return async dbContext => - { - var result = await dbContext.Set() - .Where(c => c.Id == customer.CustomerId) - .Select(c => new CustomerResult - { - Id = c.Id, - Name = c.Name, - Code = c.Code - }) - .FirstOrDefaultAsync(); - - return result; - }; - } -} -``` -2. Example Child Query - OrdersQuery -``` - internal class OrdersQuery : BaseSQLQuery> - { - protected override Func>> GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Execute as child to customer query. - var customer = (CustomerResult)parentQueryResult; - - return async dbContext => - { - var items = await dbContext.Set() - .Where(p => p.Customer.Id == customer.Id) - .Select(c => new OrderResult - { - CustomerId = c.CustomerId, - OrderId = c.OrderId, - Date = c.Date, - OrderNo = c.OrderNo - }) - .ToListAsync(); - - return new CollectionResult(items); - }; - } - } -``` -##### `Schemio.Api` - with `HttpClient` Query implementation -1. Example Parent Query - CustomerQuery -``` -public class CustomerQuery : BaseApiQuery -{ - public CustomerQuery() : base(Endpoints.BaseAddress) - { - } - protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Executes as root or level 1 query. - var customer = (CustomerContext)context.Entity; - - return ()=> new Uri(string.Format($"v2/customers/{customer.CustomerId}); - } -} -``` -2. Example Child Query - OrdersQuery -``` -internal class OrdersQuery : BaseApiQuery> -{ - public OrdersQuery() : base(Endpoints.BaseAddress) - { - } - protected override Func GetQuery(IDataContext context, IQueryResult parentQueryResult) - { - // Execute as child to customer api. - var customer = (CustomerResult)parentApiResult; - - return ()=> new Uri(string.Format($"v2/customers/{customer.Id}/orders); - } -} -``` - -#### iv. Transformer Class -The purpose of the transformer class is to transform the data fetched by the linked query class and map to the configured object graph of the entity. - -To define a transformer class, you need to implement `BaseTransformer` -- where TEntity is Aggregate Entity implementing `IEntity`. eg. Customer. -- where TQueryResult is Query Result from associated Query. It is an implementation of `IQueryResult` interface. - -Example transformer - Customer Transformer -``` -internal class CustomerTransform : BaseTransformer -{ - public override Customer Transform(CustomerResult queryResult, Customer entity) - { - var customer = entity ?? new Customer(); - customer.CustomerId = queryResult.Id; - customer.CustomerName = queryResult.CustomerName; - customer.CustomerCode = queryResult.CustomerCode; - return customer; - } -} -``` - -**Note**: It is `important` that the transformer should map data only to the `schema path(s)` pointing `section(s)` of the object graph. - -For the example query/transformer mapping -``` -.Map(For.Paths("customer/communication")) -``` -The Communication transformer should map data only to the `customer/communication` xpath mapped object graph of customer class. - -### Step 3. DataProvider Setup -Data provider needs to be setup with required dependencies. Provide implementations of below dependencies to construct the data provider. - -#### Container Registrations - -With ServiceCollection, you need to register the below dependencies. - -``` - // Register core services - services.AddTransient(typeof(IQueryBuilder<>), typeof(QueryBuilder<>)); - services.AddTransient(typeof(IEntityBuilder<>), typeof(EntityBuilder<>)); - services.AddTransient(typeof(IDataProvider<>), typeof(DataProvider<>)); - services.AddTransient(); - - // Register instance of ISchemaPathMatcher - Json, XPath or Custom. - services.AddTransient(c => new XPathMatcher()); - - // Enable logging - services.AddLogging(); - - //For Dapper SQL engine - Schemio.SQL - services.AddTransient(c => new QueryEngine(new SQLConfiguration { ConnectionSettings = new ConnectionSettings { - Providername = "System.Data.SqlClient", - ConnectionString ="Data Source=Powerstation; Initial Catalog=Customer; Integrated Security=SSPI;" - }}); - - // For entity framework engine - Schemio.EntityFramework - services.AddDbContextFactory(options => options.UseSqlServer(YourSqlConnection), ServiceLifetime.Scoped); - services.AddTransient(c => new QueryEngine(c.GetService>()); - - // For HTTPClient Engine for web APIs - Schemio.API - - // Enable HttpClient - services.AddHttpClient(); - services.AddTransient(); - - // Register each entity configuration. eg CustomerConfiguration - services.AddTransient, CustomerConfiguration>(); - - ``` - -`Please Note:` You can combine multiple query engines and implement supporting types of queries to execute on target data platforms. - - -#### Using Fluent interface for registrations - -i. Example registration: Schemio.SQL - -``` -// Enable DbProviderFactory. - DbProviderFactories.RegisterFactory(DbProviderName, SqliteFactory.Instance); - - var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; - - var configuration = new SQLConfiguration { ConnectionSettings = new ConnectionSettings { ConnectionString = connectionString, ProviderName = DbProviderName } }; - -// Enable logging - services.AddLogging(); - - services.UseSchemio() - .WithEngine(c => new QueryEngine(configuration)) - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); -``` - -ii. Example registration: Schemio.EntityFramework - -``` - var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; - -// Enable DBContext Factory - services.AddDbContextFactory(options => - options.UseSqlite(connectionString)); - -// Enable logging - services.AddLogging(); - - services.UseSchemio() - .WithEngine(c => new QueryEngine(c.GetService>())) - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); - -``` -iii. Example registration: Schemio.API -``` - // Enable logging - services.AddLogging(); - - // Enable HttpClient - services.AddHttpClient(); - - services.UseSchemio() - .WithEngine() - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); - -``` -iv. Example registration: Multiple Engines -``` - // Enable logging - services.AddLogging(); - - // Enable HttpClient - services.AddHttpClient(); - - var connectionString = $"DataSource={Environment.CurrentDirectory}//Customer.db;mode=readonly;cache=shared"; - -// Enable DBContext Factory - services.AddDbContextFactory(options => - options.UseSqlite(connectionString)); - - services.UseSchemio() - .WithEngine() - .WithEngine(c => new QueryEngine(c.GetService>())) - .WithPathMatcher(c => new XPathMatcher()) - .WithEntityConfiguration(c => new CustomerConfiguration()); -``` - -#### Use Data Provider - -##### i. Dependency Inject - IDataProvider - -To use Data provider, Inject `IDataProvider` where T is IEntity, using constructor & property injection method or explicitly Resolve using service provider ie. `IServiceProvider.GetService(typeof(IDataProvider))` - -##### ii. Call DataProvider.GetData(IEntityContext context) method. -You need to call the `GetData()` method with an instance of parameter class derived from `IEntityContext` interface. - -The `IEntityContext` provides a `SchemaPaths` property, which is a list of schema paths to include for the given request to fetch aggregated data. -- When `no` paths are passed in the parameter then entire aggregated entity for all configured queries is returned. -- When list of schema paths are included in the request then the returned aggregated data entity only includes query results from included queries. - -When nested path for a nested query is included (eg. customer/orders/order/items) then all parent queries in the respective parent paths also get included for execution.. -Example - Control Flow -TBC - -## Extending Schemio - -You could extend Schemio by providing your own custom implementation of the query engine (`IQueryEngine`) and query (`IQuery`) to execute queries on custom target data platform. - -To do this, you need to extend the base interfaces as depicted below. -### i. IQueryEngine -Implement `IQueryEngine` interface to provide the custom query engine to be used with schemio. -``` -public interface IQueryEngine -{ - ///