THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
AGREEMENT.
1. DEFINITIONS
"Contribution" means:
a) in the case of the initial Contributor, the initial
code and documentation distributed under this Agreement, and
b) in the case of each subsequent Contributor:
i) changes to the Program, and
ii) additions to the Program;
where such changes and/or additions to the Program
originate from and are distributed by that particular Contributor. A
Contribution 'originates' from a Contributor if it was added to the
Program by such Contributor itself or anyone acting on such
Contributor's behalf. Contributions do not include additions to the
Program which: (i) are separate modules of software distributed in
conjunction with the Program under their own license agreement, and (ii)
are not derivative works of the Program.
"Contributor" means any person or entity that distributes
the Program.
"Licensed Patents" mean patent claims licensable by a
Contributor which are necessarily infringed by the use or sale of its
Contribution alone or when combined with the Program.
"Program" means the Contributions distributed in accordance
with this Agreement.
"Recipient" means anyone who receives the Program under
this Agreement, including all Contributors.
2. GRANT OF RIGHTS
a) Subject to the terms of this Agreement, each
Contributor hereby grants Recipient a non-exclusive, worldwide,
royalty-free copyright license to reproduce, prepare derivative works
of, publicly display, publicly perform, distribute and sublicense the
Contribution of such Contributor, if any, and such derivative works, in
source code and object code form.
b) Subject to the terms of this Agreement, each
Contributor hereby grants Recipient a non-exclusive, worldwide,
royalty-free patent license under Licensed Patents to make, use, sell,
offer to sell, import and otherwise transfer the Contribution of such
Contributor, if any, in source code and object code form. This patent
license shall apply to the combination of the Contribution and the
Program if, at the time the Contribution is added by the Contributor,
such addition of the Contribution causes such combination to be covered
by the Licensed Patents. The patent license shall not apply to any other
combinations which include the Contribution. No hardware per se is
licensed hereunder.
c) Recipient understands that although each Contributor
grants the licenses to its Contributions set forth herein, no assurances
are provided by any Contributor that the Program does not infringe the
patent or other intellectual property rights of any other entity. Each
Contributor disclaims any liability to Recipient for claims brought by
any other entity based on infringement of intellectual property rights
or otherwise. As a condition to exercising the rights and licenses
granted hereunder, each Recipient hereby assumes sole responsibility to
secure any other intellectual property rights needed, if any. For
example, if a third party patent license is required to allow Recipient
to distribute the Program, it is Recipient's responsibility to acquire
that license before distributing the Program.
d) Each Contributor represents that to its knowledge it
has sufficient copyright rights in its Contribution, if any, to grant
the copyright license set forth in this Agreement.
3. REQUIREMENTS
A Contributor may choose to distribute the Program in object code
form under its own license agreement, provided that:
a) it complies with the terms and conditions of this
Agreement; and
b) its license agreement:
i) effectively disclaims on behalf of all Contributors
all warranties and conditions, express and implied, including warranties
or conditions of title and non-infringement, and implied warranties or
conditions of merchantability and fitness for a particular purpose;
ii) effectively excludes on behalf of all Contributors
all liability for damages, including direct, indirect, special,
incidental and consequential damages, such as lost profits;
iii) states that any provisions which differ from this
Agreement are offered by that Contributor alone and not by any other
party; and
iv) states that source code for the Program is available
from such Contributor, and informs licensees how to obtain it in a
reasonable manner on or through a medium customarily used for software
exchange.
When the Program is made available in source code form:
a) it must be made available under this Agreement; and
b) a copy of this Agreement must be included with each
copy of the Program.
Contributors may not remove or alter any copyright notices contained
within the Program.
Each Contributor must identify itself as the originator of its
Contribution, if any, in a manner that reasonably allows subsequent
Recipients to identify the originator of the Contribution.
4. COMMERCIAL DISTRIBUTION
Commercial distributors of software may accept certain
responsibilities with respect to end users, business partners and the
like. While this license is intended to facilitate the commercial use of
the Program, the Contributor who includes the Program in a commercial
product offering should do so in a manner which does not create
potential liability for other Contributors. Therefore, if a Contributor
includes the Program in a commercial product offering, such Contributor
("Commercial Contributor") hereby agrees to defend and
indemnify every other Contributor ("Indemnified Contributor")
against any losses, damages and costs (collectively "Losses")
arising from claims, lawsuits and other legal actions brought by a third
party against the Indemnified Contributor to the extent caused by the
acts or omissions of such Commercial Contributor in connection with its
distribution of the Program in a commercial product offering. The
obligations in this section do not apply to any claims or Losses
relating to any actual or alleged intellectual property infringement. In
order to qualify, an Indemnified Contributor must: a) promptly notify
the Commercial Contributor in writing of such claim, and b) allow the
Commercial Contributor to control, and cooperate with the Commercial
Contributor in, the defense and any related settlement negotiations. The
Indemnified Contributor may participate in any such claim at its own
expense.
For example, a Contributor might include the Program in a commercial
product offering, Product X. That Contributor is then a Commercial
Contributor. If that Commercial Contributor then makes performance
claims, or offers warranties related to Product X, those performance
claims and warranties are such Commercial Contributor's responsibility
alone. Under this section, the Commercial Contributor would have to
defend claims against the other Contributors related to those
performance claims and warranties, and if a court requires any other
Contributor to pay any damages as a result, the Commercial Contributor
must pay those damages.
5. NO WARRANTY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
responsible for determining the appropriateness of using and
distributing the Program and assumes all risks associated with its
exercise of rights under this Agreement , including but not limited to
the risks and costs of program errors, compliance with applicable laws,
damage to or loss of data, programs or equipment, and unavailability or
interruption of operations.
6. DISCLAIMER OF LIABILITY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
7. GENERAL
If any provision of this Agreement is invalid or unenforceable under
applicable law, it shall not affect the validity or enforceability of
the remainder of the terms of this Agreement, and without further action
by the parties hereto, such provision shall be reformed to the minimum
extent necessary to make such provision valid and enforceable.
If Recipient institutes patent litigation against any entity
(including a cross-claim or counterclaim in a lawsuit) alleging that the
Program itself (excluding combinations of the Program with other
software or hardware) infringes such Recipient's patent(s), then such
Recipient's rights granted under Section 2(b) shall terminate as of the
date such litigation is filed.
All Recipient's rights under this Agreement shall terminate if it
fails to comply with any of the material terms or conditions of this
Agreement and does not cure such failure in a reasonable period of time
after becoming aware of such noncompliance. If all Recipient's rights
under this Agreement terminate, Recipient agrees to cease use and
distribution of the Program as soon as reasonably practicable. However,
Recipient's obligations under this Agreement and any licenses granted by
Recipient relating to the Program shall continue and survive.
Everyone is permitted to copy and distribute copies of this
Agreement, but in order to avoid inconsistency the Agreement is
copyrighted and may only be modified in the following manner. The
Agreement Steward reserves the right to publish new versions (including
revisions) of this Agreement from time to time. No one other than the
Agreement Steward has the right to modify this Agreement. The Eclipse
Foundation is the initial Agreement Steward. The Eclipse Foundation may
assign the responsibility to serve as the Agreement Steward to a
suitable separate entity. Each new version of the Agreement will be
given a distinguishing version number. The Program (including
Contributions) may always be distributed subject to the version of the
Agreement under which it was received. In addition, after a new version
of the Agreement is published, Contributor may elect to distribute the
Program (including its Contributions) under the new version. Except as
expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
rights or licenses to the intellectual property of any Contributor under
this Agreement, whether expressly, by implication, estoppel or
otherwise. All rights in the Program not expressly granted under this
Agreement are reserved.
This Agreement is governed by the laws of the State of New York and
the intellectual property laws of the United States of America. No party
to this Agreement will bring a legal action under this Agreement more
than one year after the cause of action arose. Each party waives its
rights to a jury trial in any resulting litigation.
mondrian-3.11.0.1-R/LicenseInfo.txt 0000664 0000000 0000000 00000000466 12616465703 0016720 0 ustar 00root root 0000000 0000000 // This software is subject to the terms of the Eclipse Public License v1.0
// Agreement, available at the following URL:
// http://www.eclipse.org/legal/epl-v10.html.
// You must accept the terms of that agreement to use this software.
//
// Copyright (C) 2006-2012 Pentaho and others
// All Rights Reserved.
mondrian-3.11.0.1-R/README.txt 0000664 0000000 0000000 00000000727 12616465703 0015457 0 ustar 00root root 0000000 0000000 This is a source, binary or data distribution of Mondrian,
an OLAP Engine written in Java.
This code is released under the terms of the Eclipse Public
License v1.0 (EPL); see LICENSE.html.
For installation instructions, see doc/install.html
(http://mondrian.pentaho.com/documentation/installation.php).
The version is described in VERSION.txt.
Home page: http://mondrian.pentaho.com
Project home: http://sourceforge.net/projects/mondrian/
Email: mondrian@pentaho.org
mondrian-3.11.0.1-R/RELEASE.txt 0000664 0000000 0000000 00000047717 12616465703 0015614 0 ustar 00root root 0000000 0000000
Mondrian 3.7.0 production release notes
=============================================
This release is a maintenance release. It contains all of the fixes
from our prior service packs of the 3.6.X code line. It also addresses
a lot of issues around compound slicers as well as in-memory rollup
optimizations.
We have also introduced a few select new features that the team would like
to test in the community in the hope of growing them organically.
To find out more about Mondrian, go to http://mondrian.pentaho.com.
For further installation instructions, see
http://mondrian.pentaho.com/documentation/installation.php
or the included file doc/installation.html.
New features in this release
----------------------------------
- Beta support for JMX monitoring.
- Support for olap4j 1.2.0.
- Support for NuoDB
API changes from 3.6.X to 3.7.X
----------------------------------
- None.
Notable bug fixes
----------------------------------
- Fixes issues around in-memory rollups.
- Fixes issues with Impala and Hive dialects.
- Fixes issues where using roles would prevent all of the members from
being cached and retrieved correctly.
- Fixes arithmetic errors when compound slicers are used.
- Fixes concurrency issues with the segment indexes and external caches.
See CHANGES.txt for a list of all source code changes
since the previous release.
Mondrian 3.6.0 production release notes
=============================================
Introduction
------------
Mondrian 3.6.0 is a feature feature release based off the previous 3.4.9
version. It contains all of the previous bug fixes, plus added support for
native resolution of named sets containing compound expressions.
We have also included some performance enhancements in the core code.
To find out more about Mondrian, go to http://mondrian.pentaho.com.
Contents
--------
As usual, there are two distributions for this release:
* mondrian-.zip contains the FoodMart dataset in
SQL and Access format
* mondrian--derby.zip contains the FoodMart
dataset as an Apache Derby database
Each distribution contains the full mondrian source code, as
mondrian--src.zip, documentation including
generated API documentation, and a web archive mondrian.war.
This web archive contains all classes and libraries (jars)
necessary to run mondrian.
For further installation instructions, see
http://mondrian.pentaho.com/documentation/installation.php
or the included file doc/installation.html.
Main functionality in this release
----------------------------------
- Support for native named sets which use the '+' operator.
- Faster implementation of olap4j's Member.getParent and some other
method calls by using the Locus API.
- Various bug fixes form the previous 3.4.X re-releases.
API changes from 3.5.9 to 3.6.0
---------------------------
- None.
See CHANGES.txt for a list of all source code changes
since the previous release.
Mondrian 3.5.0-GA production release notes
=============================================
Introduction
------------
Mondrian 3.5.0 is a bugfix release based off the previous 3.4.1 version.
It includes many enhancements and performance fixes as well as better
native support for native resolution of tuples when access controls
are added.
We have also significantly improved the performance when dealing with
levels of high cardinality as well as enabled Mondrian to run into
a real-time mode where nothing gets cached and the data it returns
is always the latest from the source.
To find out more about Mondrian, go to http://mondrian.pentaho.com.
Contents
--------
As usual, there are two distributions for this release:
* mondrian-.zip contains the FoodMart dataset in
SQL and Access format
* mondrian--derby.zip contains the FoodMart
dataset as an Apache Derby database
Each distribution contains the full mondrian source code, as
mondrian--src.zip, documentation including
generated API documentation, and a web archive mondrian.war.
This web archive contains all classes and libraries (jars)
necessary to run mondrian.
For further installation instructions, see
http://mondrian.pentaho.com/documentation/installation.php
or the included file doc/installation.html.
Main functionality in this release
----------------------------------
- Tuples evaluation now push down natively the constraints
imposed by roles.
- Fixes some issues in the way Mondrian was splitting segments
across multiple sub-segments.
- Resolving tuples only joins to the fact table if absolutely
necessary.
- Improved processing of large volumes of data when a member grant
is used with a partial rollup policy.
- Enables a mode in which nothing gets cached and the data returned
is always the latest available from the database.
- Allows more than one measure to be included in the RETURN clause
of a DRILLTHROUGH statement.
- Added support for native evaluation of regular expressions with
Netezza.
- Upgraded Apache Xerces.
API changes from 3.4.1 to 3.5.0
---------------------------
- Changes to the effects of the property 'mondrian.rolap.DisableCache'
- Introduces a new property to disable the default in-memory cache
for segments.
- Added a new method to specify the roles for a connection to allow
the presence of commas in role names.
- Allows to specify a minimum TTL value for schemas in the pool through
connection properties.
- Allows to specify a unique connection UUID to force the usage of a
specific schema in the pool through connection properties.
See CHANGES.txt for a list of all source code changes
since the previous release.
Mondrian 3.4.0-GA production release notes
=============================================
Introduction
------------
Mondrian 3.4.0-GA is a major refactoring of Mondrian's internals
and the way it handles & stores the cell data. This release makes
Mondrian much more scalable and much more effective in the way it
uses the system threads.
This release also introduces a new algorithm to load, share and
rollup the data cells, or segments. Mondrian will rollup and union
the segment data from low levels, in memory, to answer queries
related to higher levels. This provides a huge improvement in
performance on systems with high user interactivity.
It is also worth noting that the Mondrian project now hosts its
source code on github. The official source code can now be found
at: github.com/pentaho/mondrian
To find out more about Mondrian, go to http://mondrian.pentaho.com.
Contents
--------
As usual, there are two distributions for this release:
* mondrian-.zip contains the FoodMart dataset in
SQL and Access format
* mondrian--derby.zip contains the FoodMart
dataset as an Apache Derby database
Each distribution contains the full mondrian source code, as
mondrian--src.zip, documentation including
generated API documentation, and a web archive mondrian.war.
This web archive contains all classes and libraries (jars)
necessary to run mondrian.
This release runs on Java version 1.5 and higher. For
backwards compatibility on Java 1.4, substitute
mondrian-jdk14.jar for mondrian.jar, and add
retroweaver-rt-1.2.4.jar to your classpath.
For further installation instructions, see
http://mondrian.pentaho.com/documentation/installation.php
or the included file doc/installation.html.
Main functionality in this release
----------------------------------
- Support for olap4j 1.0.1 and JDBC 4.1.
- Simplified and improved the SegmentCache SPI.
- Introduces the Mondrian Monitor API.
- Refactored some key parts of the engine into an
implementation of the Actor design pattern, providing more
effective resource sharing and the elimination of many
synchronization blocks.
- SQL queries for cell data is now fetched by a multi-threaded
executor and the tasks are shared among the query threads.
- More than one SegmentCache implementations can now be used
at a time.
- Ability to combine the data of multiple segments for a single
query.
- Ability to combine data of an existing segment with data form SQL.
- Support for the DRILLTHROUGH RETURN clause.
- Ability to define non-measure calculated members in a cube
under a specific parent.
- Allow aggregate tables to join to middle levels of snowflake
dimension.
- As usual, many other bug fixes and performance tweaks.
API changes from 3.3.to 3.4
---------------------------
- Substantial changes to SegmentCache
- Upgraded to olap4j-1.0.1.500
See CHANGES.txt for a list of all source code changes
since the previous release.
Mondrian 3.3.0.14703 production release notes
=============================================
Introduction
------------
Mondrian 3.3.0.14703 introduces many new features, optimizations and
bug fixes to the previous release. There are a few potentially
disruptive changes introduced in this release. We strongly
recommend reading these release notes carefully.
To find out more about mondrian, go to http://mondrian.pentaho.com.
Contents
--------
As usual, there are two distributions for this release:
* mondrian-.zip contains the FoodMart dataset in
SQL and Access format
* mondrian--derby.zip contains the FoodMart
dataset as an Apache Derby database
Each distribution contains the full mondrian source code, as
mondrian--src.zip, documentation including
generated API documentation, and a web archive mondrian.war.
This web archive contains all classes and libraries (jars)
necessary to run mondrian.
This release runs on Java version 1.5 and higher. For
backwards compatibility on Java 1.4, substitute
mondrian-jdk14.jar for mondrian.jar, and add
retroweaver-rt-1.2.4.jar to your classpath.
For further installation instructions, see
http://mondrian.pentaho.com/documentation/installation.php
or the included file doc/installation.html.
Main functionality in this release
----------------------------------
- Improved native performance.
- Support for olap4j 1.0.
- XMLA now supports roles and access controls, as well as
a major refactoring to allow the XMLA servlet to run on top
of any olap4j compliant driver.
- Improved Greenplum support.
- Improved member cache control.
- Introduces the Hive dialect.
- Introduces scripted user defined functions and formatters.
- Introduces the SegmentCache SPI.
- Introduces the EXPLAIN PLAN query.
API changes from 3.2.to 3.3
---------------------------
- Added OlapElement.isVisible().
- Dialect now includes:
o allowsJoinOn()
o allowsRegularExpressionInWhereClause()
o generateRegularExpression()
o requiresHavingAlias()
o generateCountExpression()
- Dialect removes:
o getNullCollation()
- Upgraded to olap4j-1.0.0.445
- Introduction of:
o SegmentCache
o PropertyFormatter
o MemberFormatter
o CellFormatter
See CHANGES.txt for a list of all source code changes
since the previous release.
Bugs and feature requests fixed for 3.3.0.14703
----------------------------------------------------------
A complete list of the changes included in this release is available
at the following URL.
http://jira.pentaho.com/secure/IssueNavigator.jspa?requestId=11075
Bugs and feature requests fixed for 3.2.1.13885
----------------------------------------------------------
MONDRIAN-821 - Adds a unique ID property to the Schema API. This id
is expected to be different across different Mondrian
instances. It allows clients to refresh their schema
caches when that ID changes. This usually happened
when a dynamic schema processor is used and the schema
changes when a user login changes.
MONDRIAN-695 - NonEmpty, Crossjoin and multiple dimensions in a slicer
all together were returning wrong results with native
sets.
PPP-2542 - Changing dir to the current dir for win7 issue,
BISERVER-4632, added check to see if the jre folder
provided exists
Bugs and feature requests fixed for 3.2.1.13841
----------------------------------------------------------
MONDRIAN-799 - Currency format string shows a junk character for the
currency symbol
MONDRIAN-779 - Include/exclude filter not working
MONDRIAN-777 - The identical view acting as a relation for a dimension
table and fact table is determined not equal, causing
issues with degenerate dimensions in views
MONDRIAN-776 - mondrian.xsd updated to new specifications
MONDRIAN-769 - row counts coming back as zero
MONDRIAN-766 - Bug in escaping strings containing backslash for MySQL
MONDRIAN-761 - mondrian.olap.fun.VisualTotalsFunDef$VisualTotalMember
cannot be cast to mondrian.rolap.RolapCubeMember
MONDRIAN-756 - Error in RolapResult.replaceNonAllMembers leads to NPE
MONDRIAN-755 - Getting drillthrough count results in exception
MONDRIAN-735 - Indian format strings
MONDRIAN-724 - Cannot reference Member that has the same name as the
Level.
MONDRIAN-711 - Wrong behaviour with approxRowCount attribute added in
a Level element
MONDRIAN-568 - If two cubes have dimension with same name, mondrian
treats grant to one as grant to other
MONDRIAN-463 - New error messages if hierarchy has no levels; if
hierarchy has
BISERVER-4618 - PSW Duplicate catalog entry in datasources.xml
PSW-87 - As a BI Pracitioner, I would like Schema Workbench to use the
same connection creation dialog as the rest of the Pentaho
products
PSW-84 - Column in schema workbench wont allow as measure if data type
in RDBMS is BIGINT
Bugs and feature requests fixed for 3.2.0.13661
----------------------------------------------------------
MONDRIAN-751 - Drill SQL does not include slicer members in WHERE
clause
Bugs and feature requests fixed for 3.2.0.13658
----------------------------------------------------------
MONDRIAN-745 - NullPointerException when passing in null param value
MONDRIAN-746 - Level of calculated member is different when hierarchy
is access-controlled
MONDRIAN-750 - View model with Analyzer where model contains multiple
hierarchies beneath a single dimension throws exception
Bugs and feature requests fixed for 3.2.0.13643
----------------------------------------------------------
MONDRIAN-560 - StrToMember function doesn't use IgnoreInvalidMembers
option
MONDRIAN-737 - Sybase SQL Dialect is not correctly applied for
Sybase Adaptive Server Enterprise 15.5
MONDRIAN-722 - If ignoreInvalidMembers=true, should ignore
grants with invalid members
MONDRIAN-734 - Exception thrown when creating a 'New Analysis View'
with JPivot
MONDRIAN-728 - Rolap Connection Locale is handled incorrectly in
LocalizingDynamicSchemaProcessor.java
MONDRIAN-738 - Statements not being closed
MONDRIAN-708 - After change 13351 all Excel pivots fail to update.
CellInfo element in XMLA response is wrong
MONDRIAN-742 - Role security not applied correctly for the 'Top
Level' restriction
MONDRIAN-727 - [Fact count] measure added in change 13506
shouldn't be returned in XMLA rowset, not visible
measures shouldn't be
returned either
Bugs and feature requests fixed for 3.2.0.13583
----------------------------------------------------------
MONDRIAN-686 - Regression: JPivot output invalid - New Variance
Percent column
MONDRIAN-691 - RolapSchemaReader is not enforcing access control
on two APIs
MONDRIAN-694 - Incorrect handling of child/parent relationship
with hierarchy grants
MONDRIAN-726 - Change 13509 is not Excel 2007 compatible
MONDRIAN-725 - setParameter function should be able to accept
Java string for set value
MONDRIAN-652 - Add support for generic annotations to Mondrian schema
MONDRIAN-718 - Direct References to Members on a Dimension that has
calculated members defined will not be found
MONDRIAN-710 - Count with ExcludeEmpty throws an exception when
the cube does not have a factCountMeasure
MONDRIAN-715 - Constrained Measures can generate incorrect results
when evaluated natively
MONDRIAN-706 - SQL using hierarchy attribute 'Column Name'
instead of 'Column' in the filter
MONDRIAN-705 - Aggregate with grouping sets turned on causes
exception
MONDRIAN-704 - MDSCHEMA_PROPERTIES should not return internal
properties
MONDRIAN-681 - Add serializable to PropertyList class for caching
MONDRIAN-678 - VisualTotals gives UnsupportedOperationException
calling getOrdinal
MONDRIAN-679 - VisualTotals gives ClassCastException when called
via XMLA
Mondrian Previous Releases - Tags and Checksums
===============================================
Below is the list of Mondrian tags and checksums in Git. They
represent the previous releases of Mondrian and can all be found
directly from: https://github.com/pentaho/mondrian/tags
Version Tag Git Hash
------- --------- ----------------------------------------
3.6.7 3.6.7-R 6c8436dac24b08c32a84234ded106cd8a6b74f88
3.6.6 3.6.6-R a1486a6a56e7ee0055c91d7bd44bd5091ce84092
3.6.5 3.6.5-R 56609c22ea7e2edc46c67bc83d2f245e52bd732e
3.6.4 3.6.4-R e9b291fb5ae82862e37037befcd2d3504592f209
3.6.3 3.6.3-R 8e4009ff39cb9e5e60a67d3f1a674f4a01b6e45e
3.6.2 3.6.2-R 19ed7f14a3aada13dc15adb4109f1b3b415d7a55
3.6.1 3.6.1-R ae6d1a41a351e5dc43f627ae6bba98de99487207
3.6.0.1 3.6.0.1-R 9dc5a6a639b3f47b1c2addb90d159c008a61e8b0
3.6.0 3.6.0-R 7fb96718a2ca652b864c7a22ffbd2023172f4445
3.5.14 3.5.14-R 7734f8fb5312abe9a086e9c4bbd9bea1dedf7ac9
3.5.13 3.5.13-R b831b0ed8e63e2108b952aed12eb74b70ff2cd9c
3.5.12 3.5.12-R cf469ac137ad48ca4fc48272590f8e720ae392e7
3.5.11 3.5.11-R 2fc917a5640cc35ca68670b86505fd7748553af7
3.5.10 3.5.10-R 097264aa7e11d89881c2c9a8d54961b122620788
3.5.9 3.5.9-R 187129ca52cb8037b27e9063a3f9d2a66230c67d
3.5.8 3.5.8-R 643db12c8a8044934fcf9c0bc202be1556c4c254
3.5.7 3.5.7-R c15578eaf0ecb3fe10b2848431a508aed1e47e3e
3.5.6 3.5.6-R 263f9f0b9ecdcbd7dc49460717fa16f193ba89d4
3.5.5 3.5.5-R 1a6f422f88a285d560dc3d4f903fba756643a080
3.5.4 3.5.4-R 3c76d436b1324be35c922a2c5fd0495bdd36ebe6
3.5.3 3.5.3-R 8d01ab45bfd641bc2c489ea3f46a5ba563d557a7
3.5.2 3.5.2-R 3dfeb82c0ae2e1f96fe82c2fc3e4bc95959fe8a4
3.5.1 3.5.1-R dcef59a1c32eab95662b9950b9b875e88511af29
3.5.0 3.5.0-R b7033fea78744a3a9702efed767498e14593951e
3.4.17 3.4.17-R 10abbaf0bde215e8c6cf31b2708a045ef128cf8c
3.4.16 3.4.16-R 3be0d9220620268245880b03dacd9b33c6a4bf61
3.4.15 3.4.15-R 3d0333fcd1bec7ee5ae0660ca6ad2f1f8c3c21f1
3.4.14 3.4.14-R 7a0613f7ac1610a4a260814fe7f20a683345a4e1
3.4.13 3.4.13-R 762d7bfc1074802a0bd2ca554bfb799f9dffdd09
3.4.12 3.4.12-R 59c3ddacdefa6c0174d9777176f366d7feb1daf0
3.4.11 3.4.11-R ef3a173941b7f355a5e3c28d4ff3d204c299ec18
3.4.10 3.4.10-R d5eb9b1534ee2a1325b9c0418ec919c5e6cda67e
3.4.9 3.4.9-R bfc255caaccca484f4cbdfc99d0a3bf3244b8867
3.4.8 3.4.8-R 50470c77d4872509821a78d1835b566cd3ffffea
3.4.7 3.4.7-R 46a5b225264ec731433c6fde64335578fbabf9e3
3.4.6 3.4.6-R 9636faddab631b3dc504677d1a442d380fc32ed9
3.4.5 3.4.5-R 0e4efa3e8273bd27b01e3b4871629c773edaa8f1
3.4.4 3.4.4-R 0d86fc57b743fcad6ba618d18ac5e80b3344447a
3.4.3 3.4.3-R e526272ceed4c888d6162e33e5260487fe4d4261
3.4.2 3.4.2-R afdf8826a7bc40633cdb363df71abdfef791ed9f
3.4.1 3.4.1-R 4639f47ce665e94d99f99d89a0a2c8e399d9d358
3.3.2 3.3.2-R 9518450f359a099368c3391262953a0c9cb72792
3.3.1 3.3.1-R 34460aca8fdef617bef640fa9331bfacc04f9324
3.3.0 3.3.0-R d14cac7b8c95d2e70ab87121d0098aa854c805d4
3.2.5 3.2.5-R 17e3c699655494fc383b5365eec5b428da66435b
3.2.4 3.2.4-R 8bc44978106a2e3c5817286a0717903281695b19
3.2.3 3.2.3-R 0436dec34369fbf0a1fdda47ac0e44831ee81747
3.2.2 3.2.2-R 88c3b7e8fdecc91001391ff4998758b14dc173da
3.2.1 3.2.1-R 984fce88f5f55aa4e051e2e0377b4b84a8865960
mondrian-3.11.0.1-R/bin/ 0000775 0000000 0000000 00000000000 12616465703 0014523 5 ustar 00root root 0000000 0000000 mondrian-3.11.0.1-R/bin/checkFile.awk 0000664 0000000 0000000 00000070473 12616465703 0017117 0 ustar 00root root 0000000 0000000 #!/bin/gawk
# Checks that a file is valid.
function error(fname, linum, msg) {
printf "%s:%d: %s\n", fname, linum, msg;
if (0) print; # for debug
}
function _matchFile(fname) {
return fname ~ "/mondrian/" \
|| fname ~ "/org/olap4j/" \
|| fname ~ "/aspen/" \
|| fname ~ "/farrago/" \
|| fname ~ "/fennel/" \
|| fname ~ "/extensions/" \
|| fname ~ "/com/sqlstream/" \
|| fname ~ "/linq4j/" \
|| fname ~ "/lambda/" \
|| fname ~ "/optiq/" \
|| strict > 0;
}
function _isCpp(fname) {
return fname ~ /\.(cpp|h)$/;
}
function _isJava(fname) {
return fname ~ /\.(java|jj)$/;
}
function _isMondrian(fname) {
return fname ~ /mondrian/;
}
function _isOlap4j(fname) {
return fname ~ "/org/olap4j/";
}
function push(val) {
switchStack[switchStackLen++] = val;
}
function pop() {
--switchStackLen
val = switchStack[switchStackLen];
delete switchStack[switchStackLen];
return val;
}
function afterFile() {
# Compute basename. If fname="/foo/bar/baz.txt" then basename="baz.txt".
basename = fname;
gsub(".*/", "", basename);
gsub(lf, "", lastNonEmptyLine);
terminator = "// End " basename;
if (matchFile && (lastNonEmptyLine != terminator)) {
error(fname, FNR, sprintf("Last line should be %c%s%c", 39, terminator, 39));
}
}
# Returns whether there are unmatched open parentheses.
# unmatchedOpenParens("if ()") returns false.
# unmatchedOpenParens("if (") returns true.
# unmatchedOpenParens("if (foo) bar(") returns false
function unmatchedOpenParens(s) {
i = index(s, "(");
if (i == 0) {
return 0;
}
openCount = 1;
while (++i <= length(s)) {
c = substr(s, i, 1);
if (c == "(") {
++openCount;
}
if (c == ")") {
if (--openCount == 0) {
return 0;
}
}
}
return 1;
}
function countLeadingSpaces(str) {
i = 0;
while (i < length(str) && substr(str, i + 1, 1) == " ") {
++i;
}
return i;
}
function checkIndent(str) {
return str % indent == 0;
}
function startsWith(s, p) {
return length(s) > length(p) \
&& substr(s, 1, length(p)) == p;
}
BEGIN {
# pre-compute regexp for quotes, linefeed
apos = sprintf("%c", 39);
quot = sprintf("%c", 34);
lf = sprintf("%c", 13);
pattern = apos "(\\" apos "|[^" apos "])" apos;
if (0) printf "maxLineLength=%s strict=%s\n", maxLineLength, strict;
}
FNR == 1 {
if (fname) {
afterFile();
}
fname = FILENAME;
matchFile = _matchFile(fname);
isCpp = _isCpp(fname);
isJava = _isJava(fname);
mondrian = _isMondrian(fname);
prevImport = "";
prevImportGroup = "";
indent = (fname ~ /lambda/ || fname ~ /linq4j/) ? 2 : 4;
cindent = 4;
delete headers;
headerCount = 0;
if ($0 ~ /Generated By:JavaCC/ \
|| $0 ~ /This class is generated/) {
# generated; skip whole file
nextfile
} else if (fname ~ /XmlaOlap4jDriverVersion.java/ \
|| fname ~ /package-info.java/ \
|| fname ~ /MondrianOlap4jDriverVersion.java/ \
|| fname ~ /MondrianTestRunner.java/ \
|| fname ~ /MondrianResultPrinter.java/) {
# generated; does not contain standard header
} else if (mondrian) {
headers[headerCount++] = "/\\*$";
headers[headerCount++] = "// This software is subject to the terms of the Eclipse Public License v1.0$";
headers[headerCount++] = "// Agreement, available at the following URL:$";
headers[headerCount++] = "// http://www.eclipse.org/legal/epl-v10.html.$";
headers[headerCount++] = "// You must accept the terms of that agreement to use this software.$";
headers[headerCount++] = "//$";
headers[headerCount++] = "// Copyright (C) [0-9]*-[0-9]* Pentaho$";
} else if (1) {
headers[headerCount++] = "/\\*$";
if (_isOlap4j(fname)) {
headers[headerCount++] = /^\/\/ \$Id: /;
headers[headerCount++] = "//";
}
headers[headerCount++] = "// Licensed to Julian Hyde under one or more contributor license$";
headers[headerCount++] = "// agreements. See the NOTICE file distributed with this work for$";
headers[headerCount++] = "// additional information regarding copyright ownership.$";
headers[headerCount++] = "//$";
headers[headerCount++] = "// Julian Hyde licenses this file to you under the Apache License,$";
headers[headerCount++] = "// Version 2.0 \\(the \"License\"\\); you may not use this file except in$";
headers[headerCount++] = "// compliance with the License. You may obtain a copy of the License at:$";
headers[headerCount++] = "//$";
headers[headerCount++] = "// http://www.apache.org/licenses/LICENSE-2.0$";
headers[headerCount++] = "//$";
headers[headerCount++] = "// Unless required by applicable law or agreed to in writing, software$";
headers[headerCount++] = "// distributed under the License is distributed on an \"AS IS\" BASIS,$";
headers[headerCount++] = "// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.$";
headers[headerCount++] = "// See the License for the specific language governing permissions and$";
headers[headerCount++] = "// limitations under the License.$";
headers[headerCount++] = "*/$";
}
}
FNR < headerCount {
if ($0 !~ headers[FNR - 1]) {
error(fname, FNR, "Does not match expected header line: " headers[FNR - 1] "\n");
headerCount = 0; # prevent further errors from this file
}
}
{
if (previousLineEndedInCloseBrace > 0) {
--previousLineEndedInCloseBrace;
}
if (previousLineEndedInOpenBrace > 0) {
--previousLineEndedInOpenBrace;
}
if (previousLineWasEmpty > 0) {
--previousLineWasEmpty;
}
s = $0;
# remove DOS linefeeds
gsub(lf, "", s);
# replace strings
gsub(/"(\\"|[^"\\]|\\[^"])*"/, "string", s);
# replace single-quoted strings
gsub(pattern, "string", s);
# replace {: and :} in .cup files
if (fname ~ /\.cup$/) {
gsub(/{:/, "{", s);
gsub(/:}/, "}", s);
gsub(/:/, " : ", s);
}
if (inComment && s ~ /\*\//) {
# end of multiline comment "*/"
inComment = 0;
gsub(/^.*\*\//, "/* comment */", s);
} else if (inComment) {
s = "/* comment */";
} else if (s ~ /\/\*/ && s !~ /\/\*.*\*\//) {
# beginning of multiline comment "/*"
inComment = 1;
if (strict > 1 && FNR > 1 && s !~ /\/\*\*/ && s !~ /^\/\*/) {
error(fname, FNR, "Multi-line c-style comment not allowed" s);
}
gsub(/\/\*.*$/, "/* comment */", s);
} else {
# mask out /* */ comments
gsub(/\/\*.*\*\//, "/* comment */", s);
}
if (mondrian && s ~ /\/\/\$NON-NLS/) {
error(fname, FNR, "NON-NLS not allowed");
}
if (s ~ /\/\/[A-Za-z]/ && strict > 1) {
if (s ~ /noinspection/) {} # e.g. '//noinspection unchecked'
else if (s ~ /;$/) {} # e.g. '//int dummy = 0;'
else if (s ~ /:\/\//) {} # e.g. '// http://'
else error(fname, FNR, "Need space after //");
}
# mask out // comments
gsub(/\/\/.*$/, "// comment", s);
# line starts with string or plus?
if (s ~ /^ *string/ \
&& s !~ /)/)
{
stringCol = index(s, "string");
} else if (s ~ /^ *[+] string/) {
if (stringCol != 0 && index(s, "+") != stringCol) {
error(fname, FNR, "String '+' must be aligned with string on line above");
}
} else if (s ~ /comment/) {
# in comment; string target carries forward
} else {
stringCol = 0;
}
# Is the line indented as expected?
if (nextIndent > 0) {
x = countLeadingSpaces(s);
if (x != nextIndent) {
error(fname, FNR, "Incorrect indent for first line of arg list");
}
}
nextIndent = -1;
}
/ $/ {
error(fname, FNR, "Line ends in space");
}
/[\t]/ {
if (matchFile) {
error(fname, FNR, "Tab character");
}
}
/[\r]/ {
if (matchFile) {
error(fname, FNR, "Carriage return character (file is in DOS format?)");
}
}
/./ {
lastNonEmptyLine = $0;
}
{
# Rules beyond this point only apply to Java and C++.
if (!isCpp && !isJava) {
next;
}
}
/^package / {
thisPackage = $2;
}
/^package / && previousLineWasEmpty {
error(fname, FNR, "'package' declaration must not occur after empty line");
}
/^import / {
if (previousLineWasEmpty) {
prevImport = "";
} else {
if (!prevImport) {
error(fname, FNR, "Expected blank line before first import");
}
}
thisImport = $2;
gsub(/;/, "", thisImport);
gsub(/\*/, "", thisImport);
if (thisPackage ~ /^mondrian.*/ && thisImport ~ /^mondrian.*/) {
importGroup = "a:mondrian";
} else if (thisPackage ~ /^net.hydromatic.*/ && thisImport ~ /^net.hydromatic.*/) {
importGroup = "a:net.hydromatic";
} else if (thisPackage ~ /^org.olap4j.*/ && thisImport ~ /^org.olap4j.*/) {
importGroup = "a:org.olap4j";
} else if (thisImport ~ /^static/) {
importGroup = "z:static";
} else if (thisImport ~ /^java.*/) {
if (thisPackage ~ /^org.eigenbase.*/) {
importGroup = "aa:java";
} else {
importGroup = "y:java";
}
} else if (thisImport ~ /^junit.*/) {
importGroup = "b:junit";
} else if (thisImport ~ /^mondrian.*/) {
importGroup = "bb:mondrian";
} else if (thisImport ~ /^org.olap4j.xmla.server.*/) {
importGroup = "bc:org.olap4j.xmla.server";
} else if (thisImport ~ /^openjava.*/) {
importGroup = "cc:openjava";
} else if (thisImport ~ /^org.apache.*/) {
importGroup = "c:org.apache";
} else if (thisImport ~ /^org.eigenbase.*/) {
importGroup = "d:org.eigenbase";
} else if (thisImport ~ /^org.olap4j.*/) {
importGroup = "e:org.olap4j";
} else {
importGroup = "f:other";
}
if (importGroup != prevImportGroup \
&& prevImportGroup)
{
if (!previousLineWasEmpty) {
error(fname, FNR, "Expected blank line between import groups");
} else if (prevImportGroup > importGroup) {
error(fname, FNR, "Import group out of sequence (should precede " \
substr(prevImportGroup, index(prevImportGroup, ":") + 1) ")");
}
} else if (prevImport \
&& prevImport > thisImport \
&& !startsWith(prevImport, thisImport) \
&& !startsWith(thisImport, prevImport))
{
error(fname, FNR, "Import out of sorted order");
}
prevImport = thisImport;
prevImportGroup = importGroup;
}
/^\/\/ Copyright .* Pentaho/ && strict > 1 {
# We assume that '--strict' is only invoked on files currently being
# edited. Therefore we would expect the copyright to be current.
if ($0 !~ /-2015/) {
error(fname, FNR, "copyright is not current");
}
}
/(static|public|private|protected|final|abstract)/ && !/import/ && strict > 1 {
# Order of qualifiers: "public/private/protected static final abstract class ..."
s2 = s;
gsub(/\(.*$/, "", s2);
if (s2 ~ /abstract .*final /) {
error(fname, FNR, "'final' must come before 'abstract'");
}
if (s2 ~ /final .*static /) {
error(fname, FNR, "'static' must come before 'final'");
}
if (s2 ~ /abstract .*static /) {
error(fname, FNR, "'static' must come before 'abstract'");
}
if (s2 ~ /static .*(public|protected|private) /) {
error(fname, FNR, "'public/private/protected' must come before 'static'");
}
if (s2 ~ /final .*(public|protected|private) /) {
error(fname, FNR, "'public/private/protected' must come before 'final'");
}
if (s2 ~ /abstract .*(public|protected|private) /) {
error(fname, FNR, "'public/private/protected' must come before 'abstract'");
}
}
/^$/ {
if (matchFile && previousLineEndedInOpenBrace) {
error(fname, FNR, "Empty line following open brace");
}
}
/^ +}( catch| finally| while|[;,)])/ ||
/^ +}$/ {
if (matchFile && previousLineWasEmpty) {
error(fname, FNR - 1, "Empty line before close brace");
}
}
s ~ /\.*;$/ {
if (!matchFile) {}
else {
error(fname, FNR, "if followed by statement on same line");
}
}
s ~ /\<(if) *\(/ {
if (!matchFile) {
} else if (s !~ /\<(if) /) {
error(fname, FNR, "if must be followed by space");
} else if (s ~ / else if /) {
} else if (s ~ /^#if /) {
} else if (!checkIndent(s)) {
error(fname, FNR, "if must be correctly indented");
}
}
s ~ /\<(while) *\(/ {
if (!matchFile) {
} else if (s !~ /\<(while) /) {
error(fname, FNR, "while must be followed by space");
} else if (s ~ /} while /) {
} else if (!checkIndent(s)) {
error(fname, FNR, "while must be correctly indented");
}
}
s ~ /\<(for|switch|synchronized|} catch) *\(/ {
if (!matchFile) {}
else if (!checkIndent(s)) {
error(fname, FNR, "for/switch/synchronized/catch must be correctly indented");
} else if (s !~ /\<(for|switch|synchronized|} catch) /) {
error(fname, FNR, "for/switch/synchronized/catch must be followed by space");
}
}
s ~ /\<(if|while|for|switch|catch)\>/ {
# Check single-line if statements, such as
# if (condition) return;
# We recognize such statements because there are equal numbers of open and
# close parentheses.
opens = s;
gsub(/[^(]/, "", opens);
closes = s;
gsub(/[^)]/, "", closes);
if (!matchFile) {
} else if (s ~ /{( *\/\/ comment)?$/) {
# lines which end with { and optional comment are ok
} else if (s ~ /{.*\\$/ && isCpp) {
# lines which end with backslash are ok in c++ macros
} else if (s ~ /} while/) {
# lines like "} while (foo);" are ok
} else if (s ~ /^#/) {
# lines like "#if 0" are ok
} else if (s ~ /if \(true|false\)/) {
# allow "if (true)" and "if (false)" because they are
# used for commenting
} else if (!unmatchedOpenParens(s) \
&& length($0) != 79 \
&& length($0) != 80)
{
error(fname, FNR, "single-line if/while/for/switch/catch must end in {");
}
}
s ~ /[[:alnum:]]\(/ &&
s !~ /\<(if|while|for|switch|assert)\>/ {
ss = s;
while (match(ss, /[[:alnum:]]\(/)) {
ss = substr(ss, RSTART + RLENGTH - 1);
parens = ss;
gsub(/[^()]/, "", parens);
while (substr(parens, 1, 2) == "()") {
parens = substr(parens, 3);
}
opens = parens;
gsub(/[^(]/, "", opens);
closes = parens;
gsub(/[^)]/, "", closes);
if (length(opens) > length(closes)) {
if (ss ~ /,$/) {
bras = ss;
gsub(/[^<]/, "", bras);
kets = ss;
gsub(/->/, "", kets);
gsub(/[^>]/, "", kets);
if (length(bras) > length(kets)) {
# Ignore case like 'for (Map.Entry entry : ...'
} else if (s ~ / for /) {
# Ignore case like 'for (int i = 1,{nl} j = 2; i < j; ...'
} else if (indent == cindent) {
error( \
fname, FNR, \
"multi-line parameter list should start with newline");
break;
}
} else if (s ~ /[;(]( *\\)?$/) {
# If open paren is at end of line (with optional backslash
# for macros), we're fine.
} else if (s ~ /@.*\({/) {
# Ignore Java annotations.
} else if (indent == cindent) {
error( \
fname, FNR, \
"Open parenthesis should be at end of line (function call spans several lines)");
break;
}
}
ss = substr(ss, 2); # remove initial "("
}
}
s ~ /\/ {
push(switchCol);
switchCol = index($0, "switch");
}
s ~ /{/ {
braceCol = index($0, "{");
if (braceCol == switchCol) {
push(switchCol);
}
}
s ~ /}/ {
braceCol = index($0, "}");
if (braceCol == switchCol) {
switchCol = pop();
}
}
s ~ /\<(case|default)\>/ {
caseDefaultCol = match($0, /case|default/);
if (!matchFile) {}
else if (caseDefaultCol != switchCol) {
error(fname, FNR, "case/default must be aligned with switch");
}
}
s ~ /\/ {
if (!matchFile) {}
else if (isCpp) {} # rule only applies to java
else if (!checkIndent(s)) {
error(fname, FNR, "assert must be correctly indented");
} else if (s !~ /\/ {
if (!matchFile) {}
else if (isCpp && s ~ /^#/) {
# ignore macros
} else if (!checkIndent(s)) {
error(fname, FNR, "return must be correctly indented");
} else if (s !~ /\/ {
if (!matchFile) {}
else if (isCpp) {
# cannot yet handle C++ cases like 'void foo() throw(int)'
} else if (!checkIndent(s)) {
error(fname, FNR, "throw must be correctly indented");
} else if (s !~ /\/ {
if (!matchFile) {}
else if (isCpp && s ~ /^# *else$/) {} # ignore "#else"
else if (!checkIndent(s)) {
error(fname, FNR, "else must be correctly indented");
} else if (s !~ /^ +} else (if |{$|{ *\/\/|{ *\/\*)/) {
error(fname, FNR, "else must be preceded by } and followed by { or if");
}
}
s ~ /\/ {
if (!matchFile) {}
else if (!checkIndent(s)) {
error(fname, FNR, "do must be correctly indented");
} else if (s !~ /^ *do {/) {
error(fname, FNR, "do must be followed by space {");
}
}
s ~ /\/ {
if (!matchFile) {}
else if (!checkIndent(s)) {
error(fname, FNR, "try must be correctly indented");
} else if (s !~ /^ +try {/) {
error(fname, FNR, "try must be followed by space {");
}
}
s ~ /\/ {
if (!matchFile) {}
else if (!checkIndent(s)) {
error(fname, FNR, "catch must be correctly indented");
} else if (s !~ /^ +} catch /) {
error(fname, FNR, "catch must be preceded by } and followed by space");
}
}
s ~ /\/ {
if (!matchFile) {}
else if (!checkIndent(s)) {
error(fname, FNR, "finally must be correctly indented");
} else if (s !~ /^ +} finally {/) {
error(fname, FNR, "finally must be preceded by } and followed by space {");
}
}
s ~ /\($/ {
nextIndent = countLeadingSpaces(s) + cindent;
if (s ~ / (if|while) .*\(.*\(/ && indent == cindent) {
nextIndent += indent;
}
}
match(s, /([]A-Za-z0-9()])(+|-|\*|\^|\/|%|=|==|+=|-=|\*=|\/=|>=|<=|!=|&|&&|\||\|\||^|\?|:) *[A-Za-z0-9(]/, a) {
# < and > are not handled here - they have special treatment below
if (!matchFile) {}
# else if (s ~ /<.*>/) {} # ignore templates
else if (a[2] == "-" && s ~ /\(-/) {} # ignore case "foo(-1)"
else if (a[2] == "-" && s ~ /[eE][+-][0-9]/) {} # ignore e.g. 1e-5
else if (a[2] == "+" && s ~ /[eE][+-][0-9]/) {} # ignore e.g. 1e+5
else if (a[2] == ":" && s ~ /(case.*|default):$/) {} # ignore e.g. "case 5:"
else if (isCpp && s ~ /[^ ][*&]/) {} # ignore e.g. "Foo* p;" in c++ - debatable
else if (isCpp && s ~ /\" in c++
else {
error(fname, FNR, "operator '" a[2] "' must be preceded by space");
}
}
match(s, /([]A-Za-z0-9() ] *)(+|-|\*|\^|\/|%|=|==|+=|-=|\*=|\/=|>=|<=|!=|&|&&|\||\|\||^|\?|:|,)[A-Za-z0-9(]/, a) {
if (!matchFile) {}
# else if (s ~ /<.*>/) {} # ignore templates
else if (a[2] == "-" && s ~ /(\(|return |case |= )-/) {} # ignore prefix -
else if (a[2] == ":" && s ~ /(case.*|default):$/) {} # ignore e.g. "case 5:"
else if (s ~ /, *-/) {} # ignore case "foo(x, -1)"
else if (s ~ /-[^ ]/ && s ~ /[^A-Za-z0-9] -/) {} # ignore case "x + -1" but not "x -1" or "3 -1"
else if (a[2] == "-" && s ~ /[eE][+-][0-9]/) {} # ignore e.g. 1e-5
else if (a[2] == "+" && s ~ /[eE][+-][0-9]/) {} # ignore e.g. 1e+5
else if (a[2] == "*" && isCpp && s ~ /\*[^ ]/) {} # ignore e.g. "Foo *p;" in c++
else if (a[2] == "&" && isCpp && s ~ /&[^ ]/) {} # ignore case "foo(&x)" in c++
else if (isCpp && s ~ /\" in c++
else if (strict < 2 && fname ~ /(fennel)/ && a[1] = ",") {} # not enabled yet
else {
error(fname, FNR, "operator '" a[2] "' must be followed by space");
}
}
match(s, /( )(,)/, a) {
# (, < and > are not handled here - they have special treatment below
if (!matchFile) {}
else {
error(fname, FNR, "operator '" a[2] "' must not be preceded by space");
}
}
match(s, / (+|-|\*|\/|==|>=|<=|!=|<<|<<<|>>|&|&&|\|\||\?|:)$/, a) || \
match(s, /(\.|->)$/, a) {
if (strict < 2 && fname ~ /(aspen)/ && a[1] != ":") {} # not enabled yet
else if (strict < 2 && fname ~ /(fennel|farrago|aspen)/ && a[1] = "+") {} # not enabled yet
else if (a[1] == ":" && s ~ /(case.*|default):$/) {
# ignore e.g. "case 5:"
} else if ((a[1] == "*" || a[1] == "&") && isCpp && s ~ /^[[:alnum:]:_ ]* [*&]$/) {
# ignore e.g. "const int *\nClass::Subclass2::method(int x)"
} else {
error(fname, FNR, "operator '" a[1] "' must not be at end of line");
}
}
match(s, /^ *(=) /, a) {
error(fname, FNR, "operator '" a[1] "' must not be at start of line");
}
match(s, /([[:alnum:]~]+)( )([(])/, a) {
# (, < and > are not handled here - they have special treatment below
if (!matchFile) {}
else if (isJava && a[1] ~ /\<(if|while|for|catch|switch|case|return|throw|synchronized|assert)\>/) {}
else if (isCpp && a[1] ~ /\<(if|while|for|catch|switch|case|return|throw|operator|void|PBuffer)\>/) {}
else if (isCpp && s ~ /^#define /) {}
else {
error(fname, FNR, "there must be no space before '" a[3] "' in fun call or fun decl");
}
}
s ~ /\<[[:digit:][:lower:]][[:alnum:]_]* {
# E.g. "p<" but not "Map<"
if (!matchFile) {}
else if (isCpp) {} # in C++ 'xyz<5>' could be a template
else {
error(fname, FNR, "operator '<' must be preceded by space");
}
}
s ~ /\<[[:digit:][:lower:]][[:alnum:]_]*>/ {
# E.g. "g>" but not "String>" as in "List"
if (!matchFile) {}
else if (isCpp) {} # in C++ 'xyz' could be a template
else {
error(fname, FNR, "operator '>' must be preceded by space");
}
}
match(s, /<([[:digit:][:lower:]][[:alnum:].]*)\>/, a) {
if (!matchFile) {}
else if (isCpp) {
# in C++, template and include generate too many false positives
} else if (isJava && a[1] ~ /(int|char|long|boolean|byte|double|float)/) {
# Allow e.g. 'List'
} else if (isJava && a[1] ~ /^[[:lower:]]+\./) {
# Allow e.g. 'List'
} else {
error(fname, FNR, "operator '<' must be followed by space");
}
}
match(s, /^(.*[^-])>([[:digit:][:lower:]][[:alnum:]]*)\>/, a) {
if (!matchFile) {}
else if (isJava && a[1] ~ /.*\.<.*/) {
# Ignore 'Collections.member'
} else {
error(fname, FNR, "operator '>' must be followed by space");
}
}
s ~ /[[(] / {
if (!matchFile) {}
else if (s ~ /[[(] +\\$/) {} # ignore '#define foo( \'
else {
error(fname, FNR, "( or [ must not be followed by space");
}
}
s ~ / [])]/ {
if (!matchFile) {}
else if (s ~ /^ *\)/ && previousLineEndedInCloseBrace) {} # ignore "bar(new Foo() { } );"
else {
error(fname, FNR, ") or ] must not be followed by space");
}
}
s ~ /}/ {
if (!matchFile) {}
else if (s !~ /}( |;|,|$|\)|\.)/) {
error(fname, FNR, "} must be followed by space");
} else if (s !~ /^ *}/) {
# not at start of line - ignore
} else if (!checkIndent(s)) {
error(fname, FNR, "} must be correctly indented");
}
}
$0 ~ /\* @param [A-Za-z0-9_]+$/ && strict > 1 {
error(fname, FNR, "Empty javadoc param");
}
$0 ~ /\* @return *$/ && strict > 1 {
error(fname, FNR, "Empty javadoc return");
}
s ~ /{/ {
if (!matchFile) {}
else if (s ~ /(\]\)?|=) *{/) {} # ignore e.g. "(int[]) {1, 2}" or "int[] x = {1, 2}"
else if (s ~ /\({/) {} # ignore e.g. @SuppressWarnings({"unchecked"})
else if (s ~ /{ *(\/\/|\/\*)/) {} # ignore e.g. "do { // a comment"
else if (s ~ / \{\}$/) {} # ignore e.g. "Constructor() {}"
else if (s ~ / },$/) {} # ignore e.g. "{ yada },"
else if (s ~ / };$/) {} # ignore e.g. "{ yada };"
else if (s ~ / \{\};$/) {} # ignore e.g. "template <> class Foo {};"
else if (s ~ / },? *\/\/.*$/) {} # ignore e.g. "{ yada }, // comment"
else if (s ~ /\\$/) {} # ignore multiline macros
else if (s ~ /{}/) { # e.g. "Constructor(){}"
error(fname, FNR, "{} must be preceded by space and at end of line");
} else if (isCpp && s ~ /{ *\\$/) {
# ignore - "{" can be followed by "\" in c macro
} else if (s !~ /{$/) {
error(fname, FNR, "{ must be at end of line");
} else if (s !~ /(^| ){/) {
error(fname, FNR, "{ must be preceded by space or at start of line");
} else {
opens = s;
gsub(/[^(]/, "", opens);
closes = s;
gsub(/[^)]/, "", closes);
if (0 && strict < 2 && fname ~ /aspen/) {} # not enabled
else if (length(closes) > length(opens) && indent == cindent) {
error(fname, FNR, "Open brace should be on new line (function call/decl spans several lines)");
}
}
}
s ~ /(^| )(class|interface|enum) / ||
s ~ /(^| )namespace / && isCpp {
if (isCpp && s ~ /;$/) {} # ignore type declaration
else {
classDeclStartLine = FNR;
t = s;
gsub(/.*(class|interface|enum|namespace) /, "", t);
gsub(/ .*$/, "", t);
if (s ~ /template/) {
# ignore case "template static void foo()"
classDeclStartLine = 0;
} else if (t ~ /[[:upper:]][[:upper:]][[:upper:]][[:upper:]]/ \
&& t !~ /LRU/ \
&& t !~ /WAL/ \
&& t !~ /classUUID/ \
&& t !~ /classSQLException/ \
&& t !~ /BBRC/ \
&& t !~ /_/ \
&& t !~ /EncodedSqlInterval/)
{
error(fname, FNR, "Class name " t " has consecutive uppercase letters");
}
}
}
s ~ / throws\>/ {
if (s ~ /\(/) {
funDeclStartLine = FNR;
} else {
funDeclStartLine = FNR - 1;
}
}
length($0) > maxLineLength \
&& $0 !~ /@(throws|see|link)/ \
&& $0 !~ /\$Id: / \
&& $0 !~ /^import / \
&& $0 !~ /http:/ \
&& $0 !~ /https:/ \
&& $0 !~ /\/\/ Expect "/ \
&& s !~ /^ *(\+ |<< |: |\?)?string\)*[;,]?$/ {
error( \
fname, \
FNR, \
"Line length (" length($0) ") exceeds " maxLineLength " chars");
}
/}$/ {
previousLineEndedInCloseBrace = 2;
}
/;$/ {
funDeclStartLine = 0;
}
/{$/ {
# Ignore open brace if it is part of class or interface declaration.
if (classDeclStartLine) {
if (classDeclStartLine < FNR \
&& $0 !~ /^ *{$/ \
&& indent == cindent)
{
error(fname, FNR, "Open brace should be on new line (class decl spans several lines)");
}
classDeclStartLine = 0;
} else {
previousLineEndedInOpenBrace = 2;
}
if (funDeclStartLine) {
if (funDeclStartLine < FNR \
&& $0 !~ /^ *{$/)
{
if (strict < 2 && fname ~ /aspen/) {} # not enabled
else if (cindent != indent) {}
else error(fname, FNR, "Open brace should be on new line (function decl spans several lines)");
}
funDeclStartLine = 0;
}
}
/^$/ {
previousLineWasEmpty = 2;
}
{
next;
}
END {
afterFile();
}
# End checkFile.awk
mondrian-3.11.0.1-R/bin/checkFile.sh 0000775 0000000 0000000 00000020535 12616465703 0016744 0 ustar 00root root 0000000 0000000 #!/bin/bash
#
# Checks that a file is valid.
# Used by perforce submit trigger, via runTrigger.
# The file is deemed to be valid if this command produces no output.
#
# Usage:
# checkFile [ --depotPath ]
#
# runTrigger uses first form, with a temporary file, e.g.
# checkFile --depotPath //depot/src/foo/Bar.java /tmp/foo.txt
#
# The second form is useful for checking files in the client before you
# try to submit them:
# checkFile src/foo/Bar.java
#
usage() {
echo "checkFile [ ] --depotPath "
echo " Checks a temporary file. depotPath is the full path of"
echo " the file stored in perforce, for error reporting; file"
echo " holds the actual file contents."
echo "checkFile [ ] ..."
echo " Checks a list of files."
echo "checkFile [ ] --opened"
echo " Checks all files that are opened in git. Implies --strict."
echo "checkFile [ ] --under "
echo " Recursively checks all files under a given directory."
echo "checkFile --help"
echo " Prints this help."
echo
echo "Options:"
echo "--lenient"
echo " Does not apply rules to components which are not known to"
echo " be in compliance. The perforce trigger uses this option."
echo "--strict"
echo " Stricter than usual; the opposite of lenient."
}
doCheck() {
filePath="$1"
file="$2"
maxLineLength="$3"
# CHECKFILE_IGNORE is an environment variable that contains a callback
# to decide whether to check this file. The command or function should
# succeed (that is, return 0) if checkFile is to ignore the file, fail
# (that is, return 1 or other non-zero value) otherwise.
if [ "$CHECKFILE_IGNORE" ]; then
if eval $CHECKFILE_IGNORE "$filePath"; then
return
fi
fi
# Exceptions for mondrian
case "$filePath" in
*/mondrian/util/Base64.java| \
*/mondrian/olap/MondrianDef.java| \
*/mondrian/gui/MondrianGuiDef.java| \
*/mondrian/xmla/DataSourcesConfig.java| \
*/mondrian/rolap/aggmatcher/DefaultDef.java| \
*/mondrian/resource/MondrianResource*.java| \
*/mondrian/olap/MondrianProperties.java| \
*/mondrian/olap/Parser.java| \
*/mondrian/olap/ParserSym.java| \
*/mondrian/parser/ParseException.java| \
*/mondrian/parser/Token.java| \
*/mondrian/parser/TokenMgrError.java| \
*/mondrian/parser/SimpleCharStream.java| \
*/mondrian/parser/MdxParserImplConstants.java| \
*/mondrian/parser/MdxParserImplTokenManager.java| \
*/mondrian/parser/MdxParserImpl.java)
# mondrian.util.Base64 is checked in as is, so don't check it
# Other files above are generated.
return
;;
# Exceptions for olap4j
*/org/olap4j/mdx/parser/impl/*.java| \
*/org/olap4j/impl/Base64.java)
return
;;
# Exceptions for farrago
*/farrago/classes/* | \
*/farrago/catalog/* | \
*/farrago/examples/rng/src/net/sf/farrago/rng/parserimpl/*.java | \
*/farrago/examples/rng/src/net/sf/farrago/rng/resource/FarragoRngResource*.java | \
*/farrago/examples/rng/catalog/net/sf/farrago/rng/rngmodel/* | \
*/farrago/examples/rng/catalog/java/* | \
*/farrago/jdbc4/*.java | \
*/farrago/src/net/sf/farrago/FarragoMetadataFactoryImpl.java | \
*/farrago/src/net/sf/farrago/FarragoMetadataFactory.java | \
*/farrago/src/net/sf/farrago/parser/impl/*.java | \
*/farrago/src/net/sf/farrago/resource/FarragoResource*.java | \
*/farrago/src/net/sf/farrago/resource/FarragoInternalQuery*.java | \
*/farrago/src/net/sf/farrago/test/FarragoSqlTestWrapper.java | \
*/farrago/src/org/eigenbase/jdbc4/*.java | \
*/farrago/src/org/eigenbase/lurql/parser/*.java | \
*/farrago/src/com/lucidera/lurql/parser/*.java | \
*/farrago/src/org/eigenbase/resource/EigenbaseResource*.java | \
*/farrago/src/org/eigenbase/sql/parser/impl/*.java)
return
;;
# Exceptions for fennel
*/fennel/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp | \
*/fennel/disruptivetech/calc/CalcGrammar.tab.cpp | \
*/fennel/disruptivetech/calc/CalcGrammar.cpp | \
*/fennel/disruptivetech/calc/CalcGrammar.h | \
*/fennel/disruptivetech/calc/CalcLexer.cpp | \
*/fennel/disruptivetech/calc/CalcLexer.h | \
*/fennel/calculator/CalcGrammar.tab.cpp | \
*/fennel/calculator/CalcGrammar.cpp | \
*/fennel/calculator/CalcGrammar.h | \
*/fennel/calculator/CalcLexer.cpp | \
*/fennel/calculator/CalcLexer.h | \
*/fennel/common/FemGeneratedEnums.h | \
*/fennel/common/FennelResource.cpp | \
*/fennel/common/FennelResource.h | \
*/fennel/config.h | \
*/fennel/farrago/FemGeneratedClasses.h | \
*/fennel/farrago/FemGeneratedMethods.h | \
*/fennel/farrago/NativeMethods.h)
return
;;
# Skip our own test files, unless we are testing.
*/util/test/CheckFile1.*)
if [ ! "$test" ]; then
return
fi
;;
# Only validate .java and parser files at present.
*.java|*.cup|*.h|*.cpp)
;;
*)
return
;;
esac
# Set maxLineLength if it is not already set. ('checkFile --opened'
# sets it to the strictest value, 80).
if [ ! "$maxLineLength" ]; then
maxLineLength=80
fi
# Check whether there are tabs, or lines end with spaces
# todo: check for ' ;'
# todo: check that every file has copyright/license header
# todo: check that every class has javadoc
# todo: check that every top-level class has @author and @version
# todo: check c++ files
if test "$deferred" ; then
echo "$file" >> "${deferred_file}"
else
gawk -f "$CHECKFILE_AWK" \
-v fname="$filePath" \
-v strict="$strict" \
-v maxLineLength="$maxLineLength" \
"$file"
fi
}
doCheckDeferred() {
if [ -s "${deferred_file}" ]; then
maxLineLength=80
cat "${deferred_file}" |
xargs -P $(expr ${CORE_COUNT} \* 2) -n 100 gawk -f "$CHECKFILE_AWK" \
-v strict="$strict" \
-v maxLineLength="$maxLineLength"
fi
rm -f "${deferred_file}"
}
function guessCoreCount() {
if [ -f /proc/cpuinfo ]; then
cat /proc/cpuinfo | awk '$1 == "processor"' | wc -l
else
# File doe not exist on Darwin or cygwin
echo 2
fi
}
export CORE_COUNT=$(guessCoreCount)
export deferred=true
# 'test' is an undocumented flag, overriding the default behavior which is
# to ignore our own test files
test=
if [ "$1" == --test ]; then
test=true
shift
fi
strict=1
if [ "$1" == --lenient ]; then
strict=0
shift
fi
if [ "$1" == --help ]; then
usage
exit 0
fi
if [ "$1" == --strict ]; then
strict=2
shift
fi
depotPath=
if [ "$1" == --depotPath ]; then
depotPath="$2"
deferred=
shift 2
fi
opened=
if [ "$1" == --opened ]; then
opened=true
deferred=
strict=2
shift
fi
under=
if [ "$1" == --under ]; then
if [ "$opened" ]; then
echo "Cannot specify both --under and --opened"
exit 1
fi
if [ ! -d "$2" ]; then
echo "--under requires a directory; '$2' not found"
exit 1
fi
under="$2"
shift 2
fi
if [ "$1" == --opened ]; then
echo "Cannot specify both --under and --opened"
exit 1
fi
if [ ! -f "$CHECKFILE_AWK" ]
then
case $(uname) in
(Darwin)
export CHECKFILE_AWK="$(cd $(dirname $0); pwd -P)/checkFile.awk";;
(*)
export CHECKFILE_AWK="$(dirname $(readlink -f $0))/checkFile.awk";;
esac
fi
export deferred_file=/tmp/checkFile_deferred_$$.txt
rm -f "${deferred_file}"
(
if [ "$under" ]; then
find "$under" -type f |
while read file; do
filePath="$file"
if [ "$depotPath" ]; then
filePath="$depotPath"
fi
doCheck "$filePath" "$file" ""
done
elif [ "$opened" ]; then
git checkout |
gawk '$1 != "D" {print $2}' |
while read file; do
doCheck "$file" "$file" "80"
done
else
for file in "$@"; do
filePath="$file"
if [ "$depotPath" ]; then
filePath="$depotPath"
fi
doCheck "$filePath" "$file" ""
done
fi
if test "$deferred"; then
doCheckDeferred
fi
) | tee /tmp/checkFile_output_$$.txt
status=0
if [ -s /tmp/checkFile_output_$$.txt ]; then
status=1
fi
rm -f /tmp/checkFile_output_$$.txt
exit $status
# End checkFile
mondrian-3.11.0.1-R/bin/cmdrunner.cmd 0000664 0000000 0000000 00000000337 12616465703 0017210 0 ustar 00root root 0000000 0000000 @echo off
rem
rem
rem cmdrunner.cmd
rem
rem Must set location of the cmdrunner.jar
rem
rem $Id: $
rem
set JAVA_COMMAND=%JAVA_HOME%\bin\java
set CMD_RUNNER_JAR=..\lib\cmdrunner.jar
%JAVA_COMMAND% -jar %CMD_RUNNER_JAR% %*
mondrian-3.11.0.1-R/bin/cmdrunner.sh 0000775 0000000 0000000 00000001217 12616465703 0017060 0 ustar 00root root 0000000 0000000 #!/bin/bash
# do not use ksh, use bash
#####################################################################
#
# cmdrunner.sh
#
# Must set location of the cmdrunner.jar
#
# $Id$
#####################################################################
declare -r DIR=$(dirname $0)
#
# attempt to find jar
#
if [[ -e "$DIR"/../lib/cmdrunner.jar ]] ; then
CMD_RUNNER_JAR="$DIR"/../lib/cmdrunner.jar
elif [[ -e "$DIR"/lib/cmdrunner.jar ]] ; then
CMD_RUNNER_JAR="$DIR"/lib/cmdrunner.jar
elif [[ -e ./cmdrunner.jar ]] ; then
CMD_RUNNER_JAR=./cmdrunner.jar
else
echo "Can not locate cmdrunner.jar"
exit 1
fi
java -jar "$CMD_RUNNER_JAR" "$@"
mondrian-3.11.0.1-R/bin/loadFoodMart.sh 0000775 0000000 0000000 00000022661 12616465703 0017444 0 ustar 00root root 0000000 0000000 #!/bin/bash
#
# This software is subject to the terms of the Eclipse Public License v1.0
# Agreement, available at the following URL:
# http://www.eclipse.org/legal/epl-v10.html.
# You must accept the terms of that agreement to use this software.
#
# Copyright (C) 2008-2012 Pentaho and others
# All Rights Reserved.
#
# Sample scripts to load Mondrian's database for various databases.
case $(uname) in
Linux|Darwin) PS=: ;;
*) PS=\; ;;
esac
outputQuoted=true
export CP="lib/mondrian.jar"
export CP="${CP}${PS}lib/olap4j.jar"
export CP="${CP}${PS}lib/log4j.jar"
export CP="${CP}${PS}lib/commons-logging.jar"
export CP="${CP}${PS}lib/eigenbase-properties.jar"
export CP="${CP}${PS}lib/eigenbase-xom.jar"
export CP="${CP}${PS}lib/eigenbase-resgen.jar"
usage() {
echo "Usage: loadFoodMart.sh [ --help | --db ]"
echo
echo "Populate FoodMart database, calling the MondrianFoodMartLoader"
echo "program with a typical set of arguments. This script does not aim to"
echo "be 100% customizable from the command line; you will almost certainly"
echo "have to edit it with the URL and options of your database. But for"
echo "each database engine, the command given here will be reasonably"
echo "close to what you need."
echo
echo "Options:"
echo " --help Prints this help"
echo " --db Loads into target database, where is"
echo " one of: ${dbs}"
}
error() {
echo "Error: $1"
echo
usage
}
oracle() {
# Assume ORACLE_HOME is set, e.g.:
# export ORACLE_HOME=G:/oracle/product/10.1.0/Db_1
# For JDBC driver, try 'ojdbc6.jar' on JDK1.6;
# try 'ojdbc5.jar' on JDK1.5;
# try 'ojdbc14.jar' on JDK1.4 or Oracle 10 and earlier.
java -cp "${CP}${PS}${ORACLE_HOME}/jdbc/lib/ojdbc6.jar" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -aggregates -tables -data -indexes \
-jdbcDrivers=oracle.jdbc.OracleDriver \
-inputFile=demo/FoodMartCreateData.sql \
-outputJdbcURL="jdbc:oracle:thin:foodmart/foodmart@//localhost:1521/XE"
}
# Load into Oracle, creating dimension tables first, then trickling data into
# fact tables.
oracleTrickle() {
java -cp "${CP}${PS}${ORACLE_HOME}/jdbc/lib/ojdbc6.jar" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -tables -indexes -data -exclude=sales_fact_1997 \
-jdbcDrivers=oracle.jdbc.OracleDriver \
-inputJdbcURL="jdbc:oracle:thin:foodmart/foodmart@//localhost:1521/XE" \
-outputJdbcURL="jdbc:oracle:thin:slurpmart/slurpmart@//localhost:1521/XE"
# Write 10 rows each second into the sales fact table.
java -cp "${CP}${PS}${ORACLE_HOME}/jdbc/lib/ojdbc6.jar" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -tables -indexes -data -pauseMillis=100 -include=sales_fact_1997 \
-jdbcDrivers=oracle.jdbc.OracleDriver \
-inputJdbcURL="jdbc:oracle:thin:foodmart/foodmart@//localhost:1521/XE" \
-outputJdbcBatchSize=100 \
-outputJdbcURL="jdbc:oracle:thin:slurpmart/slurpmart@//localhost:1521/XE"
}
mysql() {
java -cp "${CP}${PS}/usr/local/mysql-connector-java-3.1.12/mysql-connector-java-3.1.12-bin.jar" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -aggregates -tables -data -indexes \
-jdbcDrivers=com.mysql.jdbc.Driver \
-inputFile=demo/FoodMartCreateData.sql \
-outputJdbcURL="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart"
}
nuodb() {
java -cp "${CP}${PS}/opt/nuodb/jar/nuodbjdbc.jar" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -aggregates -tables -data -indexes \
-jdbcDrivers=com.nuodb.jdbc.Driver \
-inputFile=demo/FoodMartCreateData.sql \
-outputJdbcURL="jdbc:com.nuodb://localhost/foodmart?schema=mondrian" \
-outputJdbcUser=foodmart \
-outputJdbcPassword=foodmart
}
infobright() {
# As mysql, but '-indexes' option removed because infobright doesn't support them.
java -cp "${CP}${PS}/usr/local/mysql-connector-java-3.1.12/mysql-connector-java-3.1.12-bin.jar" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -aggregates -tables -data \
-jdbcDrivers=com.mysql.jdbc.Driver \
-inputFile=demo/FoodMartCreateData.sql \
-outputJdbcURL="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart&characterEncoding=UTF-8"
}
# Load PostgreSQL.
#
# To install postgres and its JDBC driver on ubuntu:
# $ sudo apt-get install postgresql libpg-java
# Then change postgres password, create a user and database:
# $ sudo -u postgres psql postgres
# # ALTER USER postgres WITH ENCRYPTED PASSWORD '';
# # \q
# $ sudo -u postgres createuser -D -A -P foodmart
# $ sudo -u postgres createdb -O foodmart foodmart
postgresql() {
java -verbose -cp "${CP}${PS}/usr/share/java/postgresql.jar" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -tables -data -indexes \
-jdbcDrivers="org.postgresql.Driver" \
-inputFile=demo/FoodMartCreateData.sql \
-outputJdbcURL="jdbc:postgresql://localhost/foodmart" \
-outputJdbcUser=foodmart \
-outputJdbcPassword=foodmart
}
# Load farrago (a LucidDB variant)
farrago() {
java -cp "${CP}${PS}../farrago/classes" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -aggregates -tables -data -indexes \
-jdbcDrivers=net.sf.farrago.client.FarragoVjdbcClientDriver \
-inputFile=demo/FoodMartCreateData.sql \
-outputJdbcURL="jdbc:farrago:rmi://localhost"
}
# Load LucidDB
#
# Install LucidDB per instructions at
# http://pub.eigenbase.org/wiki/LucidDbGettingStarted, start sqlline, then run
# the following:
#
# jdbc:luciddb:http://localhost> create schema foodmart;
# jdbc:luciddb:http://localhost> create user "foodmart" identified by 'foodmart';
# jdbc:luciddb:http://localhost> grant execute on specific procedure
# > applib.estimate_statistics_for_schema_no_samplingrate
# > to "foodmart";
luciddb() {
export LUCIDDB_HOME=/usr/local/luciddb
java -cp "${CP}${PS}${LUCIDDB_HOME}/plugin/LucidDbClient.jar" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -aggregates -tables -data -indexes -analyze \
-jdbcDrivers=org.luciddb.jdbc.LucidDbClientDriver \
-inputFile=demo/FoodMartCreateData.sql \
-outputJdbcURL="jdbc:luciddb:http://localhost;schema=FOODMART" \
-outputJdbcUser="foodmart" \
-outputJdbcPassword="foodmart"
}
# Load monetdb
#
# 1. Build from source (because required patches are not in a release
# yet).
#
# sudo apt-get install libssl-dev pkg-config libpcre* libxml2-dev
# curl -O http://monetdb.cwi.nl/testweb/web/45868:949c8b8db28d/MonetDB-11.13.4.tar.bz2
# tar xvfj MonetDB-11.13.4.tar.bz2
# cd MonetDB-11.13.4
# ./configure
# make
# sudo make install
#
# 2. Create and start database.
#
# sudo mkdir /var/local/monetdb
# sudo chown ${USER} /var/local/monetdb
# monetdbd create /var/local/monetdb
# monetdbd start /var/local/monetdb
# monetdb create foodmart
# monetdb start foodmart
# monetdb release foodmart
monetdb() {
java -ea -esa -cp "${CP}${PS}lib/monetdb-jdbc.jar" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -tables -data -indexes \
-dataset=${dataset} \
-jdbcDrivers=nl.cwi.monetdb.jdbc.MonetDriver \
-inputFile="$inputFile" \
-afterFile="$afterFile" \
-outputQuoted=${outputQuoted} \
-outputJdbcBatchSize=1000 \
-outputJdbcURL="jdbc:monetdb://localhost/${dataset}" \
-outputJdbcUser="monetdb" \
-outputJdbcPassword="monetdb"
}
# Load Teradata.
# You'll have to download drivers and put them into the drivers folder.
# Note that we do not use '-aggregates'; we plan to use aggregate
# join indexes instead of explicit aggregate tables.
teradata() {
java -cp "${CP}${PS}drivers/terajdbc4.jar${PS}drivers/tdgssjava.jar${PS}drivers/tdgssconfig.jar" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -tables -data -indexes \
-jdbcDrivers=com.ncr.teradata.TeraDriver \
-inputFile=demo/FoodMartCreateData.sql \
-outputJdbcURL="jdbc:teradata://localhost/foodmart" \
-outputJdbcUser="tduser" \
-outputJdbcPassword="tduser"
}
# Load Hsqldb.
hsqldb() {
rm -rf demo/hsqldb/foodmart.*
java -Xmx512M -ea -esa -cp "${CP}${PS}lib/hsqldb.jar" \
mondrian.test.loader.MondrianFoodMartLoader \
-verbose -tables -data -indexes \
-jdbcDrivers=org.hsqldb.jdbcDriver \
-inputFile=demo/FoodMartCreateData.sql \
-outputJdbcBatchSize=1 \
-outputJdbcURL="jdbc:hsqldb:file:demo/hsqldb/foodmart" \
-outputJdbcUser="sa" \
-outputJdbcPassword=""
}
dbs="\
farrago \
hsqldb \
infobright \
luciddb \
monetdb \
mysql \
nuodb \
oracle \
oracleTrickle \
postgresql \
teradata \
"
db=
while [ $# -gt 0 ]; do
case "$1" in
(--help) usage; exit 0;;
(--db) shift; db="$1"; shift;;
(*) error "Unknown argument '$1'"; exit 1;;
esac
done
cd $(dirname $0)/..
case "$db" in
('') error "You must specify a database."; exit 1;;
(farrago) farrago;;
(hsqldb) hsqldb;;
(infobright) infobright;;
(luciddb) luciddb;;
(monetdb) monetdb;;
(mysql) mysql;;
(nuodb) nuodb;;
(oracle) oracle;;
(oracleTrickle) oracleTrickle;;
(postgresql) postgresql;;
(teradata) teradata;;
(*) error "Unknown database '$db'."; exit 1;;
esac
# End loadFoodMart.sh
mondrian-3.11.0.1-R/bin/megatest 0000775 0000000 0000000 00000075334 12616465703 0016276 0 ustar 00root root 0000000 0000000 #!/bin/bash
#
# This software is subject to the terms of the Eclipse Public License v1.0
# Agreement, available at the following URL:
# http://www.eclipse.org/legal/epl-v10.html.
# You must accept the terms of that agreement to use this software.
#
# Copyright (C) 2006-2012 Pentaho
# All Rights Reserved.
#
# Script to run the Mondrian test suite under various JDKs, with parameter
# settings, against various RDBMSes. Customize it with your environment -
# whatever JDKs, DBMSes and drivers you have. The script makes lots of
# assumptions about your environment, but you can figure these out by reading
# the code.
#
# This is for mondrian developers & QA. It is not intended to run in a
# release environment.
#ANT_FLAGS=-Dskip.download=true
ANT_FLAGS=
CLEAN=clean
#CLEAN=
# The script's path is $OPEN_DIR/mondrian/bin/megatest; deduce OPEN_DIR.
OPEN_DIR=$(cd $(dirname $0)/../..; pwd)
MONDRIAN_DIR=$(cd $(dirname $0)/..; pwd)
hostname=$(uname -n | cut -d . -f 1)
cygwin=
case $(uname) in
CYGWIN*)
OPEN_DIR=$(cygpath -m $OPEN_DIR)
MONDRIAN_DIR=$(cygpath -m $MONDRIAN_DIR)
cygwin=true
if [ ${hostname} = mackerel-winxp \
-a "$OPEN_DIR" = "e:/open" ]; then
OPEN_DIR=/open
MONDRIAN_DIR=/open/mondrian
echo $OPEN_DIR
fi
;;
esac
# Special cases.
case ${hostname} in
mackerel) if [ ! "$cygwin" ]; then hostname=mackerel-linux; fi ;;
esac
case ${hostname} in
branston)
databaseList="access derby hsqldb mysql oracle"
jdkList="jdk1.5 jdk1.6"
;;
mackerel)
databaseList="access derby hsqldb"
jdkList="jdk1.4 jdk1.5 jdk1.6"
;;
mackerel-linux)
databaseList="derby hsqldb"
jdkList="jdk1.4 jdk1.5 jdk1.6"
;;
mackerel-winxp)
databaseList="access derby hsqldb teradata"
jdkList="jdk1.4 jdk1.5 jdk1.6"
;;
marmalade)
databaseList="derby hsqldb mysql oracle luciddb postgresql"
jdkList="jdk1.4 jdk1.5 jdk1.6 openjdk1.6"
;;
marmite)
databaseList="derby hsqldb monetdb mysql oracle"
jdkList="jdk1.4 jdk1.5 jdk1.6 jdk1.7 openjdk1.6 openjdk1.7 ibmjdk1.6"
;;
ATRHisv1)
databaseList="hsqldb neoview"
jdkList="jdk1.6"
;;
plank)
databaseList="derby mysql hsqldb"
jdkList="jdk1.4 jdk1.5 jdk1.6 openjdk1.6"
;;
*)
databaseList="derby hsqldb mysql oracle"
jdkList="jdk1.4 jdk1.5 jdk1.6"
;;
esac
case $(uname) in
CYGWIN*)
export PS=';'
;;
*)
export PS=':'
;;
esac
# Macros to allow groups of properties to be set at once.
export ENABLE_NATIVE="\
mondrian.native.crossjoin.enable=true \
mondrian.native.topcount.enable=true \
mondrian.native.filter.enable=true \
mondrian.native.nonempty.enable=true"
export DISABLE_NATIVE="\
mondrian.native.crossjoin.enable=false \
mondrian.native.topcount.enable=false \
mondrian.native.filter.enable=false \
mondrian.native.nonempty.enable=false"
export ENABLE_AGGS="\
mondrian.rolap.aggregates.Use=true \
mondrian.rolap.aggregates.Read=true"
export DISABLE_AGGS="\
mondrian.rolap.aggregates.Use=false \
mondrian.rolap.aggregates.Read=false"
export ENABLE_GSETS="\
mondrian.rolap.groupingsets.enable=true"
export ENABLE_CMCACHE="\
mondrian.rolap.EnableRolapCubeMemberCache=true"
export ENABLE_SSAS="\
mondrian.olap.SsasCompatibleNaming=true"
export DISBLE_SSAS="\
mondrian.olap.SsasCompatibleNaming=false"
doTest() {
if [ -f test.properties ]; then
mv test.properties test.properties.bak
fi
if [ -f mondrian.properties ]; then
mv mondrian.properties mondrian.properties.bak
fi
doTest2 "$@"
mv test.properties.bak test.properties
mv mondrian.properties.bak mondrian.properties
}
doTest2() {
olap4j=
mondrian=true
if [ "$1" = --mondrian ]; then
mondrian=true
shift
fi
if [ "$1" = --nomondrian ]; then
mondrian=
shift
fi
if [ "$1" = --olap4j ]; then
olap4j=true
shift
fi
if [ "$1" = --noolap4j ]; then
olap4j=
shift
fi
retroweave=
if [ "$1" = --retroweave ]; then
retroweave=true
shift
fi
jdk=$1
database=$2
# If the database does not exist, silently skip this test.
database=$2
if echo "$databaseList" | grep -s "$database"; then
echo "database $database ok"
else
echo "database $database not ok"
return
fi
JAVA_HOME=$(chooseJavaHome $jdk)
# Use a version of ant (and in particular junit) compatible with the JDK.
# Some versions of ant don't work on JDK1.4.
export ANT_HOME=$(chooseAntHome $jdk)
rm -f megatest.properties
case $database in
access)
(
jdbcURL=jdbc:odbc:MondrianFoodMart
jdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver
echo mondrian.foodmart.jdbcURL=${jdbcURL}
echo mondrian.jdbcDrivers=${jdbcDrivers}
echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=foodmart;JdbcPassword=foodmart;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';"
) >> megatest.properties
;;
hsqldb)
(
jdbcURL=jdbc:hsqldb:file:demo/hsqldb/foodmart
jdbcDrivers=org.hsqldb.jdbcDriver
echo driver.classpath=lib/hsqldb.jar
echo mondrian.foodmart.jdbcURL=${jdbcURL}
echo mondrian.jdbcDrivers=${jdbcDrivers}
echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=sa;JdbcPassword=;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';"
) >> megatest.properties
;;
luciddb)
(
export LUCIDDB_HOME=/usr/local/luciddb-0.9.2
jdbcURL="jdbc:luciddb:http://localhost;schema=FOODMART"
jdbcDrivers=org.luciddb.jdbc.LucidDbClientDriver
echo driver.classpath=${LUCIDDB_HOME}/plugin/LucidDbClient.jar
echo mondrian.foodmart.jdbcURL=${jdbcURL}
echo mondrian.jdbcDrivers=${jdbcDrivers}
echo "mondrian.test.connectString=Provider=mondrian;Jdbc='${jdbcURL}';JdbcUser=foodmart;JdbcPassword=foodmart;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';"
) >> megatest.properties
;;
monetdb)
(
jdbcURL="jdbc:monetdb://localhost/FOODMART"
jdbcDrivers=nl.cwi.monetdb.jdbc.MonetDriver
echo driver.classpath=lib/monetdb-jdbc.jar
echo mondrian.foodmart.jdbcURL=${jdbcURL}
echo mondrian.jdbcDrivers=${jdbcDrivers}
echo "mondrian.test.connectString=Provider=mondrian;Jdbc='${jdbcURL}';JdbcUser=monetdb;JdbcPassword=monetdb;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';"
) >> megatest.properties
;;
neoview)
(
jdbcURL='jdbc:hpt4jdbc://${NEOVIEW_HOST_PORT}/:schema=PENTAHO;serverDataSource=PENTAHO_DataSource'
jdbcUser=${NEOVIEW_USER}
jdbcPassword=${NEOVIEW_PASSWORD}
jdbcDrivers=com.hp.t4jdbc.HPT4Driver
echo driver.classpath=${HOME}/dl/hpt4jdbc.jar
echo mondrian.foodmart.jdbcURL=${jdbcURL}
echo mondrian.jdbcDrivers=${jdbcDrivers}
echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=${NEOVIEW_USER};JdbcPassword=${NEOVIEW_PASSWORD};Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';"
) >> megatest.properties
;;
oracle)
(
#export ORACLE_HOME=G:/oracle/product/10.1.0/Db_1
driver="$(chooseOracleDriver $jdk)"
if [ ! -f "$driver" ]; then
echo "Oracle JDBC driver not found"
exit 1
fi
jdbcURL=jdbc:oracle:thin:foodmart/foodmart@//$(uname -n):1521/XE
jdbcDrivers=oracle.jdbc.OracleDriver
echo driver.classpath=${driver}
echo mondrian.foodmart.jdbcURL=${jdbcURL}
echo mondrian.jdbcDrivers=${jdbcDrivers}
echo mondrian.foodmart.jdbcUser=foodmart
echo mondrian.foodmart.jdbcPassword=foodmart
echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=foodmart;JdbcPassword=foodmart;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';"
) >> megatest.properties
;;
derby)
(
jdbcDrivers=org.apache.derby.jdbc.EmbeddedDriver
jdbcURL=jdbc:derby:${MONDRIAN_DIR}/demo/derby/foodmart
# jdbcURL=jdbc:derby:jar:\(demo/derby/derby-foodmart.zip\)/foodmart
echo mondrian.foodmart.jdbcURL=${jdbcURL}
echo mondrian.jdbcDrivers=${jdbcDrivers}
echo driver.classpath=${MONDRIAN_DIR}/testlib/derby.jar
echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=sa;JdbcPassword=sa;PoolNeeded=false;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';"
) >> megatest.properties
;;
mysql)
(
jdbcDrivers=com.mysql.jdbc.Driver
export jdbcURL='jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart&characterEncoding=latin1'
echo mondrian.foodmart.jdbcURL=${jdbcURL}
echo mondrian.jdbcDrivers=${jdbcDrivers}
echo driver.classpath=/usr/local/mysql-connector-java-3.1.12/mysql-connector-java-3.1.12-bin.jar
echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=foodmart;JdbcPassword=foodmart;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';"
) >> megatest.properties
;;
postgresql)
(
jdbcDrivers=org.postgresql.Driver
export jdbcURL='jdbc:postgresql://localhost/foodmart?user=foodmart&password=foodmart'
echo mondrian.foodmart.jdbcURL=${jdbcURL}
echo mondrian.jdbcDrivers=${jdbcDrivers}
echo driver.classpath=/usr/share/java/postgresql.jar
echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=foodmart;JdbcPassword=foodmart;Catalog=${OPEN_DIR}/mondrian/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';"
) >> megatest.properties
;;
teradata)
(
jdbcDrivers=com.ncr.teradata.TeraDriver
export jdbcURL='jdbc:teradata://localhost/foodmart'
echo mondrian.foodmart.jdbcURL=${jdbcURL}
echo mondrian.jdbcDrivers=${jdbcDrivers}
echo "driver.classpath=${MONDRIAN_DIR}/drivers/terajdbc4.jar${PS}${MONDRIAN_DIR}/drivers/tdgssjava.jar${PS}${MONDRIAN_DIR}/drivers/tdgssconfig.jar"
echo "mondrian.test.connectString=Provider=mondrian;Jdbc=${jdbcURL};JdbcUser=tduser;JdbcPassword=tduser;Catalog=${MONDRIAN_DIR}/demo/FoodMart.xml;JdbcDrivers=${jdbcDrivers};RoleXX='California manager';"
) >> megatest.properties
;;
*) echo "Unknown database $database"; exit 1 ;;
esac
shift
shift
if [ "$1" = -server ]; then
shift
fi
props=
for i in $*; do
echo "$i" >> megatest.properties
props="$props $i"
case "$i" in
mondrian.test.ExpDependencies=*)
# Expression dependencies requires greater eval depth than the default 3.
echo "mondrian.rolap.evaluate.MaxEvalDepth=6" >> megatest.properties
props="$props mondrian.rolap.evaluate.MaxEvalDepth=6"
;;
esac
done
cat megatest.properties >> test.properties
cat megatest.properties >> mondrian.properties
case $jdk in
(jdk1.4) retroweave=true ;;
esac
echo
echo "========================================"
date
echo "Running test with JDK=$jdk retroweave=$retroweave database=$database props={$props}"
if [ "$build" ]; then
echo build=${build}
if [ "$retroweave" ]; then
case $jdk in
jdk1.4)
# Cannot build or retroweave under 1.4, so switch JDK briefly
(
export JAVA_HOME=$(chooseJavaHome jdk1.5)
export PATH="$JAVA_HOME/bin:$PATH"
export ANT_HOME=$(chooseAntHome jdk1.5)
$ANT_HOME/bin/ant $ANT_FLAGS ${CLEAN} all retroweave
)
export JAVA_HOME=$(chooseJavaHome jdk1.4)
export PATH=$JAVA_HOME/bin:$PATH
;;
*)
$ANT_HOME/bin/ant $ANT_FLAGS ${CLEAN} all retroweave
;;
esac
if [ "$mondrian" ]; then
$ANT_HOME/bin/ant $ANT_FLAGS -Dmondrian.retroweave=true test-nobuild
fi
else
export ANT_HOME=$(chooseAntHome $jdk)
if [ "$mondrian" ]; then
TEST_TARGET=test-nobuild
else
TEST_TARGET=
fi
case $database in
(derby|access)
$ANT_HOME/bin/ant $ANT_FLAGS ${CLEAN} compile compile.tests unzip-databases ${TEST_TARGET}
;;
(*)
$ANT_HOME/bin/ant $ANT_FLAGS ${CLEAN} compile compile.tests ${TEST_TARGET}
;;
esac
fi
fi
if [ "$olap4j" ]; then
(olap4j $jdk mondrian NONE)
(olap4j $jdk xmla NONE)
(olap4j $jdk mondrian DBCP)
(olap4j $jdk xmla DBCP)
fi
}
# Echoes a value for ANT_HOME consistent with the JDK.
# JDK 1.4 can't run modern versions of ant (because junit requires annotations)
# but retroweaver cannot run on old versions of ant.
chooseAntHome() {
jdk=$1
case $jdk in
jdk1.4)
case $(uname -o) in
Cygwin)
echo $(cd ${OPEN_DIR}/thirdparty/ant; pwd)
;;
*)
echo $(cd /usr/local/apache-ant-1.6.0; pwd)
esac
;;
jdk1.5|jdk1.6|jdk1.7|openjdk1.6|openjdk1.7|ibmjdk1.6)
case $(uname -n) in
(plank.disruptivetech.com)
echo /home/jhyde/open/thirdparty/ant;;
*)
echo $(cd ${OPEN_DIR}/thirdparty/ant; pwd);;
esac
;;
esac
}
# Returns the path of a JAVA_HOME for a given JDK version.
chooseJavaHome() {
jdk=$1
case ${hostname} in
(mackerel)
case $jdk in
(jdk1.4) echo /c/j2sdk1.4.2_16 ;;
(jdk1.5) echo /c/jdk1.5.0_14 ;;
(jdk1.6) echo /c/jdk1.6.0_11 ;;
(*) echo "Unknown java version $jdk"; exit 1 ;;
esac;;
(branston)
case $jdk in
(jdk1.5) echo /e/jdk1.5.0_08 ;;
(jdk1.6) echo /c/jdk1.6.0_01 ;;
(*) echo "Unknown java version $jdk"; exit 1 ;;
esac;;
(mackerel-winxp)
case $jdk in
(jdk1.4) echo /e/j2sdk1.4.2_16 ;;
(jdk1.5) echo /e/jdk1.5.0_14 ;;
(jdk1.6) echo /e/jdk1.6.0_06 ;;
(*) echo "Unknown java version $jdk"; exit 1 ;;
esac;;
(*)
if [ -d /usr/lib/jvm/$jdk ]; then
echo /usr/lib/jvm/$jdk
elif [ -d /usr/local/$jdk ]; then
echo /usr/local/$jdk
else
echo "Unknown java version $jdk"
exit 1
fi
esac
}
# Returns a path of an Oracle JDBC driver for a given JDK.
# E.g. "/u01/app/oracle/product/11.2.0/jdbc/lib/ojdbc6.jar"
chooseOracleDriver()
{
for b in "$ORACLE_HOME/jdbc/lib" testlib; do
case "$jdk" in
(jdk1.6|openjdk1.6|ibmjdk1.6)
files="ojdbc6.jar ojdbc5.jar ojdbc14.jar";;
(jdk1.5)
files="ojdbc5.jar ojdbc14.jar";;
(jdk1.4|*)
files="ojdbc14.jar";;
esac
for f in $files; do
if [ -f "$b/$f" ]; then
echo "$b/$f"
return
fi
done
done
}
olap4j() {
jdk=$1
driver=$2
wrapper=$3
echo
echo "========================================"
date
echo "Running olap4j test with JDK=$jdk driver=$driver wrapper=$wrapper"
CONNECT_STRING=$(
awk '
/^mondrian.test.connectString=/ {
print substr($0, length("mondrian.test.connectString=Provider=mondrian;") + 1)
} ' megatest.properties)
DRIVER_CLASSPATH=$(
awk '
/^driver.classpath=/ {
print substr($0, length("driver.classpath=") + 1)
} ' megatest.properties)
cd ../olap4j
case $(uname) in
(Cygwin*) FILE_PREFIX=file:/ ;;
(*) FILE_PREFIX=file: ;;
esac
export ANT_HOME=$(chooseAntHome $jdk)
$ANT_HOME/bin/ant clean
case $driver in
(mondrian)
echo "org.olap4j.test.connectUrl=jdbc:mondrian:${CONNECT_STRING}"
echo 'org.olap4j.test.helperClassName=org.olap4j.MondrianTester'
echo "org.olap4j.test.driverClasspath=${DRIVER_CLASSPATH}"
echo "org.olap4j.test.wrapper=${wrapper}"
;;
(xmla)
echo "org.olap4j.test.connectUrl=jdbc:mondrian:${CONNECT_STRING}"
echo 'org.olap4j.test.helperClassName=org.olap4j.XmlaTester'
echo "org.olap4j.XmlaTester.CatalogUrl=${FILE_PREFIX}${MONDRIAN_DIR}/demo/FoodMart.xml"
echo "org.olap4j.test.driverClasspath=${DRIVER_CLASSPATH}"
echo "org.olap4j.test.wrapper=${wrapper}"
;;
esac > test.properties
case $jdk in
(jdk1.4)
# Cannot build or retroweave under 1.4, so switch JDK briefly
(
export JAVA_HOME=$(chooseJavaHome jdk1.5)
export PATH="$JAVA_HOME/bin:$PATH"
export ANT_HOME=$(chooseAntHome jdk1.5)
$ANT_HOME/bin/ant $ANT_FLAGS all retroweave
)
export JAVA_HOME=$(chooseJavaHome jdk1.4)
export PATH=$JAVA_HOME/bin:$PATH
$ANT_HOME/bin/ant test-nobuild
;;
(*)
$ANT_HOME/bin/ant $ANT_FLAGS test
;;
esac
# Javadoc only runs clean under jdk16 or jdk17, because it depends
# on JDBC 4.0 or later.
case "$jdk" in
(jdk1.6|openjdk1.6|jdk1.7|openjdk1.7|ibmjdk1.6) ant javadoc ;;
esac
}
doLotsOfTests() {
for agg in true false; do
for vusers in 1 5; do
for jdk in $jdkList; do
for database in $databaseList; do
for groupingSets in true false; do
if [ "$nightly" -a $vusers -gt 1 ]; then
continue
fi
# It's a waste of effort to run with grouping sets both true and
# false if db does not support it.
if [ "$groupingSets" = false ] ; then
case "$database" in
(access|mysql|derby) continue;;
esac
fi
doTest $jdk $database \
mondrian.test.VUsers=$vusers \
mondrian.rolap.groupingsets.enable=$agg \
mondrian.rolap.aggregates.Use=$agg \
mondrian.rolap.aggregates.Read=$agg
done
done
done
done
done
}
doExoticTests() {
# Test exp dependencies
doTest jdk1.5 oracle \
mondrian.test.ExpDependencies=10 \
mondrian.test.random.seed=-1 \
mondrian.expCache.enable=false
rand=$(echo x|awk '{print int(rand() * 65536)}')
doTest jdk1.5 oracle \
mondrian.test.ExpDependencies=100 \
mondrian.test.random.seed=${rand} \
mondrian.expCache.enable=false
# Test with exp cache disabled
doTest jdk1.5 oracle mondrian.expCache.enable=false
# Test with aggs enabled
doTest jdk1.5 oracle \
mondrian.rolap.aggregates.Use=true \
mondrian.rolap.aggregates.Read=true
# Test with aggregate cache disabled
doTest jdk1.6 oracle mondrian.rolap.star.disableCaching=true
# Test case-insensitive
doTest jdk1.6 oracle mondrian.olap.case.sensitive=false
# Test with cache of RolapCubeMembers disabled.
doTest jdk1.6 oracle mondrian.rolap.EnableRolapCubeMemberCache=false
# Retroweave against jdk1.5 and jdk1.6
doTest --retroweave jdk1.5 oracle
doTest --retroweave jdk1.6 oracle
# Configurations which have surfaced bugs
echo "This test caused a bug"
doTest jdk1.6 mysql \
mondrian.native.crossjoin.enable=false \
mondrian.native.topcount.enable=false \
mondrian.xmla.drillthroughTotalCount.enable=false \
mondrian.rolap.LargeDimensionThreshold=1
echo "This test caused a bug with testDescendantsXxx"
doTest jdk1.6 oracle \
mondrian.rolap.aggregates.Use=true \
mondrian.rolap.aggregates.Read=true \
mondrian.rolap.aggregates.ChooseByVolume=true \
mondrian.rolap.star.disableCaching=true \
mondrian.native.filter.enable=false \
mondrian.native.nonempty.enable=false \
mondrian.xmla.drillthroughTotalCount.enable=false \
mondrian.olap.fun.crossjoin.optimizer.size=0 \
mondrian.rolap.groupingsets.enable=true
echo "This test caused a bug in testNativeSetCaching"
doTest jdk1.6 oracle \
mondrian.test.ExpDependencies=10 \
mondrian.native.crossjoin.enable=false
echo "This test caused a bug"
doTest jdk1.6 oracle \
mondrian.rolap.aggregates.Use=true \
mondrian.rolap.aggregates.Read=true \
mondrian.olap.case.sensitive=false \
mondrian.test.ExpDependencies=10 \
mondrian.xmla.drillthroughTotalCount.enable=false \
mondrian.expCache.enable=false \
mondrian.rolap.SparseSegmentValueThreshold=25000
# Caused bug in testFlush
echo "This test caused a bug in testFlush"
doTest jdk1.4 mysql \
mondrian.test.ExpDependencies=10 \
mondrian.native.crossjoin.enable=false \
mondrian.xmla.drillthroughTotalCount.enable=false \
mondrian.rolap.LargeDimensionThreshold=1000 \
mondrian.rolap.SparseSegmentValueThreshold=10
echo "This test took more than 3 cycles to load aggs in FunctionTest.testComplexOrExpr"
doTest jdk1.5 oracle \
mondrian.rolap.aggregates.Use=true \
mondrian.rolap.aggregates.Read=true \
mondrian.rolap.aggregates.ChooseByVolume=true \
mondrian.rolap.star.disableCaching=true \
mondrian.olap.case.sensitive=false \
mondrian.test.ExpDependencies=10 \
mondrian.rolap.SparseSegmentValueThreshold=25000
# Caused bug in testFlush
echo "This test caused a bug in testFlush"
doTest jdk1.6 derby \
mondrian.native.crossjoin.enable=false \
mondrian.native.topcount.enable=false \
mondrian.native.nonempty.enable=false \
mondrian.xmla.drillthroughTotalCount.enable=false
# Caused lots of out of memory errors towards the end of the test
echo "This caused out of memory errors"
doTest --retroweave jdk1.5 oracle \
mondrian.rolap.aggregates.Use=true \
mondrian.rolap.aggregates.Read=true \
mondrian.olap.case.sensitive=false \
mondrian.test.ExpDependencies=10 \
mondrian.rolap.evaluate.MaxEvalDepth=6 \
mondrian.rolap.star.disableCaching=true \
mondrian.native.topcount.enable=false \
mondrian.native.filter.enable=false \
mondrian.native.nonempty.enable=false \
mondrian.xmla.drillthroughTotalCount.enable=false \
mondrian.rolap.LargeDimensionThreshold=25000
echo "Test support for high-cardinality dimensions"
doTest jdk1.6 oracle \
mondrian.result.limit=100000 \
mondrian.result.highCardChunkSize=30
}
# Returns one of its arguments with equal probability
chooseOne() {
echo "$@" | awk '
{
srand();
r = int(rand() * NF) + 1;
print $r;
}'
sleep 1s
}
# Prints "true" with a given probability, else "".
# For example, "maybe 0.2" prints "true" 20% of the time.
maybe() {
echo | awk '{srand(); r = rand(); if (0) print "r=" r ", p=" p; if (r < p) print "true"; else print "";}' p=$1
sleep 1s
}
doRandom() {
args=
jdk="$(chooseOne jdk1.4 jdk1.5 jdk1.6)"
args="$args $jdk"
# 20% of the time, run jdk1.5 and jdk1.6 against retrowoven code. jdk1.4
# is always retrowoven.
case $jdk in
(jdk1.5|jdk1.6)
if [ "$(maybe 0.8 --retroweave)" ]; then
args="--retroweave $args"
fi
;;
esac
args="$args $(chooseOne ${databaseList})"
# Run JVM in server mode
if [ "$(maybe 0.3)" ]; then
args="$args -server"
fi
# Test with aggs enabled, and further, choose agg tables by their number of data volume.
if [ "$(maybe 0.5)" ]; then
args="$args mondrian.rolap.aggregates.Use=true mondrian.rolap.aggregates.Read=true"
if [ "$(maybe 0.5)" ]; then
args="$args mondrian.rolap.aggregates.ChooseByVolume=true"
fi
fi
# Disable aggregate cache (not with derby - too slow)
if [ $database != derby -a \
"$(maybe 0.5)" ]; then
args="$args mondrian.rolap.star.disableCaching=true"
fi
# Test case-insensitive
if [ "$(maybe 0.3)" ]; then
args="$args mondrian.olap.case.sensitive=false"
fi
# Test expression dependencies.
if [ "$(maybe 0.5)" ]; then
args="$args mondrian.test.ExpDependencies=10"
fi
# Test with aggregate cache disabled
if [ "$(maybe 0.5)" ]; then
args="$args mondrian.rolap.star.disableCaching=true"
fi
# Test with RolapCubeMember cache disabled
if [ "$(maybe 0.3)" ]; then
args="$args mondrian.rolap.EnableRolapCubeMemberCache=false"
fi
if [ $(maybe 0.5) ]; then
# Test with pushdown of NON-EMPTY to SQL disabled
if [ "$(maybe 0.7)" ]; then
args="$args mondrian.native.crossjoin.enable=false"
fi
# Test with pushdown of TOPCOUNT to SQL disabled
if [ "$(maybe 0.7)" ]; then
args="$args mondrian.native.topcount.enable=false"
fi
# Test with pushdown of FILTER to SQL disabled
if [ "$(maybe 0.7)" ]; then
args="$args mondrian.native.filter.enable=false"
fi
# Test with pushdown of Member.Children etc. to SQL disabled
if [ "$(maybe 0.7)" ]; then
args="$args mondrian.native.nonempty.enable=false"
fi
fi
if [ "$(maybe 0.4)" ]; then
args="$args mondrian.xmla.drillthroughTotalCount.enable=false"
fi
# Test with expression result cache disabled
if [ "$(maybe 0.5)" ]; then
args="$args mondrian.expCache.enable=false"
fi
# Change the threshold for large dimensions from its default value 100.
if [ "$(maybe 0.4)" ]; then
args="$args mondrian.rolap.LargeDimensionThreshold=$(chooseOne 1 777 25000)"
fi
# Change the threshold for large dimensions from its default value 1000.
if [ "$(maybe 0.5)" ]; then
args="$args mondrian.rolap.SparseSegmentValueThreshold=$(chooseOne 10 25000)"
fi
# Change the size at which crossjoins are optimized.
if [ "$(maybe 0.5)" ]; then
args="$args mondrian.olap.fun.crossjoin.optimizer.size=$(chooseOne 0 10 10000)"
fi
# Enable GROUPING SETS clause.
if [ "$(maybe 0.5)" ]; then
args="$args mondrian.rolap.groupingsets.enable=true"
fi
# Different representation of null.
if [ "$(maybe 0.2)" ]; then
args="$args mondrian.olap.NullMemberRepresentation=TheNullMember"
fi
# Test support for high-cardinality dimensions.
if [ "$(maybe 0.3)" ]; then
args="$args mondrian.result.highCardChunkSize=30"
fi
doTest $args
}
doQuick() {
doTest jdk1.7 mysql
}
# Runs the tests that are believed to be working.
doWorking() {
doTest jdk1.6 oracle ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS}
doTest jdk1.6 oracle ${ENABLE_NATIVE} ${DISABLE_AGGS} ${ENABLE_SSAS}
doTest jdk1.6 oracle ${ENABLE_NATIVE} ${ENABLE_AGGS} ${ENABLE_SSAS}
doTest jdk1.6 mysql ${ENABLE_NATIVE} ${ENABLE_AGGS} ${DISABLE_SSAS}
doTest jdk1.6 mysql ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS}
doTest jdk1.6 mysql ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS} ${ENABLE_CMCACHE}
doTest jdk1.6 mysql ${ENABLE_NATIVE} ${DISABLE_AGGS} ${ENABLE_SSAS}
doTest jdk1.6 derby ${ENABLE_NATIVE} ${ENABLE_AGGS} ${DISABLE_SSAS}
doTest jdk1.6 derby ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS}
doTest jdk1.5 oracle ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS}
doTest jdk1.4 oracle ${ENABLE_NATIVE} ${DISABLE_AGGS} ${DISABLE_SSAS}
# not necessarily working
doTest jdk1.6 oracle ${ENABLE_NATIVE} ${ENABLE_AGGS}
doTest jdk1.6 oracle ${ENABLE_NATIVE} ${ENABLE_AGGS} ${ENABLE_GSETS}
}
doAllTests() {
# With olap4j
doTest --olap4j jdk1.6 oracle
doTest --olap4j jdk1.5 oracle
doTest --olap4j jdk1.5 access
doTest jdk1.6 teradata mondrian.test.VUsers=1
doTest jdk1.5 teradata mondrian.test.VUsers=1 mondrian.rolap.groupingsets.enable=true
doTest jdk1.4 teradata mondrian.test.VUsers=1
doTest --olap4j jdk1.6 postgresql
# Basic
doTest jdk1.5 derby mondrian.test.VUsers=1
doTest jdk1.4 mysql mondrian.test.VUsers=1 mondrian.rolap.aggregates.Use=true mondrian.rolap.aggregates.Read=true
doTest jdk1.5 mysql mondrian.test.VUsers=1 mondrian.rolap.aggregates.Use=true mondrian.rolap.aggregates.Read=true
doTest jdk1.4 oracle mondrian.test.VUsers=1
doTest jdk1.5 oracle mondrian.test.VUsers=1
doTest jdk1.6 oracle mondrian.test.VUsers=1
doTest jdk1.5 oracle mondrian.test.ExpDependencies=10 mondrian.test.random.seed=-1 mondrian.expCache.enable=false #mondrian.test.Name=mondrian.test.ParentChildHierarchyTest
doTest jdk1.5 access mondrian.olap.NullMemberRepresentation= mondrian.test.Class=mondrian.olap.NullMemberRepresentationTest
doTest jdk1.5 access mondrian.olap.NullMemberRepresentation=\(null\) mondrian.test.Class=mondrian.olap.NullMemberRepresentationTest
doTest jdk1.5 access mondrian.olap.NullMemberRepresentation=~Missing mondrian.test.Class=mondrian.olap.NullMemberRepresentationTest
doTest jdk1.5 access mondrian.test.Class=mondrian.rolap.FastBatchingCellReaderTest
doTest jdk1.5 derby mondrian.test.Class=mondrian.rolap.FastBatchingCellReaderTest
doTest jdk1.5 mysql mondrian.test.Class=mondrian.rolap.FastBatchingCellReaderTest
# mondrian.test.Class=mondrian.test.BasicQueryTest
# mondrian.test.Name=testQueryTimeout
# Same again, with aggs
doTest jdk1.5 oracle mondrian.rolap.aggregates.Use=true mondrian.rolap.aggregates.Read=true
# Same again, non case-sensititive
doTest jdk1.5 oracle mondrian.olap.case.sensitive=false
# Do some tests with random configurations
echo ::: do 3 random tests :::
for ((k=0; k < 3; k++)) do
doRandom
done
doExoticTests
# On a Wednesday, do exhaustive tests.
if [ $(date +%w) = 3 ]; then
doLotsOfTests
fi
}
doTests() {
if [ "$quick" ]; then
doQuick
elif [ "$working" ]; then
doWorking
elif [ "$random" ]; then
doRandom
else
doAllTests
fi
}
checkJavadoc() {
export JAVA_HOME=$(chooseJavaHome jdk1.6)
export ANT_HOME=$(chooseAntHome jdk1.6)
$ANT_HOME/bin/ant -emacs javadoc-strict 2>&1 > ant-javadoc.log
cat ant-javadoc.log |
grep -e ':[0-9]*: warning' - |
grep -v -F -f ant-javadoc-expected.log -
}
usage() {
echo "megatest [--help] [--nightly] [--nobuild] [--quick | --working | --random]"
echo "Options:"
echo " --help Print this help"
echo " --nightly Run as a nightly batch job, with an error summary"
echo " --nobuild Do not compile code before running the test"
echo " --quick Only run one test"
echo " --working Run the set of tests known to be working 100%"
echo " --random Run a test with a random set of parameters"
}
nightly=
quick=
working=
random=
build=true
while [ $# -gt 0 ]; do
case "$1" in
(--help)
usage
exit 0
;;
(--nightly)
nightly=true
shift
;;
(--quick)
quick=true
shift
;;
(--working)
working=true
shift
;;
(--random)
random=true
shift
;;
(--nobuild)
build=
shift
;;
(*)
break
;;
esac
done
if [ "$nightly" ]; then
# We're probably called from a cron job. Set up environment.
cd ${OPEN_DIR}
. ./env
cd mondrian
# Sync latest.
p4 get ...
p4 resolve -am
# Check formatting
if [ -d ../util ]; then
p4 get ../util/...
find . -type f ! -name \*.cup |
xargs ../util/bin/checkFile
fi
# If olap4j exists, sync it
if [ -d ../olap4j ]; then
(
cd ../olap4j
svn up
)
fi
fi
main()
{
cd "${MONDRIAN_DIR}"
if [ "$nightly" ]; then
# If a cron job, run the whole suite before emitting any output.
buildId="$(uname -n)-$(date +%Y%m%d)-change$(p4 counter change)"
doTests >megatest.log 2>&1
echo
echo "Build $buildId"
echo http://www.hydromatic.net/buildlogs/mondrian-${buildId}.log.bz2
echo
echo ::: Summary :::::::::::::::::::::::::::::::::::::
echo Tests completed at $(date).
egrep 'Running test|OK|Tests run| [0-9]*\) ' ./megatest.log
if egrep 'FAILURE|BUILD FAILED|Failures: [^0]|Errors: [^0]' megatest.log; then
echo There were failures.
else
echo Test succeeded.
fi
echo
echo ::: check javadoc :::::::::::::::::::::::::::::::
checkJavadoc
echo
echo ::: megatest.log :::::::::::::::::::::::::::::::::
# Limit to 1MB what we show in email. 10MB is gmail's limit.
head --bytes=1000000 megatest.log
cp megatest.log /home/jhyde/web/buildlogs/mondrian-${buildId}.log
bzip2 --best /home/jhyde/web/buildlogs/mondrian-${buildId}.log
else
doTests 2>&1 | tee megatest.log
fi
}
case $(uname) in
CYGWIN*)
main | dos2unix
;;
*)
main
;;
esac
# End megatest
mondrian-3.11.0.1-R/bin/run.sh 0000775 0000000 0000000 00000002570 12616465703 0015672 0 ustar 00root root 0000000 0000000 #!/bin/bash
# do not use ksh, use bash
#####################################################################
#
# runcmd.sh
#
# Must set location of the cmdrunner.jar
#
# $Id$
#####################################################################
declare -r DIR=$(dirname $0)
LOCATION="$PWD/$DIR"
MONDRIAN_HOME="$LOCATION/.."
MONDRIAN_LIB="$MONDRIAN_HOME/lib"
MONDRIAN_TEST_LIB="$MONDRIAN_HOME/testlib"
CLASSPATH="$MONDRIAN_LIB/mondrian.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-dbcp.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-collections.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-pool.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/eigenbase-resgen.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/eigenbase-xom.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/javacup.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/log4j.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/servlet-api.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/eigenbase-properties.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-math.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-vfs.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-logging.jar"
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/derby.jar"
# now pick up jdbc jars
for j in $MONDRIAN_TEST_LIB/*.jar
do
CLASSPATH="$CLASSPATH:$j"
done
export CLASSPATH
MAIN=mondrian.tui.CmdRunner
java \
-Dlog4j.configuration=file://$MONDRIAN_HOME/log4j.properties \
-cp $CLASSPATH $MAIN "$@"
mondrian-3.11.0.1-R/bin/runtest.sh 0000775 0000000 0000000 00000004155 12616465703 0016573 0 ustar 00root root 0000000 0000000 #!/bin/bash
declare -r DIR=$(dirname $0)
LOCATION="$PWD/$DIR"
MONDRIAN_HOME="$LOCATION/.."
MONDRIAN_LIB="$MONDRIAN_HOME/lib"
MONDRIAN_TEST_LIB="$MONDRIAN_HOME/testlib"
CLASSPATH=$MONDRIAN_LIB/mondrian.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/log4j-1.2.9.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/eigenbase-xom.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/eigenbase-resgen.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/eigenbase-properties.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/javacup.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/commons-dbcp.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/commons-collections.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/commons-pool.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/commons-math-1.0.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_LIB/commons-vfs.jar
CLASSPATH="$CLASSPATH:$MONDRIAN_LIB/commons-logging.jar"
CLASSPATH=$CLASSPATH:$MONDRIAN_TEST_LIB/mysql-connector-java-3.1.7-bin.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_TEST_LIB/ojdbc14.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_TEST_LIB/junit.jar
CLASSPATH=$CLASSPATH:$MONDRIAN_TEST_LIB/derby.jar
CLASSPATH="$CLASSPATH:$MONDRIAN_HOME/testclasses"
export CLASSPATH
CATALOG_URL="file://localhost${MONDRIAN_HOME}/demo/FoodMart.xml"
# oracle
#JDBC_DRIVER=oracle.jdbc.OracleDriver
#JDBC_URL=jdbc:oracle:thin:foodmart/foodmart@EDGEPSW01:1521:pstest
# mysql
JDBC_DRIVER=com.mysql.jdbc.Driver
JDBC_URL="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart"
# Derby
#JDBC_DRIVER=org.apache.derby.jdbc.EmbeddedDriver
#JDBC_URL="jdbc:derby:demo/derby/foodmart;JdbcUser=sa;JdbcPassword=sa"
P="-Dmondrian.jdbcDrivers=$JDBC_DRIVER"
P="$P -Dmondrian.foodmart.jdbcURL=$JDBC_URL"
# P="$P -Dmondrian.test.foodmart.catalogURL=$CATALOG_URL"
P="$P -Dmondrian.foodmart.catalogURL=$CATALOG_URL"
P="$P -Dmondrian.test.connectString=Provider=mondrian;Jdbc='$JDBC_URL';Catalog='$CATALOG_URL'"
P="$P -Dlog4j.configuration=file://localhost${MONDRIAN_HOME}/log4j.properties"
JAVA=$( which java )
if [[ -n "$JAVA_HOME" ]]; then
JAVA="$JAVA_HOME"/bin/java
fi
if [[ ! -e $JAVA ]]; then
echo "java executable $JAVA not found"
exit 1
fi
MAIN_CLASS=mondrian.test.SimpleTestRunner
$JAVA -cp $CLASSPATH $P $MAIN_CLASS $@
mondrian-3.11.0.1-R/build.properties 0000664 0000000 0000000 00000002724 12616465703 0017175 0 ustar 00root root 0000000 0000000 # This software is subject to the terms of the Eclipse Public License v1.0
# Agreement, available at the following URL:
# http://www.eclipse.org/legal/epl-v10.html.
# You must accept the terms of that agreement to use this software.
#
# Copyright (C) 2002-2005 Julian Hyde
# Copyright (C) 2005-2012 Pentaho and others
# All Rights Reserved.
#
# Modify this file to override build settings. It is read by ant's build.xml.
Name=Mondrian
name=mondrian
vendor=Pentaho
project.revision=3.11.0.1-356
project.revision.major=3
project.revision.minor=1101356
ivy.artifact.id=mondrian
ivy.artifact.group=pentaho
impl.title=mondrian
driver.name=Mondrian olap4j driver
driver.version=3.11.0.1-356
driver.version.major=3
driver.version.minor=1101356
#dependency for olap4j
dependency.olap4j-core.revision=1.2.0
dependency.olap4j-xmla.revision=1.2.0
dependency.olap4j-tck.revision=1.0.1.539
#dependency properties: used during resolve step of workbench build
dependency.kettle.revision=6.0.0.1-356
dependency.guava.revision=17.0
dependency.pentaho-xul.revision=6.0.0.1-356
dependency.schemaworkbench-plugins.revision=3.11.0.1-356
dependency.pdi-dataservice-client-plugin.revision=6.0.0.1-356
dependency.pentaho-launcher.revision=6.0.0.1-356
dependency.oss-licenses.revision=6.0.0.1-356
# Uncomment to use yDoc doclet for enhanced javadoc (requires commercial
# license).
#ydoc.home=/usr/local/ydoc-3.0-jdk1.5
# Uncomment to skip the test suite run.
# mondrian.tests.skip=true
publish.generatePom=true
mondrian-3.11.0.1-R/build.xml 0000664 0000000 0000000 00000140652 12616465703 0015604 0 ustar 00root root 0000000 0000000
You must specify a specific project target when using the ANT build.
Targets are one of the following:
- help
This is the help.
- info
Shows configuration info.
- binzip
Compiles Mondrian and wraps everything in a neat little package,
including documentation.
- workbench-dist
Compiles PSW and wraps everything in a neat little package.
- jar
Creates a Mondrian jar.
- workbench
Creates Mondrian and workbench jars.
- clean
Deletes build output.
- clean-deep
Clean build output and generated sources.
- javadoc
Create the API documentation.
- test
Runs the tests. Requires FoodMart to be installed. (see below)
- jacoco
Runs the tests with jacoco to measure coverage. Requires FoodMart
to be installed. (see below)
-load-foodmart
Will load the test DB FoodMart using the JDBC parameters specified.
(see below)
To run the tests, you must have FoodMart available in a database.
You can pass the DB configuration through the command line arguments,
like so:
ant -Dmondrian.foodmart.jdbcURL="jdbc:mysql://localhost/foodmart" \
-Dmondrian.foodmart.jdbcUser=foodmart \
-Dmondrian.foodmart.jdbcPassword=foodmart \
-Dmondrian.jdbcDrivers=com.mysql.jdbc.Driver \
-Ddriver.classpath="/opt/mysql-connector-java-5.1.25-bin.jar"
test
Alternatively, these can be written to a file at the root of the project.
Create a file 'mondrian.properties' containing this:
mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart
mondrian.foodmart.jdbcUser=foodmart
mondrian.foodmart.jdbcPassword=foodmart
mondrian.jdbcDrivers=com.mysql.jdbc.Driver
driver.classpath=/opt/mysql-connector-java-5.1.25-bin.jar
To load foodmart into your DB, you can call the 'load-foodmart' target
before 'test'.
The parameters can be adjusted to point to a different DB than MySQL.
==============================================================| Mondrian configuration info |==============================================================project.location = ${project.location}jdk.home = ${env.JAVA_HOME}log4j.configuration = ${log4j.configuration}mondrian.foodmart.catalogURL = ${mondrian.foodmart.catalogURL}mondrian.foodmart.jdbcURL = ${mondrian.foodmart.jdbcURL}mondrian.jdbcDrivers = ${mondrian.jdbcDrivers}driver.classpath (additions) = ${driver.classpath}==============================================================Compiling on JVM Version: ${java.runtime.version}include.gui=${include.gui}The target 'junit-main' was replaced by 'test'.
Please call this one instead.Title: ${name}
Version: ${project.revision}
VersionMajor: ${project.revision.major}
VersionMinor: ${project.revision.minor}
Vendor: ${vendor}
/*
* Project version information. Generated - do not modify.
*/
package mondrian.olap4j;
/**
* Version information for the Mondrian olap4j driver. (Generated.)
*/
class MondrianOlap4jDriverVersion {
static final String NAME = "${driver.name}";
static final String VERSION = "${driver.version}";
static final int MAJOR_VERSION = ${driver.version.major};
static final int MINOR_VERSION = ${driver.version.minor};
}
// End MondrianOlap4jDriverVersion.java/*
* Project version information. Generated - do not modify.
*/
package mondrian.server;
/**
* Version information for Mondrian. (Generated by build)
*/
class MondrianServerVersion {
static final String VENDOR = "${vendor}";
static final String NAME = "${name}";
static final String VERSION = "${project.revision}";
static final int MAJOR_VERSION = ${project.revision.major};
static final int MINOR_VERSION = ${project.revision.minor};
static final String COPYRIGHT_YEAR = "${copyright.year}";
}
// End MondrianServerVersion.javapentaho-eula-assembly-pom.version not set, assuming default of ${pentaho-eula-assembly-pom.version}artifactName not set, assuming default of ${artifactName}
mvn
-f dist/pentaho-eula-assembly-pom-${pentaho-eula-assembly-pom.version}-pom.xml
-DartifactName=${artifactName}
-Ddist.dir=
package
mondrian-3.11.0.1-R/demo/ 0000775 0000000 0000000 00000000000 12616465703 0014677 5 ustar 00root root 0000000 0000000 mondrian-3.11.0.1-R/demo/CmdRunner.cmdr 0000664 0000000 0000000 00000002012 12616465703 0017436 0 ustar 00root root 0000000 0000000 echo ----------------------------------------------------
echo Cube list
echo ----------------------------------------------------
cube
echo ----------------------------------------------------
echo Log level of mondrian.rolap.RolapUtil
echo ----------------------------------------------------
log mondrian.rolap.RolapUtil
echo ----------------------------------------------------
echo Run a query
echo ----------------------------------------------------
with member [Measures].[Store Profit] as '[Measures].[Store Sales] - [Measures].[Store Cost]'
select { [Time].[1997].children } on columns,
hierarchize(
intersect(
crossjoin({ [Measures].members, [Measures].[Store Profit] }, [Store].members),
generate([Store].members, { ([Measures].[Store Profit], [Store].currentmember) } )
)
) on rows from [Sales] where ( [Product].[Food] );
echo ----------------------------------------------------
echo Log level of mondrian.rolap.RolapUtil
echo ----------------------------------------------------
log mondrian.rolap.RolapUtil
mondrian-3.11.0.1-R/demo/CmdRunner.properties 0000664 0000000 0000000 00000001772 12616465703 0020721 0 ustar 00root root 0000000 0000000 # Environment
mondrian.catalogURL=file:///C:/Documents and Settings/swood/My Documents/perforce/open/mondrian/demo/FoodMart.xml
# mysql
#mondrian.test.jdbcURL=jdbc:mysql://localhost/foodmart?user=root&password=myroot
#mondrian.jdbcDrivers=com.mysql.jdbc.Driver
# Postgres
mondrian.test.jdbcURL=jdbc:postgresql://localhost/FM3
mondrian.test.jdbcUser=postgres
mondrian.test.jdbcPassword=pgAdmin
mondrian.jdbcDrivers=org.postgresql.Driver
# Use MD5 based caching for the RolapSchema instance
mondrian.catalog.content.cache.enabled=true
# both read and use aggregate tables
mondrian.rolap.aggregates.Use=true
mondrian.rolap.aggregates.Read=true
# generate aggregate sql (for every mdx query)
mondrian.rolap.aggregates.generateSql=true
# pretty print sql (if log level for mondrian.rolap.RolapUtil is DEBUG)
mondrian.rolap.generate.formatted.sql=true
# by default the aggregate table with the smallest number of rows
# (rather than rows times size of each row) is used
#mondrian.rolap.aggregates.ChooseByVolume=true
mondrian-3.11.0.1-R/demo/FoodMart.xml 0000664 0000000 0000000 00000103730 12616465703 0017140 0 ustar 00root root 0000000 0000000
VerkaufenVentesCube des ventesCube VerkaufenCube den Verkaufen