001 /*
002 // $Id: //open/mondrian-release/3.0/src/main/mondrian/olap/ConnectionBase.java#4 $
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) 2001-2002 Kana Software, Inc.
007 // Copyright (C) 2001-2007 Julian Hyde and others
008 // All Rights Reserved.
009 // You must accept the terms of that agreement to use this software.
010 //
011 // jhyde, 6 August, 2001
012 */
013
014 package mondrian.olap;
015
016 import mondrian.resource.MondrianResource;
017
018 import org.apache.log4j.Logger;
019
020 /**
021 * <code>ConnectionBase</code> implements some of the methods in
022 * {@link Connection}.
023 *
024 * @author jhyde
025 * @since 6 August, 2001
026 * @version $Id: //open/mondrian-release/3.0/src/main/mondrian/olap/ConnectionBase.java#4 $
027 */
028 public abstract class ConnectionBase implements Connection {
029
030 public static void memoryUsageNotification(Query query, String msg) {
031 query.setOutOfMemory(msg);
032 }
033
034 protected ConnectionBase() {
035 }
036
037 protected abstract Logger getLogger();
038
039
040 public String getFullConnectString() {
041 String s = getConnectString();
042 String catalogName = getCatalogName();
043 if (catalogName != null) {
044 int len = s.length() + catalogName.length() + 32;
045 StringBuilder buf = new StringBuilder(len);
046 buf.append(s);
047 if (!s.endsWith(";")) {
048 buf.append(';');
049 }
050 buf.append("Initial Catalog=");
051 buf.append(catalogName);
052 buf.append(';');
053 s = buf.toString();
054 }
055 return s;
056 }
057
058 public Query parseQuery(String query) {
059 return parseQuery(query, null, false, false);
060 }
061
062 public Query parseQuery(String query, boolean load) {
063 return parseQuery(query, null, load, false);
064 }
065
066 /**
067 * Parses a query, with specified function table and the mode for strict
068 * validation(if true then invalid members are not ignored).
069 *
070 * <p>This method is only used in testing and by clients that need to
071 * support customized parser behavior. That is why this method is not part
072 * of the Connection interface.
073 *
074 * @param query MDX query that requires special parsing
075 * @param funTable Customized function table to use in parsing
076 * @param strictValidation If true, do not ignore invalid members
077 * @return Query the corresponding Query object if parsing is successful
078 * @throws MondrianException if parsing fails
079 * @see mondrian.olap.CustomizedParserTest
080 */
081 public Query parseQuery(String query, FunTable funTable,
082 boolean strictValidation) {
083 return parseQuery(query, funTable, false, strictValidation);
084 }
085
086 public Exp parseExpression(String expr) {
087 boolean debug = false;
088 if (getLogger().isDebugEnabled()) {
089 //debug = true;
090 StringBuilder buf = new StringBuilder(256);
091 buf.append(Util.nl);
092 buf.append(expr);
093 getLogger().debug(buf.toString());
094 }
095 try {
096 Parser parser = new Parser();
097 final FunTable funTable = getSchema().getFunTable();
098 Exp q = parser.parseExpression(this, expr, debug, funTable);
099 return q;
100 } catch (Throwable exception) {
101 throw
102 MondrianResource.instance().FailedToParseQuery.ex(
103 expr,
104 exception);
105 }
106 }
107
108 private Query parseQuery(String query, FunTable cftab, boolean load,
109 boolean strictValidation) {
110 Parser parser = new Parser();
111 boolean debug = false;
112 final FunTable funTable;
113
114 if (cftab == null) {
115 funTable = getSchema().getFunTable();
116 } else {
117 funTable = cftab;
118 }
119
120 if (getLogger().isDebugEnabled()) {
121 //debug = true;
122 StringBuilder buf = new StringBuilder(256);
123 buf.append(Util.nl);
124 buf.append(query);
125 getLogger().debug(buf.toString());
126 }
127
128 try {
129 Query q =
130 parser.parseInternal(this, query, debug, funTable, load,
131 strictValidation);
132 return q;
133 } catch (Throwable e) {
134 throw MondrianResource.instance().FailedToParseQuery.ex(query, e);
135 }
136 }
137 }
138
139 // End ConnectionBase.java