예제 #1
0
        protected override async Task <IBifoqlObject> DoApply(QueryContext context)
        {
            var lhs = await _leftHandSide.Apply(context);

            // Propagate error
            if (lhs is IBifoqlError)
            {
                return(lhs);
            }

            var leftHandSide = lhs as IBifoqlIndexInternal;

            if (leftHandSide == null)
            {
                return(new AsyncError(this.Location, "Can't do index lookup on something that isn't an index"));
            }

            var args = await IndexArgumentList.Create(_arguments, context);

            // Propagate error if there were any errors in evaluating the argument list.
            if (args.ErrorResult != null)
            {
                return(args.ErrorResult);
            }

            var resultObj = await leftHandSide.Lookup(args);

            return(resultObj.ToBifoqlObject());
        }
예제 #2
0
        private static async Task <object> ToSimpleObject(IBifoqlIndexInternal index)
        {
            // TODO - index lookup probably should return IBifoqlObject, not object.
            var resultWithZeroArgs = await index.Lookup(IndexArgumentList.CreateEmpty());

            if (resultWithZeroArgs is IBifoqlObject)
            {
                return(await((IBifoqlObject)resultWithZeroArgs).ToSimpleObject());
            }
            else
            {
                return(resultWithZeroArgs);
            }
        }
예제 #3
0
        private static Func <Task <IBifoqlObject> > GetDefaultValueFromIndexFunc(object o)
        {
            if (o is IBifoqlObject)
            {
                return(GetDefaultValueFromIndexFunc((IBifoqlObject)o));
            }

            // For a key, we want to get the default value only if the thing before it is an index; it doesn't
            // make sense to look up keys on an index after all.
            if (o is IBifoqlIndex || o is IBifoqlIndexSync)
            {
                // First, is there a default value?
                if (o is IDefaultValue)
                {
                    var defaultValue = ((IDefaultValue)o).GetDefaultValue();
                    if (defaultValue != null)
                    {
                        return(async() => (await defaultValue).ToBifoqlObject());
                    }
                }
                else if (o is IDefaultValueSync)
                {
                    var defaultValue = ((IDefaultValueSync)o).GetDefaultValue();
                    if (defaultValue != null)
                    {
                        return(() => Task.FromResult(defaultValue.ToBifoqlObject()));
                    }
                }
                else if (o is IBifoqlIndex)
                {
                    return(async() => {
                        var value = await((IBifoqlIndex)o).Lookup(IndexArgumentList.CreateEmpty());
                        return value.ToBifoqlObject();
                    });
                }
                else if (o is IBifoqlIndexSync)
                {
                    return(() => {
                        var value = ((IBifoqlIndexSync)o).Lookup(IndexArgumentList.CreateEmpty());
                        return Task.FromResult(value.ToBifoqlObject());
                    });
                }

                throw new Exception("UNEXPECTED");
            }

            return(null);
        }
예제 #4
0
        private static Func <Task <IBifoqlObject> > GetDefaultValueFromIndexFunc(IBifoqlObject o)
        {
            if (o is IBifoqlIndexInternal)
            {
                if (o is IBifoqlHasDefaultValue)
                {
                    return(((IBifoqlHasDefaultValue)o).GetDefaultValue());
                }

                // Pass zero arguments to the index.
                return(async() => {
                    var obj = await((IBifoqlIndexInternal)o).Lookup(IndexArgumentList.CreateEmpty());
                    return obj.ToBifoqlObject();
                });
            }

            return(null);
        }
예제 #5
0
 public Task <object> Lookup(IndexArgumentList arguments)
 {
     return(_lookup(arguments));
 }
예제 #6
0
 public Task <object> InvokeIndex(IndexArgumentList filter)
 {
     return(Task.FromResult <object>(new AsyncError("This object has no indexes")));
 }