/*
* Copyright(C) 1999-2010 Alibaba Group Holding Limited All rights reserved. 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.alibaba.doris.client.operation.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.doris.client.AccessException;
import com.alibaba.doris.client.cn.OperationDataConverter;
import com.alibaba.doris.client.net.Connection;
import com.alibaba.doris.client.net.DataSource;
import com.alibaba.doris.client.net.NetException;
import com.alibaba.doris.client.operation.AbstractOperation;
import com.alibaba.doris.client.operation.Operation;
import com.alibaba.doris.client.operation.OperationData;
import com.alibaba.doris.client.operation.OperationDataSourceGroup;
import com.alibaba.doris.client.operation.failover.PeerCallback;
import com.alibaba.doris.client.operation.failover.impl.DefaultPeerCallback;
import com.alibaba.doris.client.operation.result.DataSourceOpResult;
import com.alibaba.doris.common.Namespace;
import com.alibaba.doris.common.data.Key;
import com.alibaba.doris.common.data.Value;
import com.alibaba.doris.common.operation.OperationEnum;
import com.alibaba.doris.common.route.DorisRouterException;
/**
* PutOperation
*
* @author Kun He (Raymond He), kun.hek@alibaba-inc.com
* @since 1.0 2011-4-22
*/
public class PutsOperation extends AbstractOperation {
private static final Logger logger = LoggerFactory.getLogger(PutsOperation.class);
/**
* @see com.alibaba.doris.framework.operation.AbstractOperation#getName()
*/
public String getName() {
return "puts";
}
public OperationEnum getOperationType(OperationData operationData) {
return OperationEnum.WRITE;
}
@Override
public int getOperationCount(OperationData operationData) {
return operationData.getNamespace().getCopyCount();
}
@Override
protected PeerCallback generatePeerCallback(DataSource dataSource, OperationData operationData) {
return new DefaultPeerCallback(dataSource, operationData) {
@Override
public PeerCallback execute() throws AccessException {
try {
Connection connection = dataSource.getConnection();
Key commuKey = (Key) operationData.getKey();
Value commuValue = (Value) operationData.getArgs().get(1);
this.future = connection.put(commuKey, commuValue);
} catch (NetException e) {
throw new AccessException("put connection exception.", e);
} catch (Throwable t) {
throw new AccessException("put operation exception." + t, t);
}
return this;
}
};
}
@Override
protected void buildLogicParam(List<OperationDataSourceGroup> operationDataSourceGroups,
List<OperationData> operationDatas, OperationData operationData,
OperationDataConverter operationDataConverter, long routeVersion)
throws DorisRouterException {
int opCount = getOperationCount(operationData);
Map<Object, Object> kvs = (Map<Object, Object>) operationData.getArgs().get(0);
Operation operation = operationData.getOperation();
Namespace namespace = operationData.getNamespace();
for (Entry<Object, Object> e : kvs.entrySet()) {
List<Object> args = new ArrayList<Object>(1);
args.add(e.getKey());
args.add(e.getValue());
OperationData tempOperationData = new OperationData(operation, namespace, args);
Key phKey = operationDataConverter.buildKey(tempOperationData, routeVersion);
tempOperationData.setKey(phKey);
OperationDataSourceGroup operationDataSourceGroup = dataSourceManager.getOperationDataSourceGroup(tempOperationData.getOperation().getOperationType(operationData),
opCount,
phKey.getPhysicalKey());
operationDataSourceGroups.add(operationDataSourceGroup);
operationDatas.add(tempOperationData);
}
}
@Override
protected void reportConsisitentError(OperationData operationData,
List<OperationDataSourceGroup> operationDataSourceGroups, String exceptionMsg) {
super.doReportConsistentError(operationData, operationDataSourceGroups, exceptionMsg);
}
@Override
protected void mergeOperationResult(List<List<DataSourceOpResult>> dsOpResults, List<OperationData> operationDatas) {
if (operationDatas.get(0).getNamespace().isMultiRead()) {
super.needOneNodeSuccess(dsOpResults, operationDatas);
} else {
super.needAllNodeSuccess(dsOpResults, operationDatas);
}
}
}