public GraphQLController( IGraphSchemaProvider graphSchemaProvider, IDocumentExecuter documentExecuter) { _graphSchemaProvider = graphSchemaProvider; _documentExecuter = documentExecuter; }
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; }
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; }