package org.wonderdb.query.parse; /******************************************************************************* * Copyright 2013 Vilas Athavale * * 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. *******************************************************************************/ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.jboss.netty.buffer.ChannelBuffer; import org.wonderdb.block.record.manager.TableRecordManager; import org.wonderdb.cluster.Shard; import org.wonderdb.expression.AndExpression; import org.wonderdb.parser.TableDef; import org.wonderdb.parser.jtree.SimpleNode; import org.wonderdb.parser.jtree.SimpleNodeHelper; import org.wonderdb.parser.jtree.UQLParserTreeConstants; import org.wonderdb.query.parser.jtree.DBSelectQueryJTree; import org.wonderdb.schema.CollectionMetadata; import org.wonderdb.schema.SchemaMetadata; import org.wonderdb.types.ColumnNameMeta; import org.wonderdb.types.RecordId; public class DBDeleteQuery extends BaseDBQuery { SimpleNode deleteNode = null; List<CollectionAlias> caList = null; Map<String, CollectionAlias> fromMap = null; SimpleNode filterNode = null; DBSelectQueryJTree selQuery = null; AndExpression andExp = null; public DBDeleteQuery(String q, SimpleNode query, int type, ChannelBuffer buffer) { super(q, query, type, buffer); this.deleteNode = query; SimpleNode tableNode = SimpleNodeHelper.getInstance().getFirstNode(deleteNode, UQLParserTreeConstants.JJTTABLEDEF); List<TableDef> tDefList = new ArrayList<TableDef>(); TableDef tDef = SimpleNodeHelper.getInstance().getTableDef(tableNode); tDefList.add(tDef); caList = getCaList(tDefList); fromMap = getFromMap(caList); filterNode = SimpleNodeHelper.getInstance().getFirstNode(deleteNode, UQLParserTreeConstants.JJTFILTEREXPRESSION); CollectionMetadata colMeta = SchemaMetadata.getInstance().getCollectionMetadata(getCollection()); List<ColumnNameMeta> selectColumns = colMeta.getCollectionColumns(); CollectionAlias ca = caList.get(0); List<Integer> columnIdList = new ArrayList<Integer>(selectColumns.size()); Map<CollectionAlias, List<Integer>> selectColumnList = new HashMap<CollectionAlias, List<Integer>>(); selectColumnList.put(ca, columnIdList); for (int i = 0; i < selectColumns.size(); i++) { ColumnNameMeta cnm = selectColumns.get(i); columnIdList.add(cnm.getCoulmnId()); } selQuery = new DBSelectQueryJTree(getQueryString(), query, fromMap, selectColumnList, filterNode, type, buffer); andExp = selQuery.getAndExpression(); } public String getCollection() { return caList.get(0).getCollectionName(); } private List<CollectionAlias> getCaList(List<TableDef> list) { List<CollectionAlias> retList = new ArrayList<CollectionAlias>(); for (int i = 0; i < list.size(); i++) { TableDef tDef = list.get(i); CollectionAlias ca = new CollectionAlias(tDef.table, tDef.alias); retList.add(ca); } return retList; } private Map<String, CollectionAlias> getFromMap(List<CollectionAlias> caList) { Map<String, CollectionAlias> fromMap = new HashMap<String, CollectionAlias>(); for (int i = 0; i < caList.size(); i++) { CollectionAlias ca = caList.get(i); fromMap.put(ca.getAlias(), ca); } return fromMap; } public int execute(Shard shard) { List<Map<CollectionAlias, RecordId>> recListList = selQuery.executeGetDC(shard); int count = 0; for (int i = 0; i < recListList.size(); i++) { Map<CollectionAlias, RecordId> recList = recListList.get(i); if (recList.size() == 1) { Iterator<CollectionAlias> iter = recList.keySet().iterator(); while (iter.hasNext()) { CollectionAlias ca = iter.next(); RecordId recId = recList.get(ca); count = count + TableRecordManager.getInstance().delete(getCollection(), shard, recId, filterNode, fromMap); } } } return count; } @Override public AndExpression getExpression() { return andExp; } }