blob: e78dba01c0e244ed71f5bb72d9e4d4c874a5520f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.datasketches.sampling;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.testng.annotations.Test;
/**
* @author Jon Malkin
*/
@SuppressWarnings("javadoc")
public class VarOptItemsSamplesTest {
@Test
public void compareIteratorToArrays() {
final int k = 64;
final int n = 1024;
final VarOptItemsSketch<Long> sketch = VarOptItemsSketchTest.getUnweightedLongsVIS(k, n);
// and a few heavy items
sketch.update(n * 10L, n * 10.0);
sketch.update(n * 11L, n * 11.0);
sketch.update(n * 12L, n * 12.0);
final VarOptItemsSamples<Long> samples = sketch.getSketchSamples();
final Long[] items = samples.items();
final double[] weights = samples.weights();
int i = 0;
for (VarOptItemsSamples<Long>.WeightedSample ws : samples) {
assertEquals(ws.getWeight(), weights[i]);
assertEquals(ws.getItem(), items[i]);
++i;
}
}
@Test(expectedExceptions = ConcurrentModificationException.class)
public void checkConcurrentModification() {
final int k = 128;
final VarOptItemsSketch<Long> sketch = VarOptItemsSketchTest.getUnweightedLongsVIS(k, k);
final VarOptItemsSamples<Long> samples = sketch.getSketchSamples();
for (VarOptItemsSamples<Long>.WeightedSample ws : samples) {
if (ws.getItem() > (k / 2)) { // guaranteed to exist somewhere in the sketch
sketch.update(-1L, 1.0);
}
}
fail();
}
@Test(expectedExceptions = ConcurrentModificationException.class)
public void checkWeightCorrectingConcurrentModification() {
final int k = 128;
// sketch needs to be in sampling mode
final VarOptItemsSketch<Long> sketch = VarOptItemsSketchTest.getUnweightedLongsVIS(k, 2 * k);
final Iterator<VarOptItemsSamples<Long>.WeightedSample> iter;
iter = sketch.getSketchSamples().getWeightCorrRIter();
int i = 0;
while (iter.hasNext()) {
iter.next();
if (++i > (k / 2)) {
sketch.update(-1L, 1.0);
}
}
fail();
}
@Test(expectedExceptions = NoSuchElementException.class)
public void checkReadingPastEndOfIterator() {
final int k = 128;
final VarOptItemsSketch<Long> sketch = VarOptItemsSketchTest.getUnweightedLongsVIS(k, k);
final Iterator<VarOptItemsSamples<Long>.WeightedSample> iter;
iter = sketch.getSketchSamples().iterator();
while (iter.hasNext()) {
iter.next();
}
iter.next(); // no more elements
fail();
}
@Test(expectedExceptions = NoSuchElementException.class)
public void checkWeightCorrectionReadingPastEndOfIterator() {
final int k = 128;
final VarOptItemsSketch<Long> sketch = VarOptItemsSketchTest.getUnweightedLongsVIS(k, k);
final Iterator<VarOptItemsSamples<Long>.WeightedSample> iter;
iter = sketch.getSketchSamples().getWeightCorrRIter();
while (iter.hasNext()) {
iter.next();
}
iter.next(); // no more elements
fail();
}
@Test
public void checkPolymorphicBaseClass() {
// use setClass()
final VarOptItemsSketch<Number> sketch = VarOptItemsSketch.newInstance(12);
sketch.update(1, 0.5);
sketch.update(2L, 1.7);
sketch.update(3.0f, 2.0);
sketch.update(4.0, 3.1);
try {
final VarOptItemsSamples<Number> samples = sketch.getSketchSamples();
// will try to create array based on type of first item in the array and fail
samples.items();
fail();
} catch (final ArrayStoreException e) {
// expected
}
final VarOptItemsSamples<Number> samples = sketch.getSketchSamples();
samples.setClass(Number.class);
assertEquals(samples.items(0), 1);
assertEquals(samples.items(1), 2L);
assertEquals(samples.items(2), 3.0f);
assertEquals(samples.items(3), 4.0);
}
@Test
public void checkEmptySketch() {
// verify what happens when n_ == 0
final VarOptItemsSketch<String> sketch = VarOptItemsSketch.newInstance(32);
assertEquals(sketch.getNumSamples(), 0);
final VarOptItemsSamples<String> samples = sketch.getSketchSamples();
assertEquals(samples.getNumSamples(), 0);
assertNull(samples.items());
assertNull(samples.items(0));
assertNull(samples.weights());
assertTrue(Double.isNaN(samples.weights(0)));
}
@Test
public void checkUnderFullSketchIterator() {
// needed to fully cover iterator's next() and hasNext() conditions
final int k = 128;
final VarOptItemsSketch<Long> sketch = VarOptItemsSketchTest.getUnweightedLongsVIS(k, k / 2);
final VarOptItemsSamples<Long> samples = sketch.getSketchSamples();
for (VarOptItemsSamples<Long>.WeightedSample ws : samples) {
assertTrue((ws.getItem() >= 0) && (ws.getItem() < (k / 2)));
}
}
}