/// <summary> /// Evalutes a Join /// </summary> /// <param name="context">Evaluation Context</param> /// <returns></returns> public BaseMultiset Evaluate(SparqlEvaluationContext context) { BaseMultiset initialInput = context.InputMultiset; BaseMultiset lhsResult = context.Evaluate(_lhs); context.CheckTimeout(); if (lhsResult is NullMultiset) { context.OutputMultiset = lhsResult; } else if (lhsResult.IsEmpty) { context.OutputMultiset = new NullMultiset(); } else { // Only Execute the RHS if the LHS has some results context.InputMultiset = lhsResult; BaseMultiset rhsResult = context.Evaluate(_rhs); context.CheckTimeout(); context.OutputMultiset = lhsResult.Join(rhsResult); context.CheckTimeout(); } context.InputMultiset = context.OutputMultiset; return(context.OutputMultiset); }
/// <summary> /// Evaluates the Path in the given context. /// </summary> /// <param name="context">Evaluation Context.</param> /// <returns></returns> public override BaseMultiset Evaluate(SparqlEvaluationContext context) { // Try and generate an Algebra expression // Make sure we don't generate clashing temporary variable IDs over the life of the // Evaluation PathTransformContext transformContext = new PathTransformContext(PathStart, PathEnd); if (context["PathTransformID"] != null) { transformContext.NextID = (int)context["PathTransformID"]; } ISparqlAlgebra algebra = Path.ToAlgebra(transformContext); context["PathTransformID"] = transformContext.NextID; // Now we can evaluate the resulting algebra BaseMultiset initialInput = context.InputMultiset; bool trimMode = context.TrimTemporaryVariables; bool rigMode = Options.RigorousEvaluation; try { // Must enable rigorous evaluation or we get incorrect interactions between property and non-property path patterns Options.RigorousEvaluation = true; // Note: We may need to preserve Blank Node variables across evaluations // which we usually don't do BUT because of the way we translate only part of the path // into an algebra at a time and may need to do further nested translate calls we do // need to do this here context.TrimTemporaryVariables = false; BaseMultiset result = context.Evaluate(algebra); // Also note that we don't trim temporary variables here even if we've set the setting back // to enabled since a Trim will be done at the end of whatever BGP we are being evaluated in // Once we have our results can join then into our input context.OutputMultiset = initialInput.Join(result); } finally { context.TrimTemporaryVariables = trimMode; Options.RigorousEvaluation = rigMode; } return(context.OutputMultiset); }
/// <summary> /// Evaluates the BINDINGS modifier /// </summary> /// <param name="context">Evaluation Context</param> /// <returns></returns> public BaseMultiset Evaluate(SparqlEvaluationContext context) { //Evalute the Pattern BaseMultiset results = context.Evaluate(this._pattern);//this._pattern.Evaluate(context); //If the result is Null/Identity/Empty if (results is NullMultiset || results is IdentityMultiset || results.IsEmpty) { context.OutputMultiset = results; return(results); } else { //Result is an Join from the results to the Input Bindings context.OutputMultiset = results.Join(this._bindings.ToMultiset()); return(context.OutputMultiset); } }