@Override public T fromValues(List<Values> values) { if (values.size() == 0) { return null; } else if (values.size() == 1) { ByteBuffer bytes = (ByteBuffer) values.get(0).get(0); return serializer.deserialize(bytes.array()); } else { throw new IllegalArgumentException("Can only convert single values, " + values.size() + " encountered"); } }
@Override @SuppressWarnings("unchecked") public T fromValues(List<Values> valuesSet) { if (valuesSet == null || valuesSet.size() == 0) { return null; } else if (valuesSet.size() == 1) { Values values = valuesSet.get(0); if (values == null) { return null; } switch (stateType) { case NON_TRANSACTIONAL: return (T) values.get(0); case TRANSACTIONAL: return (T) new TransactionalValue((Long) values.get(0), values.get(1)); case OPAQUE: return (T) new OpaqueValue((Long) values.get(0), values.get(1), values.get(2)); default: throw new IllegalStateException("Unknown state type " + stateType); } } throw new IllegalStateException("State query returned multiple results."); }
@Override public Pair<Object, Values> apply(Values input) { return Pair.of(input.get(primaryKeyIndex), input); } }
@Override public TransactionalValue<ITuple> fromValues(List<Values> valuesList) { if (valuesList == null || valuesList.size() == 0) { return null; } Values values = valuesList.get(0); int index = 0; Long txId = (Long) values.get(index++); SimpleTuple curr = new SimpleTuple(tupleFields); for (String valueField : tupleFields) { curr.put(valueField, values.get(index++)); } boolean isAllNull = true; for (Object value : curr.getValues()) { if (value != null) { isAllNull = false; break; } } if (isAllNull) { curr = null; } return new TransactionalValue<ITuple>(txId, curr); }
@Override public OpaqueValue<ITuple> fromValues(List<Values> valuesList) { if (valuesList == null || valuesList.size() == 0) { return null; } Values values = valuesList.get(0); int index = 0; Long currTx = (Long) values.get(index++); SimpleTuple curr = new SimpleTuple(tupleFields); for (String valueField : tupleFields) { curr.put(valueField, values.get(index++)); } if (isAllNull(curr)) { curr = null; } SimpleTuple prev = new SimpleTuple(tupleFields); for (String valueField : tupleFields) { prev.put(valueField, values.get(index++)); } if (isAllNull(prev)) { prev = null; } return new OpaqueValue<ITuple>(currTx, curr, prev); }
/** * All the binary literal tests are done here, because Avatica converts the result to byte[] * whereas Stream provides the result to ByteString which makes different semantic from Stream implementation. */ @Test public void testBinaryStringFunctions() throws Exception { int EXPECTED_VALUE_SIZE = 1; String sql = "SELECT x'45F0AB' || x'45F0AB', " + "POSITION(x'F0' IN x'453423F0ABBC'), " + "OVERLAY(x'453423F0ABBC45' PLACING x'4534' FROM 3), " + "SUBSTRING(x'453423F0ABBC' FROM 3), " + "SUBSTRING(x'453423F0ABBC453423F0ABBC' FROM 3 FOR 4) " + "FROM FOO " + "WHERE ID > 0 AND ID < 2"; TestCompilerUtils.CalciteState state = TestCompilerUtils.sqlOverDummyTable(sql); final Map<String, ISqlStreamsDataSource> data = new HashMap<>(); data.put("FOO", new TestUtils.MockSqlStreamsDataSource()); QueryPlanner planner = new QueryPlanner(state.schema()); AbstractStreamsProcessor proc = planner.compile(data, sql); // inject output bolt proc.outputStream().to(new TestUtils.MockBolt()); final StormTopology topo = proc.build(); SqlTestUtil.runStormTopology(cluster, TestUtils.MockBolt.getCollectedValues(), EXPECTED_VALUE_SIZE, proc, topo); Values v = TestUtils.MockBolt.getCollectedValues().get(0); assertEquals("45f0ab45f0ab", v.get(0).toString()); assertEquals(4, v.get(1)); assertEquals("45344534abbc45", v.get(2).toString()); assertEquals("23f0abbc", v.get(3).toString()); assertEquals("23f0abbc", v.get(4).toString()); }
@Override public boolean matches(Object o) { Values values = (Values) o; JSONObject actual = (JSONObject) values.get(0); actual.remove("timestamp"); expected.remove("timestamp"); actual.remove("stack"); expected.remove("stack"); actual.remove("guid"); expected.remove("guid"); return actual.equals(expected); } }
@Override public String getString(final int i) { return (String) this.stormTuple.get(i); }
@Override public Byte getByte(final int i) { return (Byte) this.stormTuple.get(i); }
@Override public Double getDouble(final int i) { return (Double) this.stormTuple.get(i); }
@Override public Object getValue(final int i) { return this.stormTuple.get(i); }
@Override public Boolean getBoolean(final int i) { return (Boolean) this.stormTuple.get(i); }
@Override public Short getShort(final int i) { return (Short) this.stormTuple.get(i); }
@Override public Float getFloat(final int i) { return (Float) this.stormTuple.get(i); }
@Override public byte[] getBinary(final int i) { return (byte[]) this.stormTuple.get(i); }
private Field getPublicMemberField(final String field) throws Exception { assert (this.stormTuple.size() == 1); return this.stormTuple.get(0).getClass().getField(field); }
private Method getGetterMethod(final String field) throws Exception { assert (this.stormTuple.size() == 1); return this.stormTuple .get(0) .getClass() .getMethod("get" + Character.toUpperCase(field.charAt(0)) + field.substring(1), (Class<?>[]) null); }
private Object getValueByPublicMember(final String field) throws Exception { assert (this.stormTuple.size() == 1); return getPublicMemberField(field).get(this.stormTuple.get(0)); }
private Object getValueByGetter(final String field) throws Exception { assert (this.stormTuple.size() == 1); return getGetterMethod(field).invoke(this.stormTuple.get(0), (Object[]) null); }