/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.metamodel.xml;
import java.io.File;
import java.util.Arrays;
import junit.framework.TestCase;
import org.apache.metamodel.DataContext;
import org.apache.metamodel.data.DataSet;
import org.apache.metamodel.query.Query;
import org.apache.metamodel.schema.Column;
import org.apache.metamodel.schema.Schema;
import org.apache.metamodel.schema.Table;
public class XmlSaxDataContextTest extends TestCase {
public void testBasicScenarios() throws Exception {
XmlSaxTableDef tableDef = new XmlSaxTableDef(
"/dependencies/dependency", new String[] {
"/dependencies/dependency/artifactId",
"/dependencies/dependency/groupId",
"/dependencies/dependency/version",
"/dependencies/dependency/scope" });
DataContext dc = new XmlSaxDataContext(new File(
"src/test/resources/xml_input_flatten_tables.xml"), tableDef);
final Schema schema = dc.getDefaultSchema();
assertEquals("Schema[name=/dependencies]", schema.toString());
assertEquals("[/dependency]", Arrays.toString(schema.getTableNames()));
final Table table = schema.getTableByName("/dependency");
assertEquals("[row_id, /artifactId, /groupId, /version, /scope]",
Arrays.toString(table.getColumnNames()));
// perform a regular query
DataSet ds = dc.query().from(table).select(table.getColumns())
.execute();
assertTrue(ds.next());
assertEquals("Row[values=[0, joda-time, joda-time, 1.5.2, compile]]",
ds.getRow().toString());
assertTrue(ds.next());
assertEquals("Row[values=[1, commons-math, commons-math, 1.1, null]]",
ds.getRow().toString());
assertTrue(ds.next());
assertTrue(ds.next());
assertTrue(ds.next());
assertTrue(ds.next());
assertEquals("Row[values=[5, hsqldb, hsqldb, 1.8.0.7, null]]", ds
.getRow().toString());
assertTrue(ds.next());
assertTrue(ds.next());
assertTrue(ds.next());
assertTrue(ds.next());
assertTrue(ds.next());
assertEquals(
"Row[values=[10, mysql-connector-java, mysql, 5.1.6, test]]",
ds.getRow().toString());
assertFalse(ds.next());
ds.close();
// perform a constrained query
Query q = dc.query().from(table).select("row_id").and("/groupId")
.where("/scope").isNotNull().toQuery();
q.setMaxRows(2);
ds = dc.executeQuery(q);
assertTrue(ds.next());
assertEquals("Row[values=[0, joda-time]]", ds.getRow().toString());
assertTrue(ds.next());
assertEquals("Row[values=[6, junit]]", ds.getRow().toString());
assertFalse(ds.next());
ds.close();
}
public void testParentTagIndex() throws Exception {
final XmlSaxTableDef employeeTableDef = new XmlSaxTableDef(
"/root/organization/employees/employee", new String[] {
"/root/organization/employees/employee/name",
"/root/organization/employees/employee/gender",
"index(/root/organization/employees)",
"index(/root/organization)" });
final XmlSaxTableDef organizationTableDef = new XmlSaxTableDef(
"/root/organization", new String[] { "/root/organization/name",
"/root/organization@type" });
final DataContext dc = new XmlSaxDataContext(
new File(
"src/test/resources/xml_input_parent_and_child_relationship.xml"),
employeeTableDef, organizationTableDef);
final Schema schema = dc.getDefaultSchema();
assertEquals("Schema[name=/root]", schema.toString());
assertEquals("[/employee, /organization]",
Arrays.toString(schema.getTableNames()));
// organization assertions
final Table organizationTable = schema.getTableByName("/organization");
{
assertEquals("[row_id, /name, @type]",
Arrays.toString(organizationTable.getColumnNames()));
DataSet ds = dc.query().from(organizationTable)
.select(organizationTable.getColumns()).execute();
assertTrue(ds.next());
assertEquals("Row[values=[0, Company A, governmental]]", ds
.getRow().toString());
assertTrue(ds.next());
assertEquals("Row[values=[1, Company B, company]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[2, Company C, company]]", ds.getRow()
.toString());
assertFalse(ds.next());
ds.close();
}
// employee assertions
final Table employeeTable = schema.getTableByName("/employee");
{
assertEquals(
"[row_id, /name, /gender, index(/root/organization/employees), index(/root/organization)]",
Arrays.toString(employeeTable.getColumnNames()));
DataSet ds = dc.query().from(employeeTable)
.select(employeeTable.getColumns()).execute();
assertTrue(ds.next());
assertEquals("Row[values=[0, John Doe, M, 0, 0]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[1, Jane Doe, F, 0, 0]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[2, Peter, M, 1, 1]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[3, Bob, M, 1, 1]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[4, Cindy, F, 1, 1]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[5, John, M, 1, 1]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[6, James, M, 2, 2]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[7, Suzy, F, 2, 2]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[8, Carla, F, 3, 2]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[9, Vincent, M, 3, 2]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[10, Barbara, F, 3, 2]]", ds.getRow()
.toString());
assertFalse(ds.next());
ds.close();
}
// do a join
{
Column fk = employeeTable
.getColumnByName("index(/root/organization)");
assertNotNull(fk);
Column empName = employeeTable.getColumnByName("/name");
assertNotNull(empName);
Column orgId = organizationTable.getColumnByName("row_id");
assertNotNull(orgId);
Column orgName = organizationTable.getColumnByName("/name");
assertNotNull(orgName);
Query q = dc.query().from(employeeTable)
.innerJoin(organizationTable).on(fk, orgId).select(empName)
.as("employee").select(orgName).as("company").toQuery();
assertEquals(
"SELECT /employee./name AS employee, /organization./name AS company "
+ "FROM /root./employee INNER JOIN /root./organization "
+ "ON /employee.index(/root/organization) = /organization.row_id",
q.toSql());
DataSet ds = dc.executeQuery(q);
assertTrue(ds.next());
assertEquals("Row[values=[John Doe, Company A]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[Jane Doe, Company A]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[Peter, Company B]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[Bob, Company B]]", ds.getRow().toString());
assertTrue(ds.next());
assertEquals("Row[values=[Cindy, Company B]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[John, Company B]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[James, Company C]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[Suzy, Company C]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[Carla, Company C]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[Vincent, Company C]]", ds.getRow()
.toString());
assertTrue(ds.next());
assertEquals("Row[values=[Barbara, Company C]]", ds.getRow()
.toString());
ds.close();
}
}
}