use of com.dexels.immutable.api.ImmutableMessage in project navajo by Dexels.
the class ExpressionCache method parse.
public ContextExpression parse(List<String> problems, String expression, Function<String, FunctionClassification> functionClassifier, Function<String, Optional<Node>> mapResolver) {
Optional<ContextExpression> cachedParsedExpression = exprCache.getUnchecked(expression);
if (cachedParsedExpression.isPresent()) {
hitCount.incrementAndGet();
return cachedParsedExpression.get();
}
CompiledParser cp;
try {
StringReader sr = new StringReader(expression);
cp = new CompiledParser(sr);
cp.Expression();
ContextExpression parsed = cp.getJJTree().rootNode().interpretToLambda(problems, expression, functionClassifier, mapResolver);
parsedCount.incrementAndGet();
if (parsed.isLiteral()) {
Operand result = parsed.apply();
exprCache.put(expression, Optional.ofNullable(parsed));
if (result != null) {
expressionValueCache.put(expression, Optional.of(result));
}
return new ContextExpression() {
@Override
public boolean isLiteral() {
return true;
}
@Override
public Operand apply(Navajo doc, Message parentMsg, Message parentParamMsg, Selection parentSel, MappableTreeNode mapNode, TipiLink tipiLink, Access access, Optional<ImmutableMessage> immutableMessage, Optional<ImmutableMessage> paramMessage) {
return result;
}
@Override
public Optional<String> returnType() {
return Optional.ofNullable(result.type);
}
@Override
public String expression() {
return expression;
}
};
} else {
exprCache.put(expression, Optional.ofNullable(parsed));
return parsed;
}
} catch (ParseException e) {
throw new TMLExpressionException("Error parsing expression: " + expression, e);
} catch (Throwable e) {
throw new TMLExpressionException("Unexpected error parsing expression: " + expression, e);
}
}
use of com.dexels.immutable.api.ImmutableMessage in project navajo by Dexels.
the class SimpleNode method lazyFunction.
public ContextExpression lazyFunction(List<String> problems, String expression, UnaryOperator<Operand> func, Optional<String> requiredReturnType, Function<String, FunctionClassification> functionClassifier, Function<String, Optional<Node>> mapResolver) {
ContextExpression expA = jjtGetChild(0).interpretToLambda(problems, expression, functionClassifier, mapResolver);
if (requiredReturnType.isPresent() && expA.returnType().isPresent()) {
String expectedType = requiredReturnType.get();
String foundType = expA.returnType().get();
if (!expectedType.equals(foundType)) {
problems.add("Error (static) type checking. Type: " + foundType + " does not match expected type: " + expectedType);
}
}
return new ContextExpression() {
@Override
public Operand apply(Navajo doc, Message parentMsg, Message parentParamMsg, Selection parentSel, MappableTreeNode mapNode, TipiLink tipiLink, Access access, Optional<ImmutableMessage> immutableMessage, Optional<ImmutableMessage> paramMessage) {
Operand a = expA.apply(doc, parentMsg, parentParamMsg, parentSel, mapNode, tipiLink, access, immutableMessage, paramMessage);
return func.apply(a);
}
@Override
public boolean isLiteral() {
return expA.isLiteral();
}
@Override
public Optional<String> returnType() {
return requiredReturnType;
}
@Override
public String expression() {
return expression;
}
};
}
use of com.dexels.immutable.api.ImmutableMessage in project navajo by Dexels.
the class ASTListNode method interpretToLambda.
@Override
public ContextExpression interpretToLambda(List<String> problems, String expression, Function<String, FunctionClassification> functionClassifier, Function<String, Optional<Node>> mapResolver) {
final List<ContextExpression> exprs = new ArrayList<>();
boolean onlyImmutable = true;
for (int i = 0; i < jjtGetNumChildren(); i++) {
ContextExpression lmb = jjtGetChild(i).interpretToLambda(problems, expression, functionClassifier, mapResolver);
exprs.add(lmb);
if (!onlyImmutable && !lmb.isLiteral()) {
onlyImmutable = false;
}
}
final boolean onlyImm = onlyImmutable;
return new ContextExpression() {
@Override
public boolean isLiteral() {
return onlyImm;
}
@Override
public Operand apply(Navajo doc, Message parentMsg, Message parentParamMsg, Selection parentSel, MappableTreeNode mapNode, TipiLink tipiLink, Access access, Optional<ImmutableMessage> immutableMessage, Optional<ImmutableMessage> paramMessage) {
List<Operand> result = new ArrayList<>();
for (ContextExpression contextExpression : exprs) {
result.add(contextExpression.apply(doc, parentMsg, parentParamMsg, parentSel, mapNode, tipiLink, access, immutableMessage, paramMessage));
}
return Operand.ofList(result.stream().map(e -> e.value).collect(Collectors.toList()));
}
@Override
public Optional<String> returnType() {
return Optional.of(Property.LIST_PROPERTY);
}
@Override
public String expression() {
return expression;
}
};
}
use of com.dexels.immutable.api.ImmutableMessage in project navajo by Dexels.
the class StreamDocument method toImmutable.
public static ImmutableMessage toImmutable(Message m) {
Map<String, ImmutableMessage> subMessages = null;
Map<String, List<ImmutableMessage>> subMessageLists = null;
// Map<S>
for (Message msg : m.getAllMessages()) {
if (msg.isArrayMessage()) {
if (subMessageLists == null) {
subMessageLists = new HashMap<>();
}
subMessageLists.put(msg.getName(), toImmutableList(msg));
} else {
if (subMessages == null) {
subMessages = new HashMap<>();
}
subMessages.put(msg.getName(), toImmutable(m));
}
}
if (subMessageLists == null) {
subMessageLists = Collections.emptyMap();
}
if (subMessages == null) {
subMessages = Collections.emptyMap();
}
Map<String, Object> values = new HashMap<>();
Map<String, String> types = new HashMap<>();
for (Property item : m.getAllProperties()) {
String name = item.getName();
values.put(name, item.getTypedValue());
types.put(name, item.getType());
}
return ImmutableFactory.create(values, types, subMessages, subMessageLists);
// n.getAllMessages()
}
use of com.dexels.immutable.api.ImmutableMessage in project navajo by Dexels.
the class StreamDocument method replicationToMessage.
public static Message replicationToMessage(ImmutableMessage msg, String name, boolean isArrayElement) {
Navajo n = NavajoFactory.getInstance().createNavajo();
Message m = NavajoFactory.getInstance().createMessage(n, name, isArrayElement ? Message.MSG_TYPE_ARRAY_ELEMENT : Message.MSG_TYPE_SIMPLE);
List<Property> pp = msg.columnNames().stream().map(e -> {
String type = msg.columnType(e);
Optional<Object> value = msg.value(e);
Property p = NavajoFactory.getInstance().createProperty(n, e, type, "", 0, "", Property.DIR_OUT);
if (value.isPresent()) {
p.setAnyValue(value.get());
}
return p;
}).collect(Collectors.toList());
pp.stream().forEach(p -> m.addProperty(p));
msg.subMessageListMap().forEach((msgName, submessages) -> {
Message subArray = NavajoFactory.getInstance().createMessage(n, msgName, Message.MSG_TYPE_ARRAY_ELEMENT);
submessages.forEach(repl -> {
subArray.addElement(replicationToMessage(repl, msgName, true));
});
m.addMessage(subArray);
});
msg.subMessageMap().forEach((msgName, subMessage) -> m.addMessage(replicationToMessage(subMessage, msgName, false)));
return m;
}
Aggregations