private StatementIterator GetIterator(Entity[] subjects, Entity[] predicates, Resource[] objects, Entity[] metas, java.util.List litFilters, bool defaultGraph) {
				DateTime start = DateTime.Now;

				if (subjects == null && predicates == null && objects == null)
					throw new QueryExecutionException("Query would select all statements in the store.");
				
				if (subjects != null) Depersist(subjects);
				if (predicates != null) Depersist(predicates);
				if (objects != null) Depersist(objects);
				if (metas != null) Depersist(metas);
				
				if (subjects != null && subjects.Length == 0) return new StatementIterator(null);
				if (predicates != null && predicates.Length == 0) return new StatementIterator(null);
				if (objects != null && objects.Length == 0) return new StatementIterator(null);
				if (metas != null && metas.Length == 0) return new StatementIterator(null);
				
				MemoryStore results = new MemoryStore();
				StatementSink sink = results;
				
				if (!source.Distinct)
					sink = new SemWeb.Util.DistinctStatementsSink(results, defaultGraph && metas == null);

				SelectFilter filter = new SelectFilter(subjects, predicates, objects, metas);
				if (litFilters != null) {
					filter.LiteralFilters = new LiteralFilter[litFilters.size()];
					for (int i = 0; i < litFilters.size(); i++)
						filter.LiteralFilters[i] = (LiteralFilter)litFilters.get(i);
				}

				source.Select(filter, sink);
				
				Log("SELECT: " + filter + " => " + results.StatementCount + " statements [" + (DateTime.Now-start) + "s]");
				
				return new StatementIterator(results.ToArray());
			}
            public bool hasNext()
            {
                if (statements == null) {
                    System.DateTime start = System.DateTime.Now;

                    MemoryStore results = new MemoryStore();
                    StatementSink sink = results;

                    if (!source.Distinct)
                        sink = new SemWeb.Util.DistinctStatementsSink(results, !wantMetas);

                    source.Select(filter, sink);

                    wrapper.Log("SELECT: " + filter + " => " + results.StatementCount + " statements [" + (System.DateTime.Now-start) + "s]");

                    statements = results.ToArray();
                }

                return curindex + 1 < statements.Length;
            }
            private StatementIterator GetIterator(Entity[] subjects, Entity[] predicates, Resource[] objects, Entity[] metas, java.util.List litFilters, bool defaultGraph)
            {
                DateTime start = DateTime.Now;

                if (subjects == null && predicates == null && objects == null)
                {
                    throw new QueryExecutionException("Query would select all statements in the store.");
                }

                if (subjects != null)
                {
                    Depersist(subjects);
                }
                if (predicates != null)
                {
                    Depersist(predicates);
                }
                if (objects != null)
                {
                    Depersist(objects);
                }
                if (metas != null)
                {
                    Depersist(metas);
                }

                if (subjects != null && subjects.Length == 0)
                {
                    return(new StatementIterator(null));
                }
                if (predicates != null && predicates.Length == 0)
                {
                    return(new StatementIterator(null));
                }
                if (objects != null && objects.Length == 0)
                {
                    return(new StatementIterator(null));
                }
                if (metas != null && metas.Length == 0)
                {
                    return(new StatementIterator(null));
                }

                MemoryStore   results = new MemoryStore();
                StatementSink sink    = results;

                if (!source.Distinct)
                {
                    sink = new SemWeb.Util.DistinctStatementsSink(results, defaultGraph && metas == null);
                }

                SelectFilter filter = new SelectFilter(subjects, predicates, objects, metas);

                if (litFilters != null)
                {
                    filter.LiteralFilters = new LiteralFilter[litFilters.size()];
                    for (int i = 0; i < litFilters.size(); i++)
                    {
                        filter.LiteralFilters[i] = (LiteralFilter)litFilters.get(i);
                    }
                }

                source.Select(filter, sink);

                Log("SELECT: " + filter + " => " + results.StatementCount + " statements [" + (DateTime.Now - start) + "s]");

                return(new StatementIterator(results.ToArray()));
            }