/*
* 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.AbstractWriteInterface;
import com.torodb.backend.InternalField;
import com.torodb.backend.SqlHelper;
import com.torodb.backend.tables.MetaDocPartTable;
import com.torodb.core.transaction.metainf.FieldType;
import com.torodb.core.transaction.metainf.MetaDocPart;
import com.torodb.core.transaction.metainf.MetaField;
import com.torodb.core.transaction.metainf.MetaScalar;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
*
*/
@Singleton
public class DerbyWriteInterface extends AbstractWriteInterface {
@Inject
public DerbyWriteInterface(DerbyMetaDataReadInterface metaDataReadInterface,
DerbyErrorHandler errorHandler,
SqlHelper sqlHelper) {
super(metaDataReadInterface, errorHandler, sqlHelper);
}
@Override
protected String getDeleteDocPartsStatement(String schemaName, String tableName,
Collection<Integer> dids) {
StringBuilder sb = new StringBuilder()
.append("DELETE FROM \"")
.append(schemaName)
.append("\".\"")
.append(tableName)
.append("\" WHERE \"")
.append(MetaDocPartTable.DocPartTableFields.DID.fieldName)
.append("\" IN (");
for (Integer did : dids) {
sb.append(did)
.append(',');
}
sb.setCharAt(sb.length() - 1, ')');
String statement = sb.toString();
return statement;
}
@Override
protected String getInsertDocPartDataStatement(String schemaName, MetaDocPart metaDocPart,
Iterator<MetaField> metaFieldIterator, Iterator<MetaScalar> metaScalarIterator,
Collection<InternalField<?>> internalFields, List<FieldType> fieldTypeList) {
final StringBuilder insertStatementBuilder = new StringBuilder(2048);
final StringBuilder insertStatementValuesBuilder = new StringBuilder(1024);
insertStatementBuilder.append("INSERT INTO \"")
.append(schemaName)
.append("\".\"")
.append(metaDocPart.getIdentifier())
.append("\" (");
insertStatementValuesBuilder.append(" VALUES (");
for (InternalField<?> internalField : internalFields) {
insertStatementBuilder.append("\"")
.append(internalField.getName())
.append("\",");
insertStatementValuesBuilder.append("?,");
}
while (metaScalarIterator.hasNext()) {
MetaScalar metaScalar = metaScalarIterator.next();
insertStatementBuilder.append("\"")
.append(metaScalar.getIdentifier())
.append("\",");
insertStatementValuesBuilder.append("?,");
fieldTypeList.add(metaScalar.getType());
}
while (metaFieldIterator.hasNext()) {
MetaField metaField = metaFieldIterator.next();
insertStatementBuilder.append("\"")
.append(metaField.getIdentifier())
.append("\",");
insertStatementValuesBuilder.append("?,");
fieldTypeList.add(metaField.getType());
}
insertStatementBuilder.setCharAt(insertStatementBuilder.length() - 1, ')');
insertStatementValuesBuilder.setCharAt(insertStatementValuesBuilder.length() - 1, ')');
insertStatementBuilder.append(insertStatementValuesBuilder);
String statement = insertStatementBuilder.toString();
return statement;
}
}