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()); }
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); } }
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); }
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); }
public Task <object> Lookup(IndexArgumentList arguments) { return(_lookup(arguments)); }
public Task <object> InvokeIndex(IndexArgumentList filter) { return(Task.FromResult <object>(new AsyncError("This object has no indexes"))); }