[Mondrian] Re: Eigenbase perforce change 8742 for review

Richard Emberson remberson at edgedynamics.com
Wed Feb 21 14:20:15 EST 2007


John,

If you put your local properties into a file, say
local.properties, and then call the build script
passing that that file name, e.g.,

 > ./build.sh -propertyfile local.properties test

it will pick up the properties from that file.
Since I wrap all calls to the build script, I
don't have to type it in all the time.

Richard


John V. Sichi wrote:
> Richard, in the change below, did you intentionally re-enable 
> mondrian.util.memoryMonitor.enable=true?  The comment in 
> mondrian.properties still says the default should be false (and I agree, 
> since Derby tests fail with true).  But you changed the actual default 
> in MondrianProperties.
> 
> I remain convinced that a properties file that a developer is forced to 
> check out for overlapping purposes (submitting changes to property 
> definitions; changing mandatory site-specific settings as part of 
> sandbox setup) is very problematic.  It's especially troublesome because 
> it breaks the rhythm of edit, run tests, check in--instead, after 
> running tests against changed property definitions, the developer has to 
> remember to undo site-specific settings, check in, and then re-checkout 
> and reapply site-specific settings.
> 
> Julian has spoken quite adamantly, but I'm not clear on why site-local 
> setup instructions can't be kept "members only" for developers so that 
> there's no impact on end-users, forum support, etc.  But pending that: 
> Richard, could you be more careful?
> 
> JVS
> 
> Richard Emberson wrote:
>> http://p4web.eigenbase.org/@md=d&c=6PU@//8742?ac=10
>>
>> Change 8742 by emberson at bortei.head on 2007/02/17 11:30:51
>>
>>     MONDRIAN
>>        ObjectFactory now uses MondrianProperties values as        
>> overriding property mechanism. The factory properties were
>>        added to MondrianProperties.java for the MemoryMonitorFactory
>>        and the ExpCompiler.Factory. Removed previously added
>>        alteration to build.xml - not needed when using 
>> MondrianProperties.
>>
>> Affected files ...
>>
>> ... //open/mondrian/build.xml#140 edit
>> ... //open/mondrian/doc/configuration.html#21 edit
>> ... //open/mondrian/mondrian.properties#35 edit
>> ... //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 edit
>> ... //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 
>> edit
>> ... //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 
>> edit
>> ... //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 edit
>>
>> Differences ...
>>
>> ==== //open/mondrian/build.xml#140 (ktext) ====
>>
>> 2c2
>> <   == $Id: //open/mondrian/build.xml#139 $
>> ---
>>>   == $Id: //open/mondrian/build.xml#140 $
>> 458,461d457
>> <     <propertyset id="properties-starting-with-mondrian">
>> <         <propertyref prefix="mondrian"/>
>> <     </propertyset>
>> < 485,489d480
>> <       <!-- include all properties starting with "mondrian" -->
>> <       <syspropertyset>
>> <         <propertyset refid="properties-starting-with-mondrian"/>
>> <       </syspropertyset>
>> <
>> ==== //open/mondrian/doc/configuration.html#21 (ktext) ====
>>
>> 3c3
>> <   == $Id: //open/mondrian/doc/configuration.html#20 $
>> ---
>>>   == $Id: //open/mondrian/doc/configuration.html#21 $
>> 97c97
>> <       mondrian.foodmart .jdbcURL</a></code></td>
>> ---
>>>       mondrian.foodmart.jdbcURL</a></code></td>
>> 105c105
>> <       mondrian.query. limit</a></code></td>
>> ---
>>>       mondrian.query.limit</a></code></td>
>> 116c116
>> <       mondrian. jdbcDrivers</a></code></td>
>> ---
>>>       mondrian.jdbcDrivers</a></code></td>
>> 119c119
>> <       sun.jdbc.odbc .JdbcOdbcDriver,<br>
>> ---
>>>       sun.jdbc.odbc.JdbcOdbcDriver,<br>
>> 123c123
>> <       com.mysql.jdbc .Driver</td>
>> ---
>>>       com.mysql.jdbc.Driver</td>
>> 130c130
>> <       mondrian.result .limit</a></code></td>
>> ---
>>>       mondrian.result.limit</a></code></td>
>> 156c156
>> <       mondrian.rolap. CachePool.costLimit</a></code></td>
>> ---
>>>       mondrian.rolap.CachePool.costLimit</a></code></td>
>> 164c164
>> <       evaluate. MaxEvalDepth</a></code></td>
>> ---
>>>       evaluate.MaxEvalDepth</a></code></td>
>> 174c174
>> <       mondrian.rolap. LargeDimension Threshold</a></code></td>
>> ---
>>>       mondrian.rolap.LargeDimension Threshold</a></code></td>
>> 185c185
>> <       mondrian.rolap. SparseSegment ValueThreshold</a></code></td>
>> ---
>>>       mondrian.rolap.SparseSegmentValueThreshold</a></code></td>
>> 226c226
>> <       mondrian.rolap. SparseSegment DensityThreshold</a></code></td>
>> ---
>>>       mondrian.rolap.SparseSegmentDensityThreshold</a></code></td>
>> 229c229
>> <       <td>See <code>mondrian.rolap. SparseSegment 
>> ValueThreshold</code>.</td>
>> ---
>>>       <td>See 
>>> <code>mondrian.rolap.SparseSegmentValueThreshold</code>.</td>
>> 235c235
>> <       mondrian.olap. triggers.enable</a></code></td>
>> ---
>>>       mondrian.olap.triggers.enable</a></code></td>
>> 244c244
>> <         <p>&nbsp;<code>MondrianProperties .instance() 
>> .populate(null)</code>;</p>
>> ---
>>>         
>>> <p>&nbsp;<code>MondrianProperties.instance().populate(null)</code>;</p>
>> 249c249
>> <         <p><code>MondrianProperties .instance() 
>> .QueryLimit.set(50);</code></p>
>> ---
>>>         
>>> <p><code>MondrianProperties.instance().QueryLimit.set(50);</code></p>
>> 255c255
>> <       mondrian.olap. case.sensitive</a></code></td>
>> ---
>>>       mondrian.olap.case.sensitive</a></code></td>
>> 265c265
>> <       mondrian.rolap. localePropFile</a></code></td>
>> ---
>>>       mondrian.rolap.localePropFile</a></code></td>
>> 303,304c303
>> <       <td><a 
>> href="api/mondrian/olap/MondrianProperties.html#IgnoreInvalidMembers">
>> <       <code>mondrian.rolap.ignoreInvalidMembers</code></a></td>
>> ---
>>>       <td><code><a 
>>> href="api/mondrian/olap/MondrianProperties.html#IgnoreInvalidMembers">mondrian.rolap.ignoreInvalidMembers</a></code></td> 
>>>
>> 312,313c311
>> <       <td><a 
>> href="api/mondrian/olap/MondrianProperties.html#IterationLimit">
>> <       <code>mondrian.rolap.IterationLimit</code></a></td>
>> ---
>>>       <td><code><a 
>>> href="api/mondrian/olap/MondrianProperties.html#IterationLimit">mondrian.rolap.IterationLimit</a></code></td> 
>>>
>> 329a328,365
>>>     <tr>       <td>
>>>         <code>
>>>         <a 
>>> href="api/mondrian/olap/MondrianProperties.html#CrossJoinOptimizerSize">mondrian.olap.fun.crossjoin.optimizer.size</a></code></td> 
>>>
>>>       <td>int</td>
>>>       <td>0</td>
>>>       <td>
>>>          If a crossjoin input list's size is larger than this property's
>>>          value and the axis has the "NON EMPTY" qualifier, then
>>>          the crossjoin non-empty optimizer is applied.
>>>          Setting this value to '0' means that for all crossjoin
>>>          input lists in non-empty axes will have the optimizer applied.
>>>          On the other hand, if the value is set larger than any possible
>>>          list, say <code>Integer.MAX_VALUE</code>, then the optimizer 
>>>          will never be applied.
>>>       </td>
>>>     </tr>
>>>     <tr>       <td>
>>>         <code>
>>>         <a 
>>> href="api/mondrian/olap/MondrianProperties.html#UseImplicitMembers">mondrian.rolap.RolapResult.useImplicitMembers</a></code></td> 
>>>
>>>       <td>boolean</td>
>>>       <td>true</td>
>>>       <td>
>>>          The crossjoin optimizer is flawed. It evaluates potential cells
>>>          using default members when a member is not explicitly set in
>>>          the particular axis. This works unless another axis, normal or
>>>          slicer, uses a member other than the default.
>>>          Setting this property to <code>true</code> will enable the
>>>          RolapResult to collect these implied members and if any are
>>>          found, then re-evaluate using the discovered members.
>>>          <p>
>>>          If you do not enable this property, then the crossjoin 
>>> optimizer,
>>>          if used, can produce errors. Bad results are produced for some
>>>          queries and some data sets - its a combination of both so 
>>> the          error does not manifest itself all the time.
>>>       </td>
>>>     </tr>
>> 340c376
>> <       mondrian.trace. level</a></code></td>
>> ---
>>>       mondrian.trace.level</a></code></td>
>> 350c386
>> <       mondrian.debug. out.file</a></code></td>
>> ---
>>>       mondrian.debug.out.file</a></code></td>
>> 359c395
>> <       mondrian.rolap. RolapResult. printCacheables</a></code></td>
>> ---
>>>       mondrian.rolap.RolapResult.printCacheables</a></code></td>
>> 375c411
>> <       mondrian.test. Name</a></code></td>
>> ---
>>>       mondrian.test.Name</a></code></td>
>> 386c422
>> <       mondrian.test. Class</a></code></td>
>> ---
>>>       mondrian.test.Class</a></code></td>
>> 393c429
>> <       junit .framework.Test</a></code> or has a method <code>public 
>> static
>> ---
>>>       junit.framework.Test</a></code> or has a method <code>public 
>>> static
>> 398c434
>> <       mondrian.test .connectString</a></code></td>
>> ---
>>>       mondrian.test.connectString</a></code></td>
>> 409c445
>> <       mondrian.test .QueryFilePattern</a></code></td>
>> ---
>>>       mondrian.test.QueryFilePattern</a></code></td>
>> 418c454
>> <       mondrian.test .QueryFileDirectory</a></code></td>
>> ---
>>>       mondrian.test.QueryFileDirectory</a></code></td>
>> 426c462
>> <       mondrian.test .Iterations</a></code></td>
>> ---
>>>       mondrian.test.Iterations</a></code></td>
>> 434c470
>> <       mondrian.test .VUsers</a></code></td>
>> ---
>>>       mondrian.test.VUsers</a></code></td>
>> 442c478
>> <       mondrian.test .TimeLimit</a></code></td>
>> ---
>>>       mondrian.test.TimeLimit</a></code></td>
>> 451c487
>> <       mondrian.test .Warmup</a></code></td>
>> ---
>>>       mondrian.test.Warmup</a></code></td>
>> 459c495
>> <       mondrian. catalogURL</a></code></td>
>> ---
>>>       mondrian.catalogURL</a></code></td>
>> 468c504
>> <       mondrian.test .ExpDependencies</a></code></td>
>> ---
>>>       mondrian.test.ExpDependencies</a></code></td>
>> 482c518
>> <       mondrian.test .random.seed</a></code></td>
>> ---
>>>       mondrian.test.random.seed</a></code></td>
>> 504c540
>> <       mondrian.test. jdbcURL</a></code></td>
>> ---
>>>       mondrian.test.jdbcURL</a></code></td>
>> 513c549
>> <       mondrian.test .jdbcUser</a></code></td>
>> ---
>>>       mondrian.test.jdbcUser</a></code></td>
>> 522c558
>> <       mondrian.test .jdbcPassword</a></code></td>
>> ---
>>>       mondrian.test.jdbcPassword</a></code></td>
>> 539c575
>> <       mondrian.rolap .aggregates.Use</a></code></td>
>> ---
>>>       mondrian.rolap.aggregates.Use</a></code></td>
>> 553c589
>> <       mondrian.rolap .aggregates.Read</a></code></td>
>> ---
>>>       mondrian.rolap.aggregates.Read</a></code></td>
>> 566c602
>> <       mondrian.rolap. aggregates. ChooseByVolume</a></code></td>
>> ---
>>>       mondrian.rolap.aggregates.ChooseByVolume</a></code></td>
>> 578c614
>> <       mondrian.rolap. aggregates.rules</a></code></td>
>> ---
>>>       mondrian.rolap.aggregates.rules</a></code></td>
>> 582c618
>> <       (which is in the <code>mondrian.rolap .aggmatcher</code>
>> ---
>>>       (which is in the <code>mondrian.rolap.aggmatcher</code>
>> 593c629
>> <       mondrian.rolap. aggregates.rule.tag</a></code></td>
>> ---
>>>       mondrian.rolap.aggregates.rule.tag</a></code></td>
>> 603c639
>> <       <a 
>> href="api/mondrian/olap/MondrianProperties.html#GenerateAggregateSql">mondrian.rolap. 
>> aggregates. generateSql</a></code></td>
>> ---
>>>       <a 
>>> href="api/mondrian/olap/MondrianProperties.html#GenerateAggregateSql">mondrian.rolap.aggregates.generateSql</a></code></td> 
>>>
>> 624c660
>> <       <a 
>> href="api/mondrian/olap/MondrianProperties.html#DisableCaching">mondrian.rolap. 
>> star.disable Caching</a></code></td>
>> ---
>>>       <a 
>>> href="api/mondrian/olap/MondrianProperties.html#DisableCaching">mondrian.rolap.star.disableCaching</a></code></td> 
>>>
>> 635c671
>> <       <a 
>> href="api/mondrian/olap/MondrianProperties.html#EnableExpCache">mondrian.expCache 
>> .enable</a></code></td>
>> ---
>>>       <a 
>>> href="api/mondrian/olap/MondrianProperties.html#EnableExpCache">mondrian.expCache.enable</a></code></td> 
>>>
>> 647c683
>> <       Order([Product] .MEMBERS, [Measures].[Unit Sales]))<br>
>> ---
>>>       Order([Product].MEMBERS, [Measures].[Unit Sales]))<br>
>> 653c689
>> <       mondrian.rolap. RolapResult. flushAfter EachQuery</a></code></td>
>> ---
>>>       mondrian.rolap.RolapResult.flushAfterEachQuery</a></code></td>
>> 669c705
>> <       <a 
>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeCrossJoin">mondrian.native 
>> .crossjoin.enable</a></code></td>
>> ---
>>>       <a 
>>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeCrossJoin">mondrian.native.crossjoin.enable</a></code></td> 
>>>
>> 680c716
>> <       <a 
>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeTopCount">mondrian.native 
>> .topcount.enable</a></code></td>
>> ---
>>>       <a 
>>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeTopCount">mondrian.native.topcount.enable</a></code></td> 
>>>
>> 690c726
>> <       <a 
>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeFilter">mondrian.native 
>> .filter.enable</a></code></td>
>> ---
>>>       <a 
>>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeFilter">mondrian.native.filter.enable</a></code></td> 
>>>
>> 701c737
>> <       mondrian.native .nonempty.enable</a></code></td>
>> ---
>>>       mondrian.native.nonempty.enable</a></code></td>
>> 713,714c749,750
>> <       <td><a 
>> href="api/mondrian/olap/MondrianProperties.html#AlertNativeEvaluationUnsupported"> 
>>
>> <       <code>mondrian.native.unsupported.alert</code></a></td>
>> ---
>>>       <td><code><a
>>> href="api/mondrian/olap/MondrianProperties.html#AlertNativeEvaluationUnsupported">mondrian.native.unsupported.alert</a></code></td> 
>>>
>> 727c763
>> <       mondrian.rolap. generate.formatted .sql</a></code></td>
>> ---
>>>       mondrian.rolap.generate.formatted.sql</a></code></td>
>> 738c774
>> <       mondrian.rolap. maxConstraints</a></code></td>
>> ---
>>>       mondrian.rolap.maxConstraints</a></code></td>
>> 766c802
>> <       mondrian.xmla. drillthrough TotalCount.enable</a></code></td>
>> ---
>>>       mondrian.xmla.drillthrough TotalCount.enable</a></code></td>
>> 775c811
>> <       mondrian.xmla. drillthrough MaxRows</a></code></td>
>> ---
>>>       mondrian.xmla.drillthrough MaxRows</a></code></td>
>> 812a849,850
>>>     <tr>
>>>       <td style="vertical-align: top;" colspan="4">
>> 813a852,885
>>>       <b><br>Factories</b>
>>>       </td>
>>>   </tr>
>>>     <tr>
>>>       <td><code>
>>>       <a 
>>> href="api/mondrian/olap/MondrianProperties.html#MemoryMonitorClass">
>>>       mondrian.util.MemoryMonitor.class
>>>       </a></code></td>
>>>
>>>       <td>string</td>
>>>       <td>-</td>
>>>       <td>
>>>       By default this property does not have a value.       If set, 
>>> then it is the class name of an implementation of
>>>       the MemoryMonitor class and is used by the
>>>       MemoryMonitorFactory to create the single instance.
>>>       </td>
>>>     </tr>
>>>     <tr>
>>>       <td><code>
>>>       <a 
>>> href="api/mondrian/olap/MondrianProperties.html#ExpCompilerClass">
>>>       mondrian.calc.ExpCompiler.class
>>>       </a></code></td>
>>>
>>>       <td>string</td>
>>>       <td>-</td>
>>>       <td>
>>>       By default this property does not have a value.       If set, 
>>> then it is the class name of an implementation of
>>>       the ExpCompiler class and is used by the
>>>       ExpCompiler.Factory to create each instance.
>>>       </td>
>>>     </tr>
>>>
>> 1091c1163
>> <     Version: $Id: //open/mondrian/doc/configuration.html#20 $
>> ---
>>>     Version: $Id: //open/mondrian/doc/configuration.html#21 $
>>
>> ==== //open/mondrian/mondrian.properties#35 (ktext) ====
>>
>> 1c1
>> < # $Id: //open/mondrian/mondrian.properties#34 $
>> ---
>>> # $Id: //open/mondrian/mondrian.properties#35 $
>> 71,75c71,75
>> < 
>> #mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart 
>>
>> < #mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart
>> < #mondrian.foodmart.jdbcUser=foodmart
>> < #mondrian.foodmart.jdbcPassword=foodmart
>> < #mondrian.jdbcDrivers=com.mysql.jdbc.Driver
>> ---
>>> mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart 
>>>
>>> mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart
>>> mondrian.foodmart.jdbcUser=foodmart
>>> mondrian.foodmart.jdbcPassword=foodmart
>>> mondrian.jdbcDrivers=com.mysql.jdbc.Driver
>> 284c284,290
>> < mondrian.util.memoryMonitor.percentage.threshold=90
>> ---
>>> # If enabled, when Java5 memory monitor detects that post-garbage
>>> # collection is above this value, notifications are generated.
>>> #mondrian.util.memoryMonitor.percentage.threshold=90
>>>
>>> ############################################################################### 
>>>
>>> # Property for overriding default MemoryMonitor implementation.
>>> #mondrian.util.MemoryMonitor.class=null
>> 286a293
>>> # Property for overriding default ExpCompiler implementation.
>> 288c295,314
>> < #mondrian.calc.ExpCompiler=mondrian.olap.fun.ResultStyleCompiler
>> ---
>>> #
>>> # To test that for all test MDX queries that all functions can
>>> # handle requests for ITERABLE, LIST and MUTABLE_LIST evalutation
>>> # results, the following can be used:
>>> # mondrian.calc.ExpCompiler.class=mondrian.olap.fun.ResultStyleCompiler
>>> #
>>> #mondrian.calc.ExpCompiler.class=null
>>>
>>> ############################################################################### 
>>>
>>> # Controls when a non-empty crossjoin input list will have the
>>> # optimiztion applied base upon the list's size.
>>> # The size of the list must be greater than the property value size
>>> # for optimiztion.
>>> # mondrian.olap.fun.crossjoin.optimizer.size=0
>>>
>>> ############################################################################### 
>>>
>>> # If true, the the RolapResult will apply its implicit member
>>> # fix by merging axes when a non-empty crossjoin uses the incorrect
>>> # memebers.
>>> # mondrian.rolap.RolapResult.useImplicitMembers=true
>>
>> ==== //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 (ktext) 
>> ====
>>
>> 2c2
>> < // $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#8 $
>> ---
>>> // $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 $
>> 11a12
>>> import org.eigenbase.util.property.StringProperty;
>> 21c22
>> <  * @version $Id: 
>> //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#8 $
>> ---
>>>  * @version $Id: 
>>> //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 $
>> 352a354,362
>>>         /**          * Return the <code>ExpCompiler.Factory</code 
>>> property name.          *          * @return 
>>> <code>ExpCompiler.Factory</code> property name
>>>          */
>>>         protected StringProperty getStringProperty() {
>>>             return MondrianProperties.instance().ExpCompilerClass;
>>>         }
>>
>> ==== //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 
>> (ktext) ====
>>
>> 2c2
>> < // $Id: 
>> //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#64 $
>> ---
>>> // $Id: 
>>> //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 $
>> 58c58
>> <  * @version $Id: 
>> //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#64 $
>> ---
>>>  * @version $Id: 
>>> //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 $
>> 858c858
>> <         this, "mondrian.util.memoryMonitor.enable", false);
>> ---
>>>         this, "mondrian.util.memoryMonitor.enable", true);
>> 864a865,910
>>>     /**
>>>      * The <code>MemoryMonitor</code> class property. If the value is 
>>>      * non-null, it is used by the <code>MemoryMonitorFactory</code> 
>>>      * to create the implementation.
>>>      */
>>>     public final StringProperty MemoryMonitorClass = new StringProperty(
>>>             this, "mondrian.util.MemoryMonitor.class", null);
>>>
>>>     /**
>>>      * The <code>ExpCompiler</code> class property. If the value is 
>>>      * non-null, it is used by the <code>ExpCompiler.Factory</code> 
>>>      * to create the implementation.
>>>      */
>>>     public final StringProperty ExpCompilerClass = new StringProperty(
>>>             this, "mondrian.calc.ExpCompiler.class", null);
>>>
>>>     /**
>>>      * If a crossjoin input list's size is larger than this property's
>>>      * value and the axis has the "NON EMPTY" qualifier, then
>>>      * the crossjoin non-empty optimizer is applied.
>>>      * Setting this value to '0' means that for all crossjoin
>>>      * input lists in non-empty axes will have the optimizer applied.
>>>      * On the other hand, if the value is set larger than any possible
>>>      * list, say <code>Integer.MAX_VALUE</code>, then the optimizer 
>>>      * will never be applied.
>>>      */
>>>     public final IntegerProperty CrossJoinOptimizerSize = new 
>>> IntegerProperty(
>>>             this, "mondrian.olap.fun.crossjoin.optimizer.size", 0);
>>>
>>>     /**
>>>      * The crossjoin optimizer is flawed. It evaluates potential cells
>>>      * using default members when a member is not explicitly set in
>>>      * the particular axis. This works unless another axis, normal or
>>>      * slicer, uses a member other than the default.
>>>      * Setting this property to <code>true</code> will enable the
>>>      * RolapResult to collect these implied members and if any are
>>>      * found, then re-evaluate using the discovered members.
>>>      * <p>
>>>      * If you do not enable this property, then the crossjoin optimizer,
>>>      * if used, can produce errors. Bad results are produced for some
>>>      * queries and some data sets - its a combination of both so the 
>>>      * error does not manifest itself all the time.
>>>      */
>>>     public final BooleanProperty UseImplicitMembers = new 
>>> BooleanProperty(
>>>             this, "mondrian.rolap.RolapResult.useImplicitMembers", 
>>> true);
>>
>> ==== 
>> //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 
>> (ktext) ====
>>
>> 2c2
>> < // $Id: 
>> //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#6 $
>> ---
>>> // $Id: 
>>> //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 $
>> 14a15
>>> import org.eigenbase.util.property.StringProperty;
>> 40c41
>> <  * @version $Id: 
>> //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#6 $
>> ---
>>>  * @version $Id: 
>>> //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 $
>> 135a137,145
>>>     /**      * Return the <code>MemoryMonitorFactory</code property 
>>> name.      *      * @return <code>MemoryMonitorFactory</code> 
>>> property name
>>>      */
>>>     protected StringProperty getStringProperty() {
>>>         return MondrianProperties.instance().MemoryMonitorClass;
>>>     }
>>>
>>
>> ==== //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 
>> (ktext) ====
>>
>> 2c2
>> < // $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#8 $
>> ---
>>> // $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 $
>> 11a12
>>> import org.eigenbase.util.property.StringProperty;
>> 278c279
>> <  * @version $Id: 
>> //open/mondrian/src/main/mondrian/util/ObjectFactory.java#8 $
>> ---
>>>  * @version $Id: 
>>> //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 $
>> 481,482c482,485
>> <      * By default the name returned is the value of a property
>> <      * with key equal to the class name of the 
>> <code>interfaceClass</code>.
>> ---
>>>      * The factory's <code>StringProperty</code> is gotten and
>>>      * if it has a non-null value, then that is returned. Otherwise,
>>>      * the <code>StringProperty</code>'s name (path) is used as the
>>>      * name to probe the <code>Properties</code> object for a value.
>> 488,489c491,496
>> <         return (props == null)
>> <             ? null : props.getProperty(this.interfaceClass.getName());
>> ---
>>>         final StringProperty stringProp = getStringProperty();
>>>         final String className = stringProp.get();
>>>         return (className != null)                 ? className
>>>                 : (props == null)
>>>                     ? null : props.getProperty(stringProp.getPath());
>> 491a499,505
>>>     /**      * Return the <code>StringProperty</code> associated with 
>>> this factory.      *      * @return the  <code>StringProperty</code> 
>>>      */
>>>     protected abstract StringProperty getStringProperty();
>>>
>>
> 
> 


-- 
Quis custodiet ipsos custodes:
This email message is for the sole use of the intended recipient(s) and
may contain confidential information.  Any unauthorized review, use,
disclosure or distribution is prohibited.  If you are not the intended
recipient, please contact the sender by reply email and destroy all
copies of the original message.



More information about the Mondrian mailing list