/// <inheritdoc/>
		public override IQueryable<CallTreeNode> GetFunctions(int startIndex, int endIndex)
		{
			if (startIndex < 0 || startIndex >= DataSets.Count)
				throw new ArgumentOutOfRangeException("startIndex", startIndex, "Value must be between 0 and " + endIndex);
			if (endIndex < startIndex || endIndex >= DataSets.Count)
				throw new ArgumentOutOfRangeException("endIndex", endIndex, "Value must be between " + startIndex + " and " + (DataSets.Count - 1));
			
			SQLiteQueryProvider queryProvider = new SQLiteQueryProvider(this, startIndex, endIndex);
			
			var query = queryProvider.CreateQuery(new Filter(AllCalls.Instance, DataSetFilter(startIndex, endIndex)));
			return query.Where(c => c.NameMapping.Id != 0 && !c.IsThread).MergeByName();
		}
		/// <inheritdoc/>
		public override CallTreeNode GetRoot(int startIndex, int endIndex)
		{
			if (startIndex > endIndex) {
				int help = startIndex;
				startIndex = endIndex;
				endIndex = help;
			}
			
			SQLiteQueryProvider queryProvider = new SQLiteQueryProvider(this, startIndex, endIndex);
			Expression<Func<SingleCall, bool>> filterLambda = c => c.ParentID == -1;
			return queryProvider.CreateQuery(new Filter(AllCalls.Instance, DataSetFilter(startIndex, endIndex), filterLambda)).Merge();
		}