001 /* 002 // $Id: //open/mondrian/src/main/mondrian/olap/Exp.java#19 $ 003 // This software is subject to the terms of the Common Public License 004 // Agreement, available at the following URL: 005 // http://www.opensource.org/licenses/cpl.html. 006 // Copyright (C) 1999-2002 Kana Software, Inc. 007 // Copyright (C) 2001-2006 Julian Hyde and others 008 // All Rights Reserved. 009 // You must accept the terms of that agreement to use this software. 010 // 011 // jhyde, 20 January, 1999 012 */ 013 014 package mondrian.olap; 015 016 import mondrian.olap.type.Type; 017 import mondrian.calc.Calc; 018 import mondrian.calc.ExpCompiler; 019 import mondrian.mdx.MdxVisitorImpl; 020 import mondrian.mdx.MdxVisitor; 021 022 import java.io.PrintWriter; 023 024 /** 025 * An <code>Exp</code> is an MDX expression. 026 * 027 * @author jhyde 028 * @since 1.0 029 * @version $Id: //open/mondrian/src/main/mondrian/olap/Exp.java#19 $ 030 */ 031 public interface Exp { 032 033 Exp clone(); 034 035 /** 036 * Returns the {@link Category} of the expression. 037 * 038 * @post Category.instance().isValid(return) 039 */ 040 int getCategory(); 041 042 /** 043 * Returns the type of this expression. Never null. 044 */ 045 Type getType(); 046 047 /** 048 * Writes the MDX representation of this expression to a print writer. 049 * Sub-expressions are invoked recursively. 050 * 051 * @param pw PrintWriter 052 */ 053 void unparse(PrintWriter pw); 054 055 /** 056 * Validates this expression. 057 * 058 * The validator acts in the role of 'visitor' (see Gang of Four 059 * 'visitor pattern'), and an expression in the role of 'visitee'. 060 * 061 * @param validator Validator contains validation context 062 * 063 * @return The validated expression; often but not always the same as 064 * this expression 065 */ 066 Exp accept(Validator validator); 067 068 /** 069 * Converts this expression into an a tree of expressions which can be 070 * efficiently evaluated. 071 * 072 * @param compiler 073 * @return A compiled expression 074 */ 075 Calc accept(ExpCompiler compiler); 076 077 /** 078 * Accepts a visitor to this Exp. 079 * The implementation should generally dispatches to the 080 * {@link MdxVisitor#visit} method appropriate to the type of expression. 081 * 082 * @param visitor Visitor 083 */ 084 Object accept(MdxVisitor visitor); 085 } 086 087 // End Exp.java