/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. 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.wso2.siddhi.extension.table.rdbms;
import org.apache.hadoop.util.bloom.CountingBloomFilter;
import org.apache.hadoop.util.bloom.Key;
import org.apache.hadoop.util.hash.Hash;
import org.wso2.siddhi.core.event.ComplexEvent;
import org.wso2.siddhi.core.exception.ExecutionPlanRuntimeException;
import org.wso2.siddhi.query.api.definition.Attribute;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class BloomFilterImpl {
private CountingBloomFilter[] bloomFilters;
private int bloomFilterSize;
private int bloomFilterHashFunction;
private List<Attribute> attributeList;
public BloomFilterImpl(int bloomFilterSize, int bloomFilterHashFunction, List<Attribute> attributeList) {
this.bloomFilterSize = bloomFilterSize;
this.bloomFilterHashFunction = bloomFilterHashFunction;
this.attributeList = attributeList;
}
public void buildBloomFilters(ResultSet results) {
CountingBloomFilter[] bloomFilters = new CountingBloomFilter[attributeList.size()];
for (int i = 0; i < bloomFilters.length; i++) {
bloomFilters[i] = new CountingBloomFilter(bloomFilterSize, bloomFilterHashFunction, Hash.MURMUR_HASH);
}
try {
while (results.next()) {
for (int i = 0; i < bloomFilters.length; i++) {
switch (attributeList.get(i).getType()) {
case INT:
bloomFilters[i].add(new Key(Integer.toString(results.getInt(i + 1)).getBytes()));
break;
case LONG:
bloomFilters[i].add(new Key(Long.toString(results.getLong(i + 1)).getBytes()));
break;
case FLOAT:
bloomFilters[i].add(new Key(Float.toString(results.getFloat(i + 1)).getBytes()));
break;
case DOUBLE:
bloomFilters[i].add(new Key(Double.toString(results.getDouble(i + 1)).getBytes()));
break;
case STRING:
String attributeValue = results.getString(i + 1);
if (attributeValue != null) {
bloomFilters[i].add(new Key(attributeValue.getBytes()));
}
break;
case BOOL:
bloomFilters[i].add(new Key(Boolean.toString(results.getBoolean(i + 1)).getBytes()));
break;
}
}
}
results.close();
this.bloomFilters = bloomFilters;
} catch (SQLException ex) {
throw new ExecutionPlanRuntimeException("Error while initiating blooms filter with db data, " + ex
.getMessage(), ex);
}
}
public void addToBloomFilters(ComplexEvent event) {
for (int i = 0; i < attributeList.size(); i++) {
if (event.getOutputData()[i] != null) {
bloomFilters[i].add(new Key(event.getOutputData()[i].toString().getBytes()));
}
}
}
public void addToBloomFilters(Object[] obj) {
for (int i = 0; i < attributeList.size(); i++) {
if (obj[i] != null) {
bloomFilters[i].add(new Key(obj[i].toString().getBytes()));
}
}
}
public void removeFromBloomFilters(Object[] obj) {
for (int i = 0; i < attributeList.size(); i++) {
if (obj[i] != null) {
bloomFilters[i].delete(new Key(obj[i].toString().getBytes()));
}
}
}
public CountingBloomFilter[] getBloomFilters() {
return bloomFilters;
}
}