Skip to content
This repository was archived by the owner on Mar 27, 2018. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@
package org.eclipse.scanning.api.filter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;

/**
* A springable class which encapsulates information for a given feature.
Expand Down Expand Up @@ -138,7 +141,17 @@ public List<String> filter(final Collection<String> items) {
Collection<String> excludes = match(getExcludes(), items);
ret.removeAll(excludes);
Collection<String> includes = match(getIncludes(), items);
ret.addAll(includes);

Collection<String> done = new HashSet<>();
for (final String item : includes) {

if (done.contains(item)) continue;
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MAJOR At most one statement is allowed per line, but 2 statements were found on this line. rule

int ecount = (int)ret.stream().filter(t->t.equals(item)).count();
int icount = (int)includes.stream().filter(t->t.equals(item)).count();
ret.addAll(Arrays.stream(new String[icount-ecount]).map(nothing->item).collect(Collectors.toList()));

done.add(item);
}

return ret;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import org.eclipse.scanning.api.device.IScannableDeviceService;
import org.eclipse.scanning.api.filter.Filter;
Expand All @@ -26,9 +28,13 @@
import org.eclipse.scanning.api.scan.ScanningException;
import org.eclipse.scanning.example.scannable.MockScannableConnector;
import org.eclipse.scanning.server.application.PseudoSpringParser;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class FilterTest {

private static IScannableDeviceService sservice;
Expand All @@ -41,6 +47,13 @@ public static void parseSpring() throws Exception {
sservice = new MockScannableConnector(null);
}

@Before
public void before() throws Exception {
fservice.clear();
PseudoSpringParser parser = new PseudoSpringParser();
parser.parse(FilterTest.class.getResourceAsStream("test_filters.xml"));
}

@Test
public void notNull() {
assertNotNull(IFilterService.DEFAULT);
Expand All @@ -50,17 +63,12 @@ public void notNull() {
}

@Test
public void noFilter() throws ScanningException {
public void znoFilter() throws ScanningException {
assertEquals(sservice.getScannableNames(), fservice.filter("not.there", sservice.getScannableNames()));
}

@Test
public void testFilterSpring() throws Exception {

fservice.clear();
PseudoSpringParser parser = new PseudoSpringParser();
parser.parse(FilterTest.class.getResourceAsStream("test_filters.xml"));

check();
}

Expand All @@ -78,6 +86,105 @@ public void testFilterManual() throws Exception {

check();
}

@Test
public void testDuplicatesNoSpring() throws Exception {

fservice.clear();

IFilter<String> dfilter = new Filter();
dfilter.setName("duplicates");
dfilter.setIncludes(Arrays.asList("a"));
dfilter.setExcludes(Arrays.asList("b"));
fservice.register(dfilter);

List<String> items = new ArrayList<>(Arrays.asList("a", "a", "b", "b"));
assertEquals(Arrays.asList("a", "a"), fservice.filter("duplicates", items));

items = new ArrayList<>(Arrays.asList("a", "b", "a", "b"));
assertEquals(Arrays.asList("a", "a"), fservice.filter("duplicates", items));

items = new ArrayList<>(Arrays.asList("b", "b", "1", "a", "a"));
assertEquals(Arrays.asList("1", "a", "a"), fservice.filter("duplicates", items));

items = new ArrayList<>(Arrays.asList("b", "b", "a", "a", "1"));
assertEquals(Arrays.asList("a", "a", "1"), fservice.filter("duplicates", items));

}

@Test
public void testDuplicatesExclude() throws Exception {

fservice.clear();

IFilter<String> dfilter = new Filter();
dfilter.setName("duplicates");
dfilter.setIncludes(Arrays.asList("a"));
dfilter.setExcludes(Arrays.asList("a", "b"));
fservice.register(dfilter);

List<String> items = new ArrayList<>(Arrays.asList("a", "a", "b", "b"));
assertEquals(Arrays.asList("a", "a"), fservice.filter("duplicates", items));

items = new ArrayList<>(Arrays.asList("a", "b", "a", "b"));
assertEquals(Arrays.asList("a", "a"), fservice.filter("duplicates", items));

items = new ArrayList<>(Arrays.asList("b", "b", "1", "a", "a"));
assertEquals(Arrays.asList("1", "a", "a"), fservice.filter("duplicates", items));

items = new ArrayList<>(Arrays.asList("b", "b", "a", "a", "1"));

// Because we excluded it the result changes
assertEquals(Arrays.asList("1", "a", "a"), fservice.filter("duplicates", items));

}

@Test(timeout=10000) // Must complete in 10s or less
public void testDuplicatesLarge() throws Exception {

fservice.clear();

IFilter<String> dfilter = new Filter();
dfilter.setName("duplicates");

List<String> as = Arrays.stream(new String[1000]).map(nothing->"a").collect(Collectors.toList());
assertEquals(1000, as.size());
dfilter.setIncludes(as);
List<String> bs = Arrays.stream(new String[1000]).map(nothing->"b").collect(Collectors.toList());
assertEquals(1000, bs.size());
dfilter.setExcludes(bs);
fservice.register(dfilter);

List<String> items = new ArrayList<>();
items.addAll(as);
items.addAll(bs);
assertEquals(as, fservice.filter("duplicates", items));

items = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
items.add(as.get(i));
items.add(bs.get(i));
}
assertEquals(as, fservice.filter("duplicates", items));

items = new ArrayList<>();
items.addAll(bs);
items.add("1");
items.addAll(as);
assertEquals("1", fservice.filter("duplicates", items).get(0));
assertEquals("a", fservice.filter("duplicates", items).get(1));
assertEquals("a", fservice.filter("duplicates", items).get(2));

items = new ArrayList<>();
items.addAll(bs);
items.addAll(as);
items.add("1");
List<String> filtered = fservice.filter("duplicates", items);
assertEquals("1", filtered.get(filtered.size()-1));
assertEquals("a", filtered.get(filtered.size()-2));
assertEquals("a", filtered.get(filtered.size()-3));

}

private void check() throws ScanningException {

Expand Down