Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright (C) 2012 Timo Vesalainen
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package org.vesalainen.parsers.sql;
import org.vesalainen.parsers.sql.util.ArrayMap;
import java.io.InputStream;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
import org.vesalainen.parser.GenClassFactory;
import org.vesalainen.parser.util.InputReader;
import org.vesalainen.parsers.sql.util.JoinMap;
/**
*
* @author Timo Vesalainen
* @param DB row
* @param DB column
*/
public abstract class Engine implements SQLConverter, Metadata
{
private SqlParser parser;
private ArrayMap
,TableContext> others;
public Engine()
{
parser = (SqlParser) GenClassFactory.getGenInstance(SqlParser.class);
}
protected Engine(Class> grammar)
{
parser = (SqlParser) GenClassFactory.getGenInstance(grammar);
}
public Statement prepare(String sql)
{
Deque>> tableListStack = new ArrayDeque<>();
LinkedHashMap placeholderMap = new LinkedHashMap<>();
return parser.parse(sql, this, tableListStack, placeholderMap, null);
}
public Statement prepare(InputStream is)
{
Deque>> tableListStack = new ArrayDeque<>();
LinkedHashMap placeholderMap = new LinkedHashMap<>();
return parser.parse(is, this, tableListStack, placeholderMap, null);
}
public FetchResult show(String identifier)
{
FetchResult fr = new FetchResult<>(this, "Tablename");
for (TableMetadata tm : getTables())
{
fr.addRowArray(tm.getName());
}
return fr;
}
public FetchResult describe(String tablename)
{
FetchResult fr = new FetchResult<>(this, "Column", "Count", "Indexed", "Unique");
TableMetadata tm = getTableMetadata(tablename);
if (tm != null)
{
for (ColumnMetadata cm : tm.getColumns())
{
fr.addRowArray(cm.getName(), cm.getCount(), cm.isIndexed(), cm.isUnique());
}
}
return fr;
}
/**
* Check the sql statement without executing it.
* @param sql
*/
public void check(String sql)
{
parser.check(sql, null);
}
/**
* Check the sql statement without executing it.
* @param sql
*/
public void check(InputStream sql)
{
parser.check(sql, null);
}
/**
*
* @param reader
*/
public void check(InputReader reader)
{
parser.check(reader, null);
}
/**
*
* @param reader
* @param locator
*/
public void check(InputReader reader, SQLLocator locator)
{
parser.check(reader, locator);
}
public FetchResult execute(String sql)
{
Statement prepared = prepare(sql);
return prepared.execute();
}
public FetchResult execute(InputStream is)
{
Statement prepared = prepare(is);
return prepared.execute();
}
public UpdateableFetchResult selectForUpdate(SelectStatement select)
{
UpdateableFetchResult result = new UpdateableFetchResult<>(this, select);
select(select, result, true);
return result;
}
public OrderedFetchResult select(SelectStatement select)
{
OrderedFetchResult result = new OrderedFetchResult<>(this, select);
select(select, result, false);
return result;
}
private void select(SelectStatement select, OrderedFetchResult result, boolean update)
{
startProgressMonitor(0, select.getTableCount()*3+1);
int progress = 0;
others = new ArrayMap<>(select.getTables());
TableContextComparator tableContextComparator = getTableContextComparator();
ArrayMap
,TableContext> tableResults = new ArrayMap<>(select.getTables());
List> tableList = new ArrayList<>();
for (Table table : select.getTables())
{
TableContext tc = createTableContext(table, others);
others.put(table, tc);
tableResults.put(table, tc);
tableList.add(tc);
}
Condition condition = select.getCondition();
if (condition == null && select.getTableCount() > 1)
{
throw new IllegalArgumentException("no conditions");
}
int index = tableList.size();
TableContext[] resultArray = new TableContext[index];
while (!tableList.isEmpty())
{
updateProgressMonitor(++progress);
index--;
Collections.sort(tableList, tableContextComparator);
TableContext currentTable = tableList.get(0);
Collection rows = fetch(currentTable, update);
updateProgressMonitor(++progress);
resultArray[index] = currentTable;
currentTable.setData(rows);
updateProgressMonitor(++progress);
tableList.remove(currentTable);
currentTable.updateHints(tableList);
}
sort(resultArray);
ArrayMap