blob: ff227df551f0789b7eb83aed7883b67468c3f771 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.tinkerpop.gremlin.process.traversal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* General representation of script
*
* @author Stark Arya (sandszhou.zj@alibaba-inc.com)
*/
public final class Script {
private static final String KEY_PREFIX = "_args_";
private final StringBuilder scriptBuilder;
private final Map<Object, String> parameters;
public Script() {
scriptBuilder = new StringBuilder();
parameters = new HashMap<>();
}
public void init() {
scriptBuilder.setLength(0);
parameters.clear();
}
public Script append(final String script) {
scriptBuilder.append(script);
return this;
}
public Script setCharAtEnd(final char ch) {
scriptBuilder.setCharAt(scriptBuilder.length() - 1, ch);
return this;
}
public <V> Script getBoundKeyOrAssign(final boolean withParameters, final V value) {
if (withParameters) {
if (!parameters.containsKey(value)) {
parameters.put(value, getNextBoundKey());
}
append(parameters.get(value));
} else {
append(value.toString());
}
return this;
}
public String getScript() {
return scriptBuilder.toString();
}
public Optional<Map<String,Object>> getParameters() {
return Optional.ofNullable(parameters.isEmpty() ? null : parameters.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)));
}
/**
* @return a monotonically increasing key
*/
private String getNextBoundKey() {
return KEY_PREFIX + parameters.size();
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
final List<String> strings = Stream.of(new Object[]{getScript(), getParameters()})
.filter(o -> null != o)
.filter(o -> {
if (o instanceof Map) {
return !((Map) o).isEmpty();
} else {
return !o.toString().isEmpty();
}
})
.map(Object::toString).collect(Collectors.toList());
if (!strings.isEmpty()) {
builder.append('(');
builder.append(String.join(",", strings));
builder.append(')');
}
return "Script[" + builder.toString() + "]";
}
}