Пример #1
0
        static async Task Main(string[] args)
        {
            var connectionToDb = await File.ReadAllTextAsync("connectionString.txt");

            var dbContext = ContextBuilder.BuildContext(connectionToDb);
            var jm        = new JoinMonsterExecuter(
                new QueryToSqlConverter(new DefaultAliasGenerator()),
                new SqlCompiler(new SQLiteDialect()),
                new Hydrator()
                );
            var serviceProvider = new FuncServiceProvider(type =>
            {
                var swQuery = new GenericQuery(dbContext, jm);

                if (type == typeof(GenericQuery))
                {
                    return(swQuery);
                }

                return(Activator.CreateInstance(type));
            });

            var schema = new TargetDbSchema(serviceProvider);

            Console.WriteLine("Built a schema");


            var queryToRun = await File.ReadAllTextAsync("query.txt");

            Console.WriteLine("Running GraphQL Query");
            Console.WriteLine(queryToRun);

            await using var connection = new SqlConnection(connectionToDb);

            await connection.OpenAsync();

            var options = new ExecutionOptions
            {
                ThrowOnUnhandledException = true,
                Schema      = schema,
                Query       = queryToRun,
                UserContext = new Dictionary <string, object>
                {
                    { nameof(IDbConnection), connection }
                },
                UnhandledExceptionDelegate = (ctx) =>
                {
                    var e = ctx.Exception;
                }
            };
            var result = await new DocumentExecuter().ExecuteAsync(
                options
                ).ConfigureAwait(true);

            //data.EnrichWithApolloTracing(start);
            Console.WriteLine("Json returned to caller:");
            var writer = new DocumentWriter(true);

            Console.WriteLine(await writer.WriteToStringAsync(result));
        }
Пример #2
0
        public StarWarsQuery(JoinMonsterExecuter joinMonster)
        {
            Name = "Query";

            object Resolve(IResolveFieldContext <object> context) =>
            joinMonster.ExecuteAsync(context, async(sql, parameters) =>
            {
                Console.WriteLine(sql);
                Console.WriteLine();

                var dbConnection        = (IDbConnection)context.UserContext[nameof(IDbConnection)];
                await using var command = (DbCommand)dbConnection.CreateCommand();
                command.CommandText     = sql;
                foreach (var(key, value) in parameters)
                {
                    var sqlParameter           = command.CreateParameter();
                    sqlParameter.ParameterName = key;
                    sqlParameter.Value         = value;
                    command.Parameters.Add(sqlParameter);
                }

                return(await command.ExecuteReaderAsync());
            }, CancellationToken.None);

            Field <CharacterInterface>("hero", resolve: Resolve)
            .SqlWhere((where, _, __, ___) => where.Column("id", 3));

            Field <HumanType>(
                "human",
                arguments: new QueryArguments(
                    new QueryArgument <NonNullGraphType <StringGraphType> > {
                Name = "id", Description = "id of the human"
            }
                    ),
                resolve: Resolve
                ).SqlWhere((where, args, _, __) => where.Column("id", args["id"]));

            Field <ListGraphType <HumanType> >(
                "humans",
                resolve: Resolve
                )
            .SqlWhere((where, args, _, __) => where.Column("type", "Human"))
            .SqlOrder((order, _, __, ___) => order.By("name"));

            Field <DroidType>(
                "droid",
                arguments: new QueryArguments(
                    new QueryArgument <NonNullGraphType <StringGraphType> > {
                Name = "id", Description = "id of the droid"
            }
                    ),
                resolve: Resolve
                ).SqlWhere((where, args, _, __) => where.Column("id", args["id"]));

            Field <ListGraphType <PlanetType> >(
                "planets",
                resolve: Resolve
                );
        }
Пример #3
0
        public void Execute_WhenDatabaseCallIsNull_ThrowsException()
        {
            var sut = new JoinMonsterExecuter(new QueryToSqlConverterStub(), new SqlCompilerStub(), new BatchPlannerStub(), new Hydrator());

            Func <Task> action = () => sut.ExecuteAsync(new ResolveFieldContext(), null, CancellationToken.None);

            action.Should()
            .Throw <ArgumentNullException>()
            .Which.ParamName.Should()
            .Be("databaseCall");
        }
Пример #4
0
        public GenericQuery(DbContext dbContext, JoinMonsterExecuter jm)
        {
            FieldType BuildEntity(EntityMetadata entityMetadata)
            {
                var tableType   = new EntityType(entityMetadata);
                var newListType = new ListGraphType(tableType);

                var newField = new FieldType
                {
                    Name         = entityMetadata.TableName,
                    Type         = typeof(ListGraphType <Entity>),
                    ResolvedType = newListType,
                    Resolver     =
                        new FuncFieldResolver <object, object>(Resolve), //new MyFieldResolver(metaTable, dbContext),
                    Arguments = new QueryArguments(
                        tableType.TableArgs
                        )
                };

                return(newField);
            }

            Name = "MyQuery";

            object Resolve(IResolveFieldContext <object> context) =>
            jm.ExecuteAsync(context, async(sql, parameters) =>
            {
                Console.WriteLine("SQL sent to DB");
                sql = sql.Replace("\"\"", "\"");
                Console.WriteLine(sql);
                Console.WriteLine();
                Console.WriteLine("Parameters:");
                parameters.ToList().ForEach(d => Console.Write($"{d.Key}-{d.Value}"));
                Console.WriteLine();

                var dbConnection        = (IDbConnection)context.UserContext[nameof(IDbConnection)];
                await using var command = (DbCommand)dbConnection.CreateCommand();
                command.CommandText     = sql;
                foreach (var(key, value) in parameters)
                {
                    var sqlParameter           = command.CreateParameter();
                    sqlParameter.ParameterName = key;
                    sqlParameter.Value         = value;
                    command.Parameters.Add(sqlParameter);
                }

                return(await command.ExecuteReaderAsync());
            });

            var dbMetadata  = new DatabaseMetadata(dbContext);
            var allEntities = dbMetadata.GetEntityMetadatas().ToList();

            EntityType.EntitiesAlreadyCreated = new Dictionary <string, EntityType>();
            var feeder      = new EntityFeeder(allEntities);
            var entityToMap = feeder.GetNextEntity();

            do
            {
                var newField = BuildEntity(entityToMap);
                // newField.SqlWhere(ApplyParameters);
                // AddField(newField);
                entityToMap = feeder.GetNextEntity();
            } while (entityToMap != null);


            // //do it again
            var f = new ReverseEntityFeeder(allEntities);
            var e = f.GetNextEntity();

            do
            {
                var newField = BuildEntity(e);
                newField.SqlWhere(ApplyParameters);
                AddField(newField);
                e = f.GetNextEntity();
            } while (e != null);

            //ResolveOneToManyColumnRelationships();
        }
Пример #5
0
        static async Task Main(string[] args)
        {
            SQLiteConnection.CreateFile("starwars.db");

            await using var connection = new SQLiteConnection("Data Source=starwars.db");

            await connection.OpenAsync();

            await PopulateDatabase(connection);

            var compiler    = new SqlCompiler(new SQLiteDialect());
            var hydrator    = new Hydrator();
            var joinMonster = new JoinMonsterExecuter(
                new QueryToSqlConverter(new DefaultAliasGenerator()),
                compiler,
                new BatchPlanner(compiler, hydrator),
                hydrator
                );

            var serviceProvider = new FuncServiceProvider(type =>
            {
                if (type == typeof(StarWarsQuery))
                {
                    return(new StarWarsQuery(joinMonster));
                }

                return(Activator.CreateInstance(type));
            });

            var schema = new StarWarsSchema(serviceProvider);

            var query = @"
{
  human(id: ""1"") {
    name
    id
    homePlanet {
      id
      name
    }
    friends {
      name
    }
  }

  humans {
    name
  }
}";

            var start = DateTime.UtcNow;

            var documentExecuter = new DocumentExecuter();
            var data             = await documentExecuter.ExecuteAsync(options =>
            {
                options.Schema = schema;
                options.FieldMiddleware.Use <InstrumentFieldsMiddleware>();
                options.EnableMetrics = true;
                options.Query         = query;
                options.UserContext   = new Dictionary <string, object>
                {
                    { nameof(IDbConnection), connection }
                };
            });

            // data.EnrichWithApolloTracing(start);

            var writer = new DocumentWriter(true);

            Console.WriteLine(await writer.WriteToStringAsync(data));
        }