public Entry<Object, Object> project(JetSqlRow row) {
        keyTarget.init();
        valueTarget.init();
        for (int i = 0; i < row.getFieldCount(); i++) {
            Object value = getToConverter(types[i]).convert(row.get(i));
            injectors[i].set(value);
        }

        Object key = keyTarget.conclude();
        if (key == null && failOnNulls) {
            throw QueryException.error("Cannot write NULL to '__key' field. " +
                    "Note that NULL is used also if your INSERT/SINK command doesn't write to '__key' at all.");
        }

        Object value = valueTarget.conclude();
        if (value == null && failOnNulls) {
            throw QueryException.error("Cannot write NULL to 'this' field. " +
                    "Note that NULL is used also if your INSERT/SINK command doesn't write to 'this' at all.");
        }

        return entry(key, value);
    }
@Test
    public void test_projectAllowNulls() {
        KvProjector projector = new KvProjector(
                new QueryPath[]{QueryPath.KEY_PATH, QueryPath.VALUE_PATH},
                new QueryDataType[]{QueryDataType.INT, QueryDataType.INT},
                new NullTarget(),
                new NullTarget(),
                false
        );

        Entry<Object, Object> entry = projector.project(new JetSqlRow(TEST_SS, new Object[]{1, 2}));

        assertThat(entry.getKey()).isNull();
        assertThat(entry.getValue()).isNull();
    }