@Override public boolean contains(Object obj) { if (this.hasLimitIterator) { // Keith: Optimize case where contains is false, avoids iteration boolean peak = this.base.contains(obj); if (!peak) { return false; } Iterator itr = this.iterator(); boolean found = false; while (itr.hasNext()) { if (itr.next().equals(obj)) { found = true; break; } } return found; } else { return this.base.contains(obj); } }
@Override public boolean removeAll(Collection collection) { /* * if( this.limit > -1) { throw new UnsupportedOperationException("Removal from the * SelectResults not allowed as the query result is constrained by LIMIT"); } */ if (this.hasLimitIterator) { Iterator itr = this.iterator(); boolean removed = false; Object element; while (itr.hasNext()) { element = itr.next(); if (collection.contains(element)) { itr.remove(); removed = true; } } return removed; } else { return this.base.removeAll(collection); } }
@Override public boolean remove(Object obj) { /* * if( this.limit > -1) { throw new UnsupportedOperationException("Removal from the * SelectResults not allowed as the query result is constrained by LIMIT"); } */ if (this.hasLimitIterator) { Iterator itr = this.iterator(); boolean removed = false; Object element; while (itr.hasNext()) { element = itr.next(); if ((obj == null && element == null) || (obj.equals(element))) { itr.remove(); removed = true; break; } } return removed; } else { return this.base.remove(obj); } }
@Override public boolean retainAll(Collection collection) { /* * if( this.limit > -1) { throw new UnsupportedOperationException("Modification of the * SelectResults not allowed as the query result is constrained by LIMIT"); } */ if (this.hasLimitIterator) { Iterator itr = this.iterator(); boolean changed = false; Object element; while (itr.hasNext()) { element = itr.next(); if (!collection.contains(element)) { itr.remove(); changed = true; } } return changed; } else { return this.retainAll(collection); } }
@Override public int occurrences(Object element) { if (!this.getCollectionType().allowsDuplicates() && !this.hasLimitIterator) { return this.base.contains(element) ? 1 : 0; } // expensive!! int count = 0; for (Iterator itr = this.iterator()/* this.base.iterator() */; itr.hasNext();) { Object v = itr.next(); if (element == null ? v == null : element.equals(v)) { count++; } } return count; }
@Test public void testLimitIterator() { Collection ordered = new TreeSet(); for (int i = 1; i < 11; ++i) { ordered.add(new Integer(i)); } ResultsCollectionWrapper wrapper = new ResultsCollectionWrapper(new ObjectTypeImpl(Object.class), ordered, 5); Iterator itr = wrapper.iterator(); assertEquals(5, wrapper.size()); while (itr.hasNext()) { itr.next(); itr.remove(); } assertEquals(0, wrapper.size()); assertFalse(wrapper.iterator().hasNext()); try { wrapper.iterator().next(); fail("Should have failed as the wrapper size is 0"); } catch (NoSuchElementException nsee) { // Ok } assertTrue(wrapper.isEmpty()); } }
@Test public void testToArray() { List ordered = new ArrayList(); for (int i = 1; i < 11; ++i) { ordered.add(new Integer(i)); } ResultsCollectionWrapper wrapper = new ResultsCollectionWrapper(new ObjectTypeImpl(Object.class), ordered, 5); Object[] toArray = wrapper.toArray(); assertEquals(wrapper.size(), toArray.length); Iterator itr = wrapper.iterator(); for (int i = 1; i < 6; ++i) { assertEquals(toArray[i - 1], itr.next()); } assertFalse(itr.hasNext()); }
@Test public void testToArrayParameterized() { List ordered = new ArrayList(); for (int i = 1; i < 11; ++i) { ordered.add(new Integer(i)); } ResultsCollectionWrapper wrapper = new ResultsCollectionWrapper(new ObjectTypeImpl(Object.class), ordered, 5); Object[] toArray = new Object[5]; wrapper.toArray(toArray); assertEquals(wrapper.size(), toArray.length); Iterator itr = wrapper.iterator(); for (int i = 1; i < 6; ++i) { assertEquals(toArray[i - 1], itr.next()); } assertFalse(itr.hasNext()); }
@Test public void testRetainAll() { List ordered = new ArrayList(); for (int i = 1; i < 11; ++i) { ordered.add(new Integer(i)); } ResultsCollectionWrapper wrapper = new ResultsCollectionWrapper(new ObjectTypeImpl(Object.class), ordered, 5); List newList = new ArrayList(); for (int i = 1; i < 6; ++i) { newList.add(new Integer(i)); } assertFalse(wrapper.retainAll(newList)); assertEquals(5, wrapper.size()); for (int i = 6; i < 11; ++i) { newList.add(new Integer(i)); } assertFalse(wrapper.retainAll(newList)); assertEquals(5, wrapper.size()); for (int i = 1; i < 6; ++i) { newList.remove(0); } assertTrue(wrapper.retainAll(newList)); assertEquals(0, wrapper.size()); Iterator itr = wrapper.iterator(); assertFalse(itr.hasNext()); }
Iterator itr = wrapper.iterator(); assertEquals(itr.next(), new Integer(1)); assertFalse(itr.hasNext());
new ResultsCollectionWrapper(new ObjectTypeImpl(Object.class), unordered, 15); assertEquals(10, wrapper.size()); assertFalse(wrapper.iterator() instanceof ResultsCollectionWrapper.LimitIterator); try { wrapper.add(new Integer(7)); assertFalse(wrapper.iterator() instanceof ResultsCollectionWrapper.LimitIterator); try { wrapper.add(new Integer(7)); assertFalse(wrapper.iterator() instanceof ResultsCollectionWrapper.LimitIterator); try { wrapper.add(new Integer(7)); assertTrue(wrapper.iterator() instanceof ResultsCollectionWrapper.LimitIterator); try { wrapper.add(new Integer(7));