Saiku 3 автономно с PostgreSQL - ошибка Мондриана при выборе
Я использую последнюю версию Saiku 3.8.3 в автономном режиме, и у меня возникают некоторые проблемы с использованием базы данных PostgreSQL 9.1 с различными схемами, отличными от PUBLIC.
Я сделал источник данных, и он подключился правильно, вот источник данных, который я использую без личных данных:
type=OLAP
name=chegadaturistas
driver=mondrian.olap4j.MondrianOlap4jDriver
location=jdbc:mondrian:Jdbc=jdbc:postgresql://DBNAME:PORT/DB;Catalog=mondrian:///datasources/chegada_turistas.xml;JdbcDrivers=org.postgresql.Driver;
username=postgres
password=PASSWORD
security.enabled=false
Я также создал схему Мондриана с легантичностью, потому что я использовал Schema Workbench. Это схема, которую я создал:
<Schema name="DEPES" description="DEPES">
<Cube name="CHEGADAS" visible="true" cache="true" enabled="true">
<Table name="chegada" schema="fato" alias="chegada">
</Table>
<Dimension type="StandardDimension" visible="true" foreignKey="id_tempo" highCardinality="false" name="Ano">
<Hierarchy name="ANO" visible="true" hasAll="true" allMemberName="Todos os Anos" primaryKey="id_tempo">
<Table name="tempo" schema="dimensao" alias="Tempo">
</Table>
<Level name="ANO" visible="true" column="nu_ano" nameColumn="nu_ano" ordinalColumn="nu_ano" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
<Dimension type="StandardDimension" visible="true" foreignKey="id_origem" highCardinality="false" name="Origem">
<Hierarchy name="Origem" visible="true" hasAll="true" allMemberName="Todas as Origens" primaryKey="id_origem">
<Table name="origem" schema="dimensao">
</Table>
<Level name="Continente" visible="true" column="no_continente" nameColumn="no_continente" ordinalColumn="no_continente" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Pais" visible="true" column="no_pais" nameColumn="no_pais" ordinalColumn="no_pais" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
<Dimension type="StandardDimension" visible="true" foreignKey="id_via" highCardinality="false" name="Via">
<Hierarchy name="Via" visible="true" hasAll="true" allMemberName="Todas as Vias" primaryKey="id_via">
<Table name="via" schema="dimensao">
</Table>
<Level name="Nome" visible="true" column="id_via" nameColumn="no_via" ordinalColumn="no_via" type="Integer" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
<Dimension type="StandardDimension" visible="true" foreignKey="id_destino" highCardinality="false" name="Destino">
<Hierarchy name="Destino" visible="true" hasAll="true" allMemberName="Todos os Destinos" primaryKey="id_destino">
<Table name="destino" schema="dimensao">
</Table>
<Level name="Regiao" visible="true" column="no_regiao" nameColumn="no_regiao" ordinalColumn="no_regiao" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="UF" visible="true" column="no_uf" nameColumn="no_uf" ordinalColumn="no_uf" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
<Dimension type="StandardDimension" visible="true" foreignKey="id_tempo" highCardinality="false" name="Mes">
<Hierarchy name="Mes" visible="true" hasAll="true" allMemberName="Todos os Meses" primaryKey="id_tempo">
<Table name="tempo" schema="dimensao">
</Table>
<Level name="Nome do Mes" visible="true" column="nu_mes" nameColumn="no_mes" ordinalColumn="nu_mes" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Número do Mes" visible="true" column="nu_mes" nameColumn="nu_mes" ordinalColumn="nu_mes" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
<Dimension type="StandardDimension" visible="true" foreignKey="id_tempo" highCardinality="false" name="Semestre">
<Hierarchy name="Semestre" visible="true" hasAll="true" allMemberName="Todos os Semestres" primaryKey="id_tempo">
<Table name="tempo" schema="dimensao">
</Table>
<Level name="Número do Semestre" visible="true" column="nu_semestre" nameColumn="nu_semestre" ordinalColumn="nu_semestre" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Descrição do Semestre" visible="true" column="nu_semestre" nameColumn="no_semestre" ordinalColumn="no_semestre" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
<Measure name="qt_chegada" column="qt_chegada" datatype="Integer" aggregator="sum" caption="Chegadas" description="Quantidade de Turistas" visible="true">
</Measure>
</Cube>
<Schema>
Проблема в том, что когда я запускаю Saiku, я не вижу схему, и в журнале есть эта ошибка:
2016-04-08 08:17:31,976 WARN [mondrian.rolap.RolapSchema] Model is in legacy format
2016-04-08 08:17:36,725 ERROR [org.saiku.web.core.SecurityAwareConnectionManager] Error connecting: chegadaturistas
mondrian.olap.MondrianException: Mondrian Error:Internal error: Reading row count from table [null, null, tempo]; sql=[select count(*) from "tempo"]
Итак, я заметил, что выбор, используемый mondrian в COUNT, был только с таблицей, а не с schema.table, который должен использоваться в PostgreSQL. Чтобы убедиться, что я создал VIEW в общедоступной схеме PostgreSQL, он не дал мне этой ошибки в таблице "темп", а дал мне другую. Есть ли способ заставить Мондриана использовать SCHEMA.TABLE на выборках для PosgreSQL?
1 ответ
Проблема решена! Кажется, когда вы помещаете устаревший Mondrian 3 XML в Mondrian 4 (Saiku 3.X использует Mondrian 4), он обновляет XML, но просто "забывает" поместить тег SCHEMA базы данных после его обновления. Вот решение, которое я сделал благодаря Тому Барберу (который ответил на это в группе Сайку в Google.
Так что просто найдите log4j.xml, раскомментируйте это (не дублируйте, это уже прокомментировано в файле):
<appender name="MONDRIAN" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="${catalina.base}/logs/mondrian.log"/>
<param name="Append" value="false"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="1"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
</layout>
</appender>
<category name="mondrian">
<priority value="DEBUG"/>
<appender-ref ref="MONDRIAN"/>
</category>
ОСТАНОВИТЬ SAIKU и начать его снова. Подождите немного и откройте saiku.log (он находится в "saiku_directory"\tomcat\logs\saiku.log, найдите строку примерно так:
<Schema name="YOUR_SCHEMA_NAME" missingLink="ignore" metamodelVersion="4.300">
<PhysicalSchema>
........
Скопируйте всю схему и вставьте новый файл file.xml, вставьте тег schema="SCHEMA_NAME" во все теги TABLE следующим образом:
OLD:
<Table name="chegada" alias="chegada">
NEW:
<Table name="chegada" schema="fato" alias="chegada">
Запустите SAIKU снова, загрузите эту схему, перезапустите saiku.
Задача решена!:D