All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.intelie.pipes.Literal Maven / Gradle / Ivy

There is a newer version: 0.25.5
Show newest version
package net.intelie.pipes;

import net.intelie.pipes.time.Period;
import net.intelie.pipes.types.Level;
import net.intelie.pipes.types.Type;
import net.intelie.pipes.util.LiteralRepresentation;

import java.util.Map;

@Help(omit = true)
public class Literal implements Scalar, Aggregation {
    private static final long serialVersionUID = 1L;
    private final Type type;
    private final T value;
    private final String description;

    public Literal(ArgQueue queue) throws PipeException {
        this(queue.get(Type.class), queue.getOptional());
    }

    public Literal(Type type, Object value) {
        this(type, value, LiteralRepresentation.toString(type, value));
    }

    public Literal(Type type, Object value, String description) {
        this.type = type;
        this.value = type.cast(value);
        this.description = description;
    }

    public static Literal newAuto(Object value) {
        return new Literal<>(Type.infer(value), value);
    }

    public static Literal newNumber(Object value) {
        return new Literal<>(Type.NUMBER, value);
    }

    public static Literal newString(Object value) {
        return new Literal<>(Type.STRING, value);
    }

    public static Literal newObject(Object value) {
        return new Literal<>(Type.OBJECT, value);
    }

    public static Literal newBoolean(Object value) {
        return new Literal<>(Type.BOOLEAN, value);
    }

    public static Literal newNull() {
        return new Literal<>(Type.NULL, null);
    }

    @Override
    public T eval(Scope parent, Object obj) {
        return value;
    }

    @Override
    public Type type() {
        return type;
    }

    @Override
    public Level level() {
        return Level.CONSTANT;
    }

    public T value() {
        return value;
    }

    @Override
    public long ttl() {
        return 1;
    }

    @Override
    public long weight() {
        return 0;
    }

    @Override
    public void validate(ValidationContext context) throws PipeException {
    }

    @Override
    public String toString() {
        return description;
    }

    @Override
    public State newState(int flips) {
        return new MyState();
    }

    @Override
    public FullMerger newMerger() {
        return new EmptyMerger();
    }

    @Override
    public InsertMerger newInsertMerger() {
        return new EmptyMerger();
    }

    @Override
    public T eval(Scope parent, Tree tree, WindowBounds bounds) {
        return value;
    }

    @Override
    public PropertyVisitor visit(Scope parent, PropertyVisitor visitor) {
        return visitLiteral(parent, visitor, value);
    }

    private static PropertyVisitor visitLiteral(Scope parent, PropertyVisitor visitor, Object value) {
        if (value == null || value instanceof Number || value instanceof String || value instanceof Boolean || value instanceof Period)
            return visitor;
        if (value instanceof PropertySink)
            return ((PropertySink) value).visit(parent, visitor);
        if (value instanceof Iterable) {
            for (Object obj : (Iterable) value)
                visitLiteral(parent, visitor, obj);
            return visitor.newScope();
        }
        if (value instanceof Map) {
            for (Map.Entry entry : ((Map) value).entrySet()) {
                visitLiteral(parent, visitor, entry.getKey());
                visitLiteral(parent, visitor, entry.getValue());
            }
            return visitor.newScope();
        }

        return visitor.unknown(value);
    }

    private class MyState implements State {
        @Override
        public void yield(Scope parent, Object obj) {
        }

        @Override
        public Tree flip() {
            return null;
        }
    }

}