public static QuorumCheck of(String nameOrRange) { if (nameOrRange==null) return null; for (QuorumCheck qc: NAMED_CHECKS) { if (qc instanceof NumericQuorumCheck) { if (Objects.equal(nameOrRange, ((NumericQuorumCheck)qc).getName())) return qc; } } // parse YAML Object input = Iterables.getOnlyElement( Yamls.parseAll(nameOrRange) ); if (input instanceof Collection) return of((Collection<?>)input); if (input instanceof Integer || input instanceof Long) return of((int)((Number)input)); // TODO also accept "50%", and "50%,1" throw new IllegalArgumentException("Unknown quorum check format '"+input+"'"); }
@SuppressWarnings({ "rawtypes", "unchecked" }) protected Function<? super Collection<?>, ?> lookupTransformation(String t1) { //return MathAggregatorFunctions.computingAverage( TypeToken<U> targetType = targetSensor.getTypeToken(); Function<?, ?> result; if ("average".equalsIgnoreCase(t1)) { result = MathAggregatorFunctions.computingAverage(null, null, (TypeToken<? extends Number>) targetType); } else if ("sum".equalsIgnoreCase(t1)) { result = MathAggregatorFunctions.computingSum(null, null, (TypeToken<? extends Number>) targetType); } else if ("min".equalsIgnoreCase(t1)) { result = MathAggregatorFunctions.computingMin(null, null, (TypeToken<? extends Number>) targetType); } else if ("max".equalsIgnoreCase(t1)) { result = MathAggregatorFunctions.computingMax(null, null, (TypeToken<? extends Number>) targetType); } else if ("isQuorate".equalsIgnoreCase(t1)) { result = new Enrichers.ComputingIsQuorate(targetType, QuorumChecks.of(config().get(QUORUM_CHECK_TYPE)), config().get(QUORUM_TOTAL_SIZE)); } else if ("list".equalsIgnoreCase(t1)) { result = new ComputingList(); } else if ("first".equalsIgnoreCase(t1)) { result = new FirstOrNull(); } else { result = null; } return (Function<? super Collection<?>, ?>) result; }
@Test public void testAtLeastOneUnlessEmptyString() { QuorumCheck q = QuorumChecks.of("atLeastOneUnlessEmpty"); Assert.assertFalse(q.isQuorate(0, 2)); Assert.assertTrue(q.isQuorate(1, 2)); Assert.assertTrue(q.isQuorate(0, 0)); }
@Test public void testLinearNeedHalfToTenAndTenPercentAtHundred() { QuorumCheck q = QuorumChecks.of("[ [0,0], [10,5], [100,10], [200, 20] ]"); Assert.assertTrue(q.isQuorate(2, 2)); Assert.assertTrue(q.isQuorate(1, 2)); Assert.assertTrue(q.isQuorate(0, 0)); Assert.assertFalse(q.isQuorate(1, 10)); Assert.assertTrue(q.isQuorate(6, 10)); Assert.assertFalse(q.isQuorate(7, 50)); Assert.assertTrue(q.isQuorate(8, 50)); Assert.assertFalse(q.isQuorate(9, 100)); Assert.assertTrue(q.isQuorate(11, 100)); Assert.assertFalse(q.isQuorate(19, 200)); Assert.assertTrue(q.isQuorate(21, 200)); Assert.assertFalse(q.isQuorate(29, 300)); Assert.assertTrue(q.isQuorate(31, 300)); }
@Test public void testConstantQuorum() { QuorumCheck q = QuorumChecks.of("2"); Assert.assertTrue(q.isQuorate(2, 2)); Assert.assertTrue(q.isQuorate(2, 10)); Assert.assertFalse(q.isQuorate(1, 1)); } }
@Test public void testLinearTwoPointsNeedMinTwo() { QuorumCheck q = QuorumChecks.of("[ [0,2], [1,2] ]"); Assert.assertTrue(q.isQuorate(2, 2)); Assert.assertTrue(q.isQuorate(2, 10)); Assert.assertFalse(q.isQuorate(1, 1)); }
@Override public QuorumCheck apply(final Collection input) { return QuorumChecks.of(input); } });
@Override public QuorumCheck apply(final Integer input) { return QuorumChecks.of(input); } });
@Override public QuorumCheck apply(final String input) { return QuorumChecks.of(input); } });