示例#1
0
        /// <summary>
        /// Create a query parser, which can be used to query a parsed document into a matching structure.
        /// </summary>
        /// <param name="buildQuery">Callback to build the query</param>
        /// <typeparam name="T">The query result type</typeparam>
        /// <returns>A parser containing the built query</returns>
        public static Parser <TSchema, T> Create <T>(QueryBuilderCallback <TSchema, T> buildQuery)
        {
            if (buildQuery == null)
            {
                throw new ArgumentNullException(nameof(buildQuery));
            }

            var queryBuilder = new QueryBuilder <TSchema>();

            Parser <TSchema, T> result = buildQuery(queryBuilder);

            if (result == null)
            {
                throw new MacheteException("The query builder returned null");
            }

            return(result);
        }
示例#2
0
 /// <summary>
 /// Create a query using the document to infer the schema type, which is not specifically tied to the document, but easy to discover.
 /// It's better to create a query using <see cref="Query{TSchema}.Create{T}"/> in advance, but really no difference.
 /// </summary>
 /// <param name="entityResult">A parsed text</param>
 /// <param name="buildQuery">Callback to build the query</param>
 /// <typeparam name="T">The query result type</typeparam>
 /// <typeparam name="TSchema">The schema type</typeparam>
 /// <returns></returns>
 public static Parser <TSchema, T> CreateQuery <TSchema, T>(this EntityResult <TSchema> entityResult, QueryBuilderCallback <TSchema, T> buildQuery)
     where TSchema : Entity
 {
     return(Query <TSchema> .Create(buildQuery));
 }
示例#3
0
        /// <summary>
        /// Parse the parsed input from the beginning, create a new cursor, building the query on the fly
        /// </summary>
        /// <param name="parsed"></param>
        /// <param name="buildQuery"></param>
        /// <typeparam name="TSchema"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <returns></returns>
        public static Result <Cursor <TSchema>, TResult> Query <TSchema, TResult>(this Parsed <TSchema> parsed, QueryBuilderCallback <TSchema, TResult> buildQuery)
            where TSchema : Entity
        {
            var query = Query <TSchema> .Create(buildQuery);

            var cursor = parsed.GetCursor();

            return(query.Parse(cursor));
        }
示例#4
0
        /// <summary>
        /// Parse the parsed input from the beginning, create a new cursor, building the query on the fly
        /// </summary>
        /// <param name="entityResult"></param>
        /// <param name="buildQuery"></param>
        /// <typeparam name="TSchema"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <returns></returns>
        public static Result <Cursor <TSchema>, TResult> Query <TSchema, TResult>(this EntityResult <TSchema> entityResult, QueryBuilderCallback <TSchema, TResult> buildQuery)
            where TSchema : Entity
        {
            var query = Query <TSchema> .Create(entityResult.Schema, buildQuery);

            var cursor = entityResult.GetCursor();

            return(query.Parse(cursor));
        }
示例#5
0
 /// <summary>
 /// Create a query using the document to infer the schema type, which is not specifically tied to the document, but easy to discover.
 /// It's better to create a query using <see cref="Query{TSchema}.Create{T}"/> in advance, but really no difference.
 /// </summary>
 /// <param name="schema">A parsed text</param>
 /// <param name="buildQuery">Callback to build the query</param>
 /// <typeparam name="T">The query result type</typeparam>
 /// <typeparam name="TSchema">The schema type</typeparam>
 /// <returns></returns>
 public static IParser <TSchema, T> CreateQuery <TSchema, T>(this ISchema <TSchema> schema, QueryBuilderCallback <TSchema, T> buildQuery)
     where TSchema : Entity
 {
     return(Query <TSchema> .Create(schema, buildQuery));
 }