/*
* Copyright 2015-2016 OpenCB
*
* 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 org.opencb.opencga.storage.server.grpc;
import io.grpc.stub.StreamObserver;
import org.apache.commons.lang3.StringUtils;
import org.opencb.commons.datastore.core.Query;
import org.opencb.commons.datastore.core.QueryOptions;
import org.opencb.commons.datastore.core.QueryResult;
import org.opencb.opencga.storage.core.config.StorageConfiguration;
import org.opencb.opencga.storage.core.exceptions.StorageEngineException;
import org.opencb.opencga.storage.core.variant.VariantStorageEngine;
import org.opencb.opencga.storage.core.variant.adaptors.VariantDBAdaptor;
import java.io.IOException;
import java.util.Iterator;
import static org.opencb.opencga.storage.server.grpc.GenericServiceModel.*;
import static org.opencb.opencga.storage.server.grpc.VariantProto.*;
/**
* Created by imedina on 29/12/15.
*/
public class VariantGrpcService extends VariantServiceGrpc.VariantServiceImplBase {
private GenericGrpcService genericGrpcService;
public VariantGrpcService(StorageConfiguration storageConfiguration) {
// super(storageConfiguration);
genericGrpcService = new GenericGrpcService(storageConfiguration);
}
@Deprecated
public VariantGrpcService(StorageConfiguration storageConfiguration, String defaultStorageEngine) {
// super(storageConfiguration, defaultStorageEngine);
genericGrpcService = new GenericGrpcService(storageConfiguration);
}
@Override
public void count(Request request, StreamObserver<GenericServiceModel.LongResponse> responseObserver) {
try {
// Creating the datastore Query object from the gRPC request Map of Strings
Query query = genericGrpcService.createQuery(request);
// checkAuthorizedHosts(query, request.getIp());
VariantDBAdaptor variantDBAdaptor = getVariantDBAdaptor(request);
QueryResult<Long> queryResult = variantDBAdaptor.count(query);
responseObserver.onNext(LongResponse.newBuilder().setValue(queryResult.getResult().get(0)).build());
responseObserver.onCompleted();
variantDBAdaptor.close();
} catch (IllegalAccessException | InstantiationException | ClassNotFoundException | StorageEngineException e) {
e.printStackTrace();
// } catch (NotAuthorizedHostException | NotAuthorizedUserException e) {
// e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void distinct(Request request, StreamObserver<StringArrayResponse> responseObserver) {
}
@Override
public void get(Request request, StreamObserver<Variant> responseObserver) {
try {
// Creating the datastore Query and QueryOptions objects from the gRPC request Map of Strings
Query query = genericGrpcService.createQuery(request);
QueryOptions queryOptions = genericGrpcService.createQueryOptions(request);
// checkAuthorizedHosts(query, request.getIp());
VariantDBAdaptor variantDBAdaptor = getVariantDBAdaptor(request);
// Iterator iterator = geneDBAdaptor.nativeIterator(query, queryOptions);
Iterator iterator = variantDBAdaptor.iterator(query, queryOptions);
while (iterator.hasNext()) {
org.opencb.biodata.models.variant.Variant next = (org.opencb.biodata.models.variant.Variant) iterator.next();
Variant convert = convert(next);
responseObserver.onNext(convert);
}
responseObserver.onCompleted();
variantDBAdaptor.close();
} catch (IllegalAccessException | InstantiationException | ClassNotFoundException | StorageEngineException e) {
e.printStackTrace();
// } catch (NotAuthorizedHostException e) {
// e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void getJson(Request request, StreamObserver<StringResponse> responseObserver) {
}
@Override
public void groupBy(Request request, StreamObserver<GroupResponse> responseObserver) {
}
private Variant convert(org.opencb.biodata.models.variant.Variant var) {
Variant build = Variant.newBuilder()
.setChromosome(var.getChromosome())
.setStart(var.getStart())
.setEnd(var.getEnd())
.setLength(var.getLength())
.setReference(var.getReference())
.setAlternate(var.getAlternate())
.addAllIds(var.getIds())
.build();
return build;
}
private VariantDBAdaptor getVariantDBAdaptor(Request request)
throws IllegalAccessException, InstantiationException, ClassNotFoundException, StorageEngineException {
// Setting storageEngine and database parameters. If the storageEngine is not provided then the server default is used
String storageEngine = genericGrpcService.getDefaultStorageEngine();
if (StringUtils.isNotEmpty(request.getStorageEngine())) {
storageEngine = request.getStorageEngine();
}
String database = genericGrpcService
.getStorageConfiguration().getStorageEngine(storageEngine).getVariant().getOptions().getString("database.name");
if (StringUtils.isNotEmpty(request.getDatabase())) {
database = request.getDatabase();
}
// Creating the VariantDBAdaptor to the parsed storageEngine and database
long start = System.currentTimeMillis();
VariantStorageEngine variantStorageEngine = genericGrpcService.storageEngineFactory.getVariantStorageEngine(storageEngine);
VariantDBAdaptor variantDBAdaptor = variantStorageEngine.getDBAdaptor(database);
// logger.debug("Connection to {}:{} in {}ms", storageEngine, database, System.currentTimeMillis() - start);
return variantDBAdaptor;
}
}