/*
* ToroDB
* Copyright © 2014 8Kdata Technology (www.8kdata.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.torodb.backend.derby;
import com.torodb.backend.AbstractReadInterface;
import com.torodb.backend.InternalField;
import com.torodb.backend.SqlHelper;
import com.torodb.backend.tables.MetaDocPartTable.DocPartTableFields;
import com.torodb.core.TableRef;
import com.torodb.core.TableRefFactory;
import com.torodb.core.transaction.metainf.MetaDatabase;
import com.torodb.core.transaction.metainf.MetaDocPart;
import org.jooq.Converter;
import org.jooq.lambda.tuple.Tuple2;
import java.util.Collection;
import java.util.Iterator;
import java.util.stream.Stream;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class DerbyReadInterface extends AbstractReadInterface {
private final DerbyMetaDataReadInterface metaDataReadInterface;
@Inject
public DerbyReadInterface(DerbyMetaDataReadInterface metaDataReadInterface,
DerbyDataTypeProvider dataTypeProvider,
DerbyErrorHandler errorhandler, SqlHelper sqlHelper, TableRefFactory tableRefFactory) {
super(metaDataReadInterface, dataTypeProvider, errorhandler, sqlHelper, tableRefFactory);
this.metaDataReadInterface = metaDataReadInterface;
}
@Override
protected String getReadCollectionDidsWithFieldEqualsToStatement(String schemaName,
String rootTableName,
String columnName) {
StringBuilder sb = new StringBuilder()
.append("SELECT \"")
.append(DocPartTableFields.DID.fieldName)
.append("\" FROM \"")
.append(schemaName)
.append("\".\"")
.append(rootTableName)
.append("\" WHERE \"")
.append(schemaName)
.append("\".\"")
.append(rootTableName)
.append("\".\"")
.append(columnName)
.append("\" = ? GROUP BY \"")
.append(DocPartTableFields.DID.fieldName)
.append("\" ORDER BY \"")
.append(DocPartTableFields.DID.fieldName)
.append('"');
String statement = sb.toString();
return statement;
}
@Override
protected String getReadCollectionDidsWithFieldInStatement(String schemaName,
String rootTableName, Stream<Tuple2<String, Integer>> valuesCountList) {
StringBuilder sb = new StringBuilder()
.append("SELECT \"")
.append(DocPartTableFields.DID.fieldName)
.append("\" FROM \"")
.append(schemaName)
.append("\".\"")
.append(rootTableName)
.append("\" WHERE \"");
Iterator<Tuple2<String, Integer>> valuesCountMapEntryIterator =
valuesCountList.iterator();
while (valuesCountMapEntryIterator.hasNext()) {
Tuple2<String, Integer> valuesCountMapEntry =
valuesCountMapEntryIterator.next();
String columnName = valuesCountMapEntry.v1;
Integer valuesCount = valuesCountMapEntry.v2;
sb
.append(rootTableName)
.append("\".\"")
.append(columnName)
.append("\" IN (");
for (int index = 0; index < valuesCount; index++) {
sb.append("?,");
}
sb.setCharAt(sb.length() - 1, ')');
}
sb.append(" ORDER BY \"")
.append(DocPartTableFields.DID.fieldName)
.append('"');
String statement = sb.toString();
return statement;
}
@Override
protected String getReadCollectionDidsAndProjectionWithFieldInStatement(String schemaName,
String rootTableName,
String columnName, int valuesCount) {
StringBuilder sb = new StringBuilder()
.append("SELECT \"")
.append(DocPartTableFields.DID.fieldName)
.append("\",\"")
.append(columnName)
.append("\" FROM \"")
.append(schemaName)
.append("\".\"")
.append(rootTableName)
.append("\" WHERE \"")
.append(columnName)
.append("\" IN (");
for (int index = 0; index < valuesCount; index++) {
sb.append("?,");
}
sb.setCharAt(sb.length() - 1, ')');
String statement = sb.toString();
return statement;
}
@Override
protected String getReadAllCollectionDidsStatement(String schemaName, String rootTableName) {
StringBuilder sb = new StringBuilder()
.append("SELECT \"")
.append(DocPartTableFields.DID.fieldName)
.append("\" FROM \"")
.append(schemaName)
.append("\".\"")
.append(rootTableName)
.append('"');
String statement = sb.toString();
return statement;
}
@Override
protected String getReadCountAllStatement(String schemaName, String rootTableName) {
StringBuilder sb = new StringBuilder()
.append("SELECT COUNT(1) FROM \"")
.append(schemaName)
.append("\".\"")
.append(rootTableName)
.append('"');
String statement = sb.toString();
return statement;
}
@Override
protected String getDocPartStatament(MetaDatabase metaDatabase, MetaDocPart metaDocPart,
Collection<Integer> dids) {
StringBuilder sb = new StringBuilder()
.append("SELECT ");
Collection<InternalField<?>> internalFields = metaDataReadInterface.getInternalFields(
metaDocPart);
for (InternalField<?> internalField : internalFields) {
sb.append('"')
.append(internalField.getName())
.append("\",");
}
metaDocPart.streamScalars().forEach(metaScalar -> {
sb.append('"')
.append(metaScalar.getIdentifier())
.append("\",");
});
metaDocPart.streamFields().forEach(metaField -> {
sb.append('"')
.append(metaField.getIdentifier())
.append("\",");
});
sb.setCharAt(sb.length() - 1, ' ');
sb
.append("FROM \"")
.append(metaDatabase.getIdentifier())
.append("\".\"")
.append(metaDocPart.getIdentifier())
.append("\" WHERE \"")
.append(metaDataReadInterface.getMetaDocPartTable().DID.getName())
.append("\" IN (");
Converter<?, Integer> converter =
metaDataReadInterface.getMetaDocPartTable().DID.getDataType().getConverter();
for (Integer requestedDoc : dids) {
sb.append(converter.to(requestedDoc))
.append(',');
}
sb.setCharAt(sb.length() - 1, ')');
if (!metaDocPart.getTableRef().isRoot()) {
sb.append(" ORDER BY ");
Collection<InternalField<?>> internalFieldsIt = metaDataReadInterface
.getReadInternalFields(metaDocPart);
for (InternalField<?> internalField : internalFieldsIt) {
sb.append('"')
.append(internalField.getName())
.append("\",");
}
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
@Override
protected String getLastRowIdUsedStatement(MetaDatabase metaDatabase, MetaDocPart metaDocPart) {
TableRef tableRef = metaDocPart.getTableRef();
StringBuilder sb = new StringBuilder();
sb.append("SELECT max(\"")
.append(getPrimaryKeyColumnIdentifier(tableRef))
.append("\") FROM \"")
.append(metaDatabase.getIdentifier())
.append("\".\"")
.append(metaDocPart.getIdentifier())
.append("\"");
String statement = sb.toString();
return statement;
}
}