silentbalanceyh/vertx-zero

View on GitHub
vertx-gaia/vertx-co/src/main/java/io/vertx/up/atom/typed/UArray.java

Summary

Maintainability
A
0 mins
Test Coverage
package io.vertx.up.atom.typed;

import io.horizon.uca.log.Annal;
import io.vertx.core.Future;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.up.fn.Fn;

import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * @author lang
 * Stream tool for JsonArray
 */
public class UArray {
    private static final Annal LOGGER = Annal.get(UArray.class);

    private final JsonArray arrayReference;

    private UArray(final JsonArray jsonArray) {
        this.arrayReference = Fn.runOr(new JsonArray(), () ->
            new JsonArray(jsonArray.stream().filter(Objects::nonNull)
                .map(item -> (JsonObject) item)
                .collect(Collectors.toList())), jsonArray);
        LOGGER.debug(StreamInfo.STREAM_START, String.valueOf(this.hashCode()), jsonArray);
    }

    public static UArray create(final JsonArray item) {
        return new UArray(item);
    }

    public UArray append(final JsonObject object) {
        this.arrayReference.add(object);
        return this;
    }

    public UArray convert(final String from, final String to) {
        UObjectInternal.convert(this.arrayReference, new ConcurrentHashMap<String, String>() {{
            this.put(from, to);
        }}, false);
        return this;
    }

    public <I, O> UArray convert(final String field, final Function<I, O> function) {
        UObjectInternal.convert(this.arrayReference, field, function, false);
        return this;
    }

    public UArray filter(final Predicate<JsonObject> testFun) {
        UObjectInternal.filter(this.arrayReference, testFun, false);
        return this;
    }

    public UArray filter(final String field, final Object expected) {
        UObjectInternal.filter(this.arrayReference, (item) -> {
            final Object actual = item.getValue(field);
            return (null != expected && expected.equals(actual));
        }, false);
        return this;
    }

    public UArray dft(final String field, final Object value) {
        UObjectInternal.defaultValue(this.arrayReference, field, value, false);
        return this;
    }

    public UArray dft(final JsonObject values) {
        UObjectInternal.defaultValue(this.arrayReference, values, false);
        return this;
    }

    public UArray distinct() {
        UObjectInternal.distinct(this.arrayReference, false);
        return this;
    }

    public UArray sort() {
        UObjectInternal.distinct(this.arrayReference, false);
        return this;
    }

    public UArray remove(final String... keys) {
        UObjectInternal.remove(this.arrayReference, false, keys);
        return this;
    }

    public UArray vertical(final String field) {
        UObjectInternal.vertical(this.arrayReference, field, false);
        return this;
    }

    public UArray copy(final String from, final String to) {
        UObjectInternal.copy(this.arrayReference, from, to, false);
        return this;
    }

    public UArray zip(final JsonArray array, final String fromKey, final String toKey) {
        UArrayInternal.zip(this.arrayReference, array, fromKey, toKey);
        return this;
    }

    public UArray zip(final JsonArray target) {
        UArrayInternal.zip(this.arrayReference, target);
        return this;
    }

    public JsonArray to() {
        LOGGER.debug(StreamInfo.STREAM_END, String.valueOf(this.hashCode()), this.arrayReference);
        return this.arrayReference;
    }

    public Future<JsonArray> toFuture() {
        return Future.succeededFuture(this.to());
    }

    @Override
    public String toString() {
        return this.arrayReference.encode();
    }
}