/** * Copyright 2004-2016 Riccardo Solmi. All rights reserved. * This file is part of the Whole Platform. * * The Whole Platform is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The Whole Platform is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>. */ package org.whole.lang.queries.visitors; import org.whole.lang.matchers.Matcher; import org.whole.lang.model.adapters.IEntityAdapter; import org.whole.lang.operations.IPrettyPrintWriter; import org.whole.lang.operations.PrettyPrinterOperation; import org.whole.lang.queries.model.*; import org.whole.lang.queries.reflect.QueriesEntityDescriptorEnum; import org.whole.lang.util.DataTypeUtils; /** * @author Riccardo Solmi */ public class QueriesPrettyPrinterVisitor extends QueriesTraverseAllVisitor { protected final IPrettyPrintWriter out; public QueriesPrettyPrinterVisitor(PrettyPrinterOperation operation) { out = operation.getPrettyPrintWriter(); } public boolean visitAdapter(IEntityAdapter entity) { stagedVisit(entity.wGetAdaptee(false)); return false; } @Override public void visit(QueryDeclaration entity) { out.printRaw("query "); entity.getName().accept(this); out.printRaw("("); entity.getParameters().accept(this); out.printRaw(") "); entity.getBody().accept(this); } @Override public void visit(Scope entity) { out.printRaw("["); entity.getLocalNames().accept(this); out.printRaw(" | "); entity.getExpression().accept(this); out.printRaw("]"); } @Override public void visit(Call entity) { entity.getName().accept(this); out.printRaw("("); entity.getArguments().accept(this); out.printRaw(")"); } @Override public void visit(Expressions entity) { for (int i = 0; i < entity.wSize(); i++) { if (i>0) out.printRaw(", "); entity.get(i).accept(this); } } @Override public void visit(CartesianInsert entity) { out.printRaw("insert "); entity.getPlacement().accept(this); out.printRaw(" "); entity.getFromClause().accept(this); out.printRaw(" x= "); entity.getValuesClause().accept(this); } @Override public void visit(PointwiseInsert entity) { out.printRaw("insert "); entity.getPlacement().accept(this); out.printRaw(" "); entity.getFromClause().accept(this); out.printRaw(" .= "); entity.getValuesClause().accept(this); } @Override public void visit(CartesianUpdate entity) { out.printRaw("update "); entity.getFromClause().accept(this); out.printRaw(" x= "); entity.getValuesClause().accept(this); } @Override public void visit(PointwiseUpdate entity) { out.printRaw("update "); entity.getFromClause().accept(this); out.printRaw(" .= "); entity.getValuesClause().accept(this); } @Override public void visit(Delete entity) { out.printRaw("delete "); entity.getFromClause().accept(this); } @Override public void visit(Select entity) { out.printRaw("select "); entity.getSelectClause().accept(this); out.printRaw(" from "); entity.getFromClause().accept(this); out.printRaw(" where "); entity.getWhereClause().accept(this); out.printRaw(" clear "); entity.getClearClause().accept(this); } @Override public void visit(Do entity) { out.printRaw("do "); entity.getExpression().accept(this); } @Override public void visit(For entity) { out.printRaw("for "); entity.getFromClause().accept(this); out.printRaw(" do "); entity.getExpression().accept(this); } @Override public void visit(If entity) { out.printRaw("if "); entity.getPredicate().accept(this); out.printRaw(" do "); entity.getExpression().accept(this); } @Override public void visit(Path entity) { for (int i = 0; i < entity.wSize(); i++) { StepExpression e = entity.get(i); if (i>0) out.printRaw("/"); e.accept(this); } } @Override public void visit(Choose entity) { out.printRaw("choose("); for (int i = 0; i < entity.wSize(); i++) { if (i>0) out.printRaw("; "); entity.get(i).accept(this); } out.printRaw(")"); } @Override public void visit(Block entity) { out.printRaw("("); for (int i = 0; i < entity.wSize(); i++) { if (i>0) out.printRaw((i<entity.wSize()-1 ? ", " : "; ")); entity.get(i).accept(this); } out.printRaw(")"); } @Override public void visit(Sequence entity) { out.printRaw("("); for (int i = 0; i < entity.wSize(); i++) { if (i>0) out.printRaw(", "); entity.get(i).accept(this); } out.printRaw(")"); } @Override public void visit(CartesianProduct entity) { out.printRaw("("); for (int i = 0; i < entity.wSize(); i++) { if (i>0) out.printRaw(" * "); entity.get(i).accept(this); } out.printRaw(")"); } @Override public void visit(PointwiseProduct entity) { out.printRaw("("); for (int i = 0; i < entity.wSize(); i++) { if (i>0) out.printRaw(" .* "); entity.get(i).accept(this); } out.printRaw(")"); } @Override public void visit(Prune entity) { out.printRaw("[prune]"); super.visit(entity); } @Override public void visit(Filter entity) { entity.getExpression().accept(this); entity.getPredicate().accept(this); } @Override public void visit(AspectStep entity) { out.printRaw("aspect()"); } @Override public void visit(AdjacentStep entity) { out.printRaw("adjacent()"); } @Override public void visit(ReachableStep entity) { out.printRaw("reachable()"); } @Override public void visit(ReachableOrSelfStep entity) { out.printRaw("reachableOrSelf()"); } @Override public void visit(InverseAdjacentStep entity) { out.printRaw("inverseAdjacent()"); } @Override public void visit(InverseReachableStep entity) { out.printRaw("inverseReachable()"); } @Override public void visit(InverseReachableOrSelfStep entity) { out.printRaw("inverseReachableOrSelf()"); } @Override public void visit(RootStep entity) { out.printRaw("/"); } @Override public void visit(FragmentRootStep entity) { out.printRaw("F/"); } @Override public void visit(SelfStep entity) { out.printRaw("."); } @Override public void visit(FeatureStep entity) { out.printRaw(entity.getValue()); } @Override public void visit(ChildStep entity) { out.printRaw("child()"); } @Override public void visit(DescendantStep entity) { out.printRaw("descendant()"); } @Override public void visit(DescendantOrSelfStep entity) { out.printRaw("descendant-or-self()"); } @Override public void visit(FollowingSiblingStep entity) { out.printRaw("following-sibling()"); } @Override public void visit(FollowingStep entity) { out.printRaw("following()"); } @Override public void visit(ParentStep entity) { out.printRaw(".."); } @Override public void visit(AncestorStep entity) { out.printRaw("ancestor()"); } @Override public void visit(AncestorOrSelfStep entity) { out.printRaw("ancestor-or-self()"); } @Override public void visit(PrecedingSiblingStep entity) { out.printRaw("preceding-sibling()"); } @Override public void visit(PrecedingStep entity) { out.printRaw("preceding()"); } @Override public void visit(VariableRefStep entity) { out.printRaw(("$"+entity.getValue())); } @Override public void visit(VariableTest entity) { out.printRaw("[as $"); out.printRaw(entity.getValue()); out.printRaw("]"); } @Override public void visit(LanguageTest entity) { out.printRaw("[language() = "); out.printRaw(entity.getValue().toString()); out.printRaw("]"); } @Override public void visit(KindTest entity) { out.printRaw("[kind() = "); out.printRaw(entity.getValue().toString()); out.printRaw("]"); } @Override public void visit(StageTest entity) { out.printRaw("[stage() = "); out.printRaw(entity.getValue().toString()); out.printRaw("]"); } @Override public void visit(StageVariableTest entity) { out.printRaw("[stage as $"); out.printRaw(entity.getValue()); out.printRaw("]"); } @Override public void visit(TypeTest entity) { out.printRaw("[type() = "); out.printRaw(entity.getValue()); out.printRaw("]"); } @Override public void visit(SubtypeTest entity) { out.printRaw("[type() <: "); out.printRaw(entity.getValue()); out.printRaw("]"); } @Override public void visit(SupertypeTest entity) { out.printRaw("[type() :> "); out.printRaw(entity.getValue()); out.printRaw("]"); } @Override public void visit(ExtendedSubtypeTest entity) { out.printRaw("[type() <<: "); out.printRaw(entity.getValue()); out.printRaw("]"); } @Override public void visit(ExtendedSupertypeTest entity) { out.printRaw("[type() :>> "); out.printRaw(entity.getValue()); out.printRaw("]"); } @Override public void visit(AtTypeTest entity) { out.printRaw("[at "); out.printRaw(entity.getValue()); out.printRaw("]"); } @Override public void visit(AtFeatureTest entity) { out.printRaw("[at "); out.printRaw(entity.getValue()); out.printRaw("]"); } @Override public void visit(AtIndexTest entity) { out.printRaw("[at "); int value = entity.getValue(); if (value < 0) out.printRaw("size"); out.print(value); out.printRaw("]"); } @Override public void visit(IndexVariableTest entity) { out.printRaw("[index as $"); out.printRaw(entity.getValue()); out.printRaw("]"); } @Override public void visit(IndexTest entity) { out.printRaw("["); out.print(entity.getIndex().getValue()); out.printRaw("]"); } @Override public void visit(IndexRangeTest entity) { out.printRaw("["); out.print(entity.getStartIndex().getValue()); out.printRaw(".."); IntLiteral endIndex = entity.getEndIndex(); if (Matcher.matchImpl(QueriesEntityDescriptorEnum.IntLiteral, endIndex)) out.print(endIndex.getValue()); out.printRaw("]"); } @Override public void visit(VisitorTest entity) { out.printRaw("[visitor: "); out.printRaw(entity.getValue().toString()); out.printRaw("]"); } @Override public void visit(ExpressionTest entity) { out.printRaw("["); entity.getExpression().accept(this); out.printRaw("]"); } @Override public void visit(PointwiseEquals entity) { out.printRaw("["); entity.getPexp1().accept(this); out.printRaw(" .== "); entity.getPexp2().accept(this); out.printRaw("]"); } @Override public void visit(Addition entity) { entity.getExp1().accept(this); out.printRaw(" + "); entity.getExp2().accept(this); } @Override public void visit(Subtraction entity) { entity.getExp1().accept(this); out.printRaw(" - "); entity.getExp2().accept(this); } @Override public void visit(Multiplication entity) { entity.getExp1().accept(this); out.printRaw(" * "); entity.getExp2().accept(this); } @Override public void visit(Division entity) { entity.getExp1().accept(this); out.printRaw(" / "); entity.getExp2().accept(this); } @Override public void visit(Remainder entity) { entity.getExp1().accept(this); out.printRaw(" % "); entity.getExp2().accept(this); } @Override public void visit(Equals entity) { entity.getExp1().accept(this); out.printRaw(" == "); entity.getExp2().accept(this); } @Override public void visit(NotEquals entity) { entity.getExp1().accept(this); out.printRaw(" != "); entity.getExp2().accept(this); } @Override public void visit(LessOrEquals entity) { entity.getExp1().accept(this); out.printRaw(" <= "); entity.getExp2().accept(this); } @Override public void visit(LessThan entity) { entity.getExp1().accept(this); out.printRaw(" < "); entity.getExp2().accept(this); } @Override public void visit(GreaterOrEquals entity) { entity.getExp1().accept(this); out.printRaw(" >= "); entity.getExp2().accept(this); } @Override public void visit(GreaterThan entity) { entity.getExp1().accept(this); out.printRaw(" > "); entity.getExp2().accept(this); } @Override public void visit(Singleton entity) { out.printRaw(" |"); entity.getExpression().accept(this); out.printRaw("| "); } @Override public void visit(And entity) { for (int i = 0; i < entity.wSize(); i++) entity.get(i).accept(this); } @Override public void visit(Or entity) { for (int i = 0; i < entity.wSize(); i++) { if (i>0) out.printRaw("|"); entity.get(i).accept(this); } } @Override public void visit(Not entity) { out.printRaw("!"); entity.getPredicate().accept(this); } @Override public void visit(ParenthesizedPredicate entity) { out.printRaw("["); super.visit(entity); out.printRaw("]"); } @Override public void visit(DistinctTest entity) { out.printRaw("[distinct_"); entity.getComparator().accept(this); out.printRaw("]"); } @Override public void visit(IdentityComparator entity) { out.printRaw("by "); entity.getIdentity().accept(this); } @Override public void visit(UnionAll entity) { out.printRaw("unionAll("); entity.getExpressions().accept(this); out.printRaw(")"); } @Override public void visit(Union entity) { out.printRaw("union_"); entity.getComparator().accept(this); out.printRaw("("); entity.getExpressions().accept(this); out.printRaw(")"); } @Override public void visit(Intersect entity) { out.printRaw("intercept_"); entity.getComparator().accept(this); out.printRaw("("); entity.getExpressions().accept(this); out.printRaw(")"); } @Override public void visit(Except entity) { out.printRaw("except_"); entity.getComparator().accept(this); out.printRaw("("); entity.getExpressions().accept(this); out.printRaw(")"); } @Override public void visit(Every entity) { out.printRaw("[every "); entity.getFromClause().accept(this); out.printRaw(" satisfies "); entity.getWhereClause().accept(this); out.printRaw("]"); } @Override public void visit(Some entity) { out.printRaw("[some "); entity.getFromClause().accept(this); out.printRaw(" satisfies "); entity.getWhereClause().accept(this); out.printRaw("]"); } @Override public void visit(One entity) { out.printRaw("[one "); entity.getFromClause().accept(this); out.printRaw(" satisfies "); entity.getWhereClause().accept(this); out.printRaw("]"); } @Override public void visit(BooleanLiteral entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(ByteLiteral entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(CharLiteral entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(DateLiteral entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(DoubleLiteral entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(FloatLiteral entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(IntLiteral entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(LongLiteral entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(ShortLiteral entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(StringLiteral entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(VoidLiteral entity) { out.printRaw("void"); } @Override public void visit(Name entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(Placement entity) { out.printRaw(DataTypeUtils.getAsPresentationString(entity)); } @Override public void visit(AllNames entity) { out.printRaw("all names"); } @Override public void visit(TemplateNames entity) { out.printRaw("template names"); } @Override public void visit(AddNames entity) { entity.getExpression().accept(this); out.printRaw(" + {"); entity.getNames().accept(this); out.printRaw("}"); } public void visit(RemoveNames entity) { entity.getExpression().accept(this); out.printRaw(" - {"); entity.getNames().accept(this); out.printRaw("}"); }; @Override public void visit(Names entity) { for (int i = 0; i < entity.wSize(); i++) { if (i>0) out.printRaw(", "); entity.get(i).accept(this); } } @Override public void visit(Tuple entity) { out.printRaw("("); for (int i = 0; i < entity.wSize(); i++) { if (i>0) out.printRaw(", "); entity.get(i).accept(this); } out.printRaw(")"); } }