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

io.nosqlbench.engine.api.activityconfig.yaml.StmtDef Maven / Gradle / Ivy

Go to download

The engine API for nosqlbench; Provides the interfaces needed to build internal modules for the nosqlbench core engine

There is a newer version: 5.17.0
Show newest version
/*
 *
 *    Copyright 2016 jshook
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 * /
 */

package io.nosqlbench.engine.api.activityconfig.yaml;

import io.nosqlbench.engine.api.activityconfig.MultiMapLookup;
import io.nosqlbench.engine.api.activityconfig.ParsedStmt;
import io.nosqlbench.engine.api.activityconfig.rawyaml.RawStmtDef;
import io.nosqlbench.engine.api.util.Tagged;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;

public class StmtDef implements Tagged {

    private final RawStmtDef rawStmtDef;
    private StmtsBlock block;

    public StmtDef(StmtsBlock block, RawStmtDef rawStmtDef) {
        this.block = block;
        this.rawStmtDef = rawStmtDef;
    }

    public String getName() {
        return block.getName() + "--" + rawStmtDef.getName();
    }

    public String getStmt() {
        return rawStmtDef.getStmt();
    }

    public Map getBindings() {
        return new MultiMapLookup<>(rawStmtDef.getBindings(), block.getBindings());
    }

    public Map getParams() {
        return new MultiMapLookup<>(rawStmtDef.getParams(), block.getParams());
    }
    public  Map getParamsAsValueType(Class type) {
        MultiMapLookup lookup =  new MultiMapLookup<>(rawStmtDef.getParams(), block.getParams());
        Map map = new LinkedHashMap<>();
        lookup.forEach((k,v)->map.put(k,type.cast(v)));
        return map;
    }

    @SuppressWarnings("unchecked")
    public  V getParamOrDefault(String name, V defaultValue) {
        Objects.requireNonNull(defaultValue);
        MultiMapLookup lookup =  new MultiMapLookup<>(rawStmtDef.getParams(), block.getParams());

        if (!lookup.containsKey(name)) {
            return defaultValue;
        }
        Object value = lookup.get(name);
        try {
            return (V) defaultValue.getClass().cast(value);
        } catch (Exception e) {
            throw new RuntimeException("Unable to cast type " + value.getClass().getCanonicalName() + " to " + defaultValue.getClass().getCanonicalName(), e);
        }
    }

    public  V getParam(String name, Class type) {
        MultiMapLookup lookup =  new MultiMapLookup<>(rawStmtDef.getParams(), block.getParams());
        Object object = lookup.get(name);
        V value = type.cast(object);
        return value;
    }

    @SuppressWarnings("unchecked")
    public  Optional getOptionalParam(String name, Class type) {
        if (type.isPrimitive()) {
            throw new RuntimeException("Do not use primitive types for the target class here. For example, Boolean.class is accepted, but boolean.class is not.");
        }
        // TODO: add warning here if primitive types are not allowed
        MultiMapLookup lookup =  new MultiMapLookup<>(rawStmtDef.getParams(), block.getParams());
        if (lookup.containsKey(name)) {
            Object object = lookup.get(name);
            if (object==null) {
                return Optional.empty();
            }
            try {
                V reified = type.cast(object);
                return Optional.of(reified);
            } catch (Exception e) {
                throw new RuntimeException("Unable to cast type " + object.getClass().getCanonicalName() + " to " + type.getCanonicalName());
            }
        }
        return Optional.empty();
    }

    public Optional getOptionalParam(String name) {
        return getOptionalParam(name,String.class);
    }


    public Map getTags() {
        return new MultiMapLookup<>(rawStmtDef.getTags(), block.getTags());
    }

    @Override
    public String toString() {
        return "stmt(name:" + getName() + ", stmt:" + getStmt() + ", tags:(" + getTags() + "), params:(" + getParams() +"), bindings:(" + getBindings()+"))";
    }

    /**
     * Parse the statement for anchors and return a richer view of the StmtDef which
     * is simpler to use for most statement configuration needs.
     * @return a new {@link ParsedStmt}
     */
    public ParsedStmt getParsed() {
        return new ParsedStmt(this);
    }

    public String getDesc() {
        return rawStmtDef.getDesc();
    }
}