Example #1
0
 public GraphQLController(
     IGraphSchemaProvider graphSchemaProvider,
     IDocumentExecuter documentExecuter)
 {
     _graphSchemaProvider = graphSchemaProvider;
     _documentExecuter    = documentExecuter;
 }
Example #2
0
        private LogicalPlan RunQueryAndDumpTree(IGraphSchemaProvider graphDef, string cypherQueryText)
        {
            var parser    = new OpenCypherParser(_logger);
            var queryNode = parser.Parse(cypherQueryText);
            var planner   = LogicalPlan.ProcessQueryTree(queryNode, graphDef);

            Assert.IsNotNull(planner.StartingOperators);
            Assert.IsNotNull(planner.TerminalOperators);

            // Dump both parse tree and logical plan
            var tree    = queryNode.DumpTree();
            var logical = planner.DumpGraph();

            return(planner);
        }
 public DefaultGraphContextFactory(
     IDocumentBuilder documentBuilder,
     IGraphSchemaProvider schemaProvider,
     IGraphTypeProvider graphTypeProvider,
     IHttpContextAccessor httpContextAccessor,
     ISelectionSetProvider selectionSetProvider,
     IOptions <GraphOptions> optionsAccessor)
 {
     _documentBuilder      = documentBuilder ?? throw new ArgumentNullException(nameof(documentBuilder));
     _schemaProvider       = schemaProvider ?? throw new ArgumentNullException(nameof(schemaProvider));
     _graphTypeProvider    = graphTypeProvider ?? throw new ArgumentNullException(nameof(graphTypeProvider));
     _httpContextAccessor  = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
     _selectionSetProvider = selectionSetProvider ?? throw new ArgumentNullException(nameof(selectionSetProvider));
     _options            = Guard.ArgumentNotNull(optionsAccessor, nameof(optionsAccessor)).Value;
     _fieldNameConverter = _options.FieldNameConverter;
 }
Example #4
0
 public SelectionSetProvider(
     IGraphTypeProvider graphTypeProvider,
     IGraphSchemaProvider schemaProvider,
     IQueryResultTypeGenerator typeGenerator,
     ILogger <SelectionSetProvider> logger,
     IOptions <GraphOptions> optionsAccessor)
 {
     Guard.ArgumentNotNull(schemaProvider, nameof(schemaProvider));
     _graphTypeProvider  = graphTypeProvider ?? throw new ArgumentNullException(nameof(graphTypeProvider));
     _selections         = new ConcurrentDictionary <string, ICollection <ISelectionNode> >();
     _typeGenerator      = Guard.ArgumentNotNull(typeGenerator, nameof(typeGenerator));
     _schema             = schemaProvider.Schema;
     _fieldNameConverter = Guard.ArgumentNotNull(optionsAccessor, nameof(optionsAccessor)).Value.FieldNameConverter;
     _logger             = Guard.ArgumentNotNull(logger, nameof(logger));
     _log4MissCache      = LoggerMessage.Define <DateTimeOffset, string, string>(LogLevel.Trace, 0, "[{0}]Selection set cache missing. Operation: {1}; Reason: {2}.");
 }
 public GraphQLServerMiddleware(
     RequestDelegate next,
     IGraphContextFactory graphContextFactory,
     IGraphExecutor executor,
     IGraphSchemaFormatter schemaFormatter,
     IGraphSchemaProvider schemaProvider,
     IOptions <GraphOptions> graphOptionsAccessor,
     IOptions <GraphServerOptions> serverOptionsAccessor,
     IGraphSchemaConverter schemaConverter,
     ILogger <GraphQLServerMiddleware> logger)
 {
     _next = next ?? throw new ArgumentNullException(nameof(next));
     _graphContextFactory = graphContextFactory ?? throw new ArgumentNullException(nameof(graphContextFactory));
     _executor            = executor ?? throw new ArgumentNullException(nameof(executor));
     _schemaFormatter     = schemaFormatter ?? throw new ArgumentNullException(nameof(schemaFormatter));
     _schemaProvider      = schemaProvider ?? throw new ArgumentNullException(nameof(schemaProvider));
     _graphOptions        = (graphOptionsAccessor ?? throw new ArgumentNullException(nameof(graphOptionsAccessor))).Value;
     _serverOptions       = (serverOptionsAccessor ?? throw new ArgumentNullException(nameof(serverOptionsAccessor))).Value;
     _logger          = logger ?? throw new ArgumentNullException(nameof(logger));
     _schemaConverter = schemaConverter ?? throw new ArgumentNullException(nameof(schemaConverter));
     _log4Error       = LoggerMessage.Define <DateTimeOffset, string, string>(LogLevel.Error, 0, "[{0}]Unhandled exception. Operation: {1}. Detailed information: {2}");
 }
        /// <summary>
        /// This function bind the data source to a given graph definitions
        /// </summary>
        /// <param name="graphDefinition"></param>
        public void Bind(IGraphSchemaProvider graphDefinition)
        {
            // During binding, we read graph definition of the entity
            // and populate the EntityField object in the output
            // with the list of fields that the node/edge definition can expose
            var        properties = new List <ValueField>();
            string     entityUniqueName;
            string     sourceEntityName = null;
            string     sinkEntityName   = null;
            ValueField nodeIdField      = null;
            ValueField edgeSrcIdField   = null;
            ValueField edgeSinkIdField  = null;

            try
            {
                if (Entity is NodeEntity)
                {
                    NodeSchema nodeDef = graphDefinition.GetNodeDefinition(Entity.EntityName);
                    entityUniqueName = nodeDef.Id;
                    nodeIdField      = new ValueField(nodeDef.NodeIdProperty.PropertyName, nodeDef.NodeIdProperty.DataType);

                    properties.AddRange(nodeDef.Properties.Select(p => new ValueField(p.PropertyName, p.DataType)));
                    properties.Add(nodeIdField);
                }
                else
                {
                    var        edgeEnt = Entity as RelationshipEntity;
                    EdgeSchema edgeDef = null;

                    switch (edgeEnt.RelationshipDirection)
                    {
                    case RelationshipEntity.Direction.Forward:
                        edgeDef = graphDefinition.GetEdgeDefinition(edgeEnt.EntityName, edgeEnt.LeftEntityName, edgeEnt.RightEntityName);
                        break;

                    case RelationshipEntity.Direction.Backward:
                        edgeDef = graphDefinition.GetEdgeDefinition(edgeEnt.EntityName, edgeEnt.RightEntityName, edgeEnt.LeftEntityName);
                        break;

                    default:
                        // either direction
                        // TODO: we don't handle 'both' direction yet
                        Debug.Assert(edgeEnt.RelationshipDirection == RelationshipEntity.Direction.Both);
                        edgeDef = graphDefinition.GetEdgeDefinition(edgeEnt.EntityName, edgeEnt.LeftEntityName, edgeEnt.RightEntityName);
                        if (edgeDef == null)
                        {
                            edgeDef = graphDefinition.GetEdgeDefinition(edgeEnt.EntityName, edgeEnt.RightEntityName, edgeEnt.LeftEntityName);
                        }
                        break;
                    }

                    entityUniqueName = edgeDef.Id;
                    sourceEntityName = edgeDef.SourceNodeId;
                    sinkEntityName   = edgeDef.SinkNodeId;
                    edgeSrcIdField   = new ValueField(edgeDef.SourceIdProperty.PropertyName, edgeDef.SourceIdProperty.DataType);
                    edgeSinkIdField  = new ValueField(edgeDef.SinkIdProperty.PropertyName, edgeDef.SinkIdProperty.DataType);

                    properties.AddRange(edgeDef.Properties.Select(p => new ValueField(p.PropertyName, p.DataType)));
                    properties.Add(edgeSrcIdField);
                    properties.Add(edgeSinkIdField);
                }
            }
            catch (KeyNotFoundException e)
            {
                throw new TranspilerBindingException($"Failed to binding entity with alias '{Entity.Alias}' of type '{Entity.EntityName}' to graph definition. Inner error: {e.GetType().Name}: {e.Message}");
            }

            Debug.Assert(OutputSchema.Count == 1 &&
                         OutputSchema.First() is EntityField &&
                         (OutputSchema.First() as EntityField).EntityName == Entity.EntityName);

            var field = OutputSchema.First() as EntityField;

            field.BoundEntityName       = entityUniqueName;
            field.BoundSourceEntityName = sourceEntityName;
            field.BoundSinkEntityName   = sinkEntityName;
            field.EncapsulatedFields    = properties;
            field.NodeJoinField         = nodeIdField;
            field.RelSourceJoinField    = edgeSrcIdField;
            field.RelSinkJoinField      = edgeSinkIdField;
        }