/// <summary> /// Evaluates the Ask Union /// </summary> /// <param name="context">Evaluation Context</param> /// <returns></returns> public BaseMultiset Evaluate(SparqlEvaluationContext context) { BaseMultiset initialInput = context.InputMultiset; if (this._lhs is Extend || this._rhs is Extend) { initialInput = new IdentityMultiset(); } context.InputMultiset = initialInput; BaseMultiset lhsResult = context.Evaluate(this._lhs);//this._lhs.Evaluate(context); context.CheckTimeout(); if (lhsResult.IsEmpty) { //Only evaluate the RHS if the LHS was empty context.InputMultiset = initialInput; BaseMultiset rhsResult = context.Evaluate(this._rhs);//this._rhs.Evaluate(context); context.CheckTimeout(); context.OutputMultiset = lhsResult.Union(rhsResult); context.CheckTimeout(); context.InputMultiset = context.OutputMultiset; } else { context.OutputMultiset = lhsResult; } return(context.OutputMultiset); }
/// <summary> /// Evaluates the Union /// </summary> /// <param name="context"></param> /// <returns></returns> public BaseMultiset Evaluate(SparqlEvaluationContext context) { BaseMultiset initialInput = context.InputMultiset; if (_lhs is Extend || _rhs is Extend) { initialInput = new IdentityMultiset(); } context.InputMultiset = initialInput; BaseMultiset lhsResult = context.Evaluate(_lhs); context.CheckTimeout(); context.InputMultiset = initialInput; BaseMultiset rhsResult = context.Evaluate(_rhs); context.CheckTimeout(); context.OutputMultiset = lhsResult.Union(rhsResult); context.CheckTimeout(); context.InputMultiset = context.OutputMultiset; return(context.OutputMultiset); }
/// <summary> /// Evaluates the Lazy Union /// </summary> /// <param name="context">Evaluation Context</param> /// <returns></returns> public BaseMultiset Evaluate(SparqlEvaluationContext context) { BaseMultiset initialInput = context.InputMultiset; BaseMultiset lhsResult = context.Evaluate(this._lhs);//this._lhs.Evaluate(context); context.CheckTimeout(); if (lhsResult.Count >= this._requiredResults || this._requiredResults == -1) { //Only evaluate the RHS if the LHS didn't yield sufficient results context.InputMultiset = initialInput; BaseMultiset rhsResult = context.Evaluate(this._rhs);//this._rhs.Evaluate(context); context.CheckTimeout(); context.OutputMultiset = lhsResult.Union(rhsResult); context.CheckTimeout(); context.InputMultiset = context.OutputMultiset; } else { context.OutputMultiset = lhsResult; } return(context.OutputMultiset); }
/// <summary> /// Evaluates the Union /// </summary> /// <param name="context"></param> /// <returns></returns> public BaseMultiset Evaluate(SparqlEvaluationContext context) { //Create a copy of the evaluation context for the RHS SparqlEvaluationContext context2 = new SparqlEvaluationContext(context.Query, context.Data, context.Processor); if (!(context.InputMultiset is IdentityMultiset)) { context2.InputMultiset = new Multiset(); foreach (ISet s in context.InputMultiset.Sets) { context2.InputMultiset.Add(s.Copy()); } } List <Uri> activeGraphs = context.Data.ActiveGraphUris.ToList(); List <Uri> defaultGraphs = context.Data.DefaultGraphUris.ToList(); ParallelEvaluateDelegate d = new ParallelEvaluateDelegate(this.ParallelEvaluate); IAsyncResult lhs = d.BeginInvoke(this._lhs, context, activeGraphs, defaultGraphs, null, null); IAsyncResult rhs = d.BeginInvoke(this._rhs, context2, activeGraphs, defaultGraphs, null, null); WaitHandle.WaitAll(new WaitHandle[] { lhs.AsyncWaitHandle, rhs.AsyncWaitHandle }); bool rhsOk = false; try { BaseMultiset lhsResult = d.EndInvoke(lhs); rhsOk = true; BaseMultiset rhsResult = d.EndInvoke(rhs); context.CheckTimeout(); context.OutputMultiset = lhsResult.Union(rhsResult); context.CheckTimeout(); context.InputMultiset = context.OutputMultiset; return(context.OutputMultiset); } catch { if (!rhsOk) { //Clean up the RHS evaluation call if the LHS has errored try { d.EndInvoke(rhs); } catch { //Ignore this error as we're already going to throw the other error } } throw; } }
/// <summary> /// Evaluates the Union /// </summary> /// <param name="context"></param> /// <returns></returns> public BaseMultiset Evaluate(SparqlEvaluationContext context) { BaseMultiset initialInput = context.InputMultiset; BaseMultiset lhsResult = context.Evaluate(this._lhs);//this._lhs.Evaluate(context); context.CheckTimeout(); context.InputMultiset = initialInput; BaseMultiset rhsResult = context.Evaluate(this._rhs);//this._rhs.Evaluate(context); context.CheckTimeout(); context.OutputMultiset = lhsResult.Union(rhsResult); context.CheckTimeout(); context.InputMultiset = context.OutputMultiset; return(context.OutputMultiset); }