/**
* Copyright (C) 2014 Stratio (http://stratio.com)
*
* Licensed 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 com.stratio.ingestion.sink.jdbc;
import org.apache.flume.Event;
import org.jooq.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
class MappingQueryGenerator implements QueryGenerator {
private static final Logger log = LoggerFactory.getLogger(MappingQueryGenerator.class);
private Table table;
public MappingQueryGenerator(DSLContext dslContext, final String tableName) {
Meta meta = dslContext.meta();
for (Table table : meta.getTables()) {
System.out.println(table.getName());
if (table.getName().equalsIgnoreCase(tableName)) {
this.table = table;
break;
}
}
if (this.table == null) {
throw new JDBCSinkException("Table not found: " + tableName);
}
}
public boolean executeQuery(DSLContext dslContext, final List<Event> events) {
InsertSetStep insert = dslContext.insertInto(this.table);
int mappedEvents = 0;
for (Event event : events) {
Map<Field, Object> fieldValues = new HashMap<Field, Object>();
for (Map.Entry<String, String> entry : event.getHeaders().entrySet()) {
Field field = null;
for (Field f: this.table.fields()) {
if (f.getName().equalsIgnoreCase(entry.getKey())) {
field = f;
break;
}
}
if (field == null) {
log.trace("Ignoring field: {}", entry.getKey());
continue;
}
DataType dataType = field.getDataType();
fieldValues.put(field, dataType.convert(entry.getValue()));
}
if (fieldValues.isEmpty()) {
log.debug("Ignoring event, no mapped fields.");
} else {
mappedEvents++;
if (insert instanceof InsertSetMoreStep) {
insert = ((InsertSetMoreStep) insert).newRecord();
}
for (Map.Entry<Field, Object> entry : fieldValues.entrySet()) {
insert = insert.set(entry.getKey(), entry.getValue());
}
}
}
if (insert instanceof InsertSetMoreStep) {
int result = ((InsertSetMoreStep) insert).execute();
if (result != mappedEvents) {
log.warn("Mapped {} events, inserted {}.", mappedEvents, result);
return false;
}
} else {
log.debug("No insert.");
}
return true;
}
}