public virtual ResultSequence getVariable([email protected] name) { object @var = dc.get_variable(new QName(name)); if (@var == null) { return(ResultBuffer.EMPTY); } if (@var is ResultSequence) { return((ResultSequence)@var); } return(ResultBuffer.wrap((Item)@var)); }
//Converts potential sequences into item lists, while flattening to a single dimension private static IEnumerable<Item> GetItems(object obj) { //It it a Node? Node.Node node = obj as Node.Node; if (node != null) { return new[]{node.ANode}; } //Is it a Database? Database database = obj as Database; if(database != null) { return database.Documents.Select(d => d.ANode).Cast<Item>(); } //Is it enumerable (list, array, etc. - but not a string!) //This is recursive and results in flattening any nested sequences IEnumerable enumerable = obj as IEnumerable; if (!(obj is string) && enumerable != null) { return enumerable.Cast<object>().Select(GetItems).SelectMany(x => x); } // Clean up non-.NET values if (obj is Decimal) { obj = new BigDecimal(obj.ToString()); } else if (obj is DateTime) { obj = DatatypeFactory.newInstance().newXMLGregorianCalendar( ((DateTime)obj).ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ")); } else if (obj is TimeSpan) { obj = DatatypeFactory.newInstance().newDuration( Convert.ToInt64(((TimeSpan)obj).TotalMilliseconds)); } else if (obj is XmlQualifiedName) { XmlQualifiedName qname = (XmlQualifiedName)obj; obj = new QName(qname.Namespace, qname.Name); } //Get the item return new []{JavaMapping.type(obj).cast(obj, null)}; }