/**
* Copyright (C) 2010 EdgyTech LLC.
*
* 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.edgytech.umongo;
import com.edgytech.swingfast.ButtonBase;
import com.edgytech.swingfast.EnumListener;
import com.edgytech.swingfast.FormDialog;
import com.edgytech.swingfast.ListArea;
import com.edgytech.swingfast.XmlComponentUnit;
import com.edgytech.umongo.AggregateDialog.Item;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.util.JSON;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JDialog;
/**
*
* @author antoine
*/
public class AggregateDialog extends FormDialog implements EnumListener<Item> {
enum Item {
operationList,
addOperationDialog,
valueOperationDialog,
genericOperationDialog,
operation,
value,
parameters,
addOperation,
removeOperation,
editOperation,
moveUpOperation,
moveDownOperation,
editAggLimitDialog,
editAggSkipDialog,
editAggMatchDialog,
editAggSortDialog,
editAggProjectDialog,
editAggUnwindDialog,
editAggGroupDialog,
editAggGeoNearDialog
}
List<BasicDBObject> operationList = new ArrayList<BasicDBObject>();
@SerialStar
public String pipeline;
public AggregateDialog() {
pipeline = "";
setEnumBinding(Item.values(), this);
}
void refreshAggList() {
ListArea list = (ListArea) getBoundUnit(Item.operationList);
String[] items = new String[operationList.size()];
int i = 0;
for (BasicDBObject op : operationList) {
String json = MongoUtils.getJSON(op);
items[i++] = json.substring(0, Math.min(80, json.length()));
}
list.items = items;
list.structureComponent();
}
public void addOperation(ButtonBase button) {
FormDialog od = (FormDialog) getBoundUnit(Item.addOperationDialog);
if (!od.show()) {
return;
}
String op = getStringFieldValue(Item.operation);
BasicDBObject opObj = editOperation(null, "$" + op);
if (opObj != null) {
operationList.add(opObj);
refreshAggList();
}
}
public void removeOperation(ButtonBase button) {
final int opId = getComponentIntFieldValue(Item.operationList);
operationList.remove(opId);
refreshAggList();
}
public void editOperation(ButtonBase button) {
final int opId = getComponentIntFieldValue(Item.operationList);
BasicDBObject opObj = operationList.get(opId);
opObj = editOperation(opObj, null);
if (opObj != null) {
operationList.set(opId, opObj);
refreshAggList();
}
}
public BasicDBObject editOperation(BasicDBObject opObj, String op) {
if (op == null)
op = opObj.keySet().iterator().next();
EditAggOpDialog od = null;
// if ("$limit".equals(op) || "$skip".equals(op)) {
// od = (FormDialog) getBoundUnit(Item.valueOperationDialog);
// setIntFieldValue(Item.value, opObj.getInt(op));
// if (!od.show()) {
// return null;
// }
// opObj.put(op, getIntFieldValue(Item.value));
// } else {
// od = (FormDialog) getBoundUnit(Item.genericOperationDialog);
// ((DocBuilderField)getBoundUnit(Item.parameters)).setDBObject((DBObject) opObj.get(op));
// if (!od.show()) {
// return null;
// }
// opObj.put(op, ((DocBuilderField)getBoundUnit(Item.parameters)).getDBObject());
// }
if ("$match".equals(op)) {
od = (EditAggOpDialog) getBoundUnit(Item.editAggMatchDialog);
} else if ("$project".equals(op)) {
od = (EditAggOpDialog) getBoundUnit(Item.editAggProjectDialog);
} else if ("$limit".equals(op)) {
od = (EditAggOpDialog) getBoundUnit(Item.editAggLimitDialog);
} else if ("$skip".equals(op)) {
od = (EditAggOpDialog) getBoundUnit(Item.editAggSkipDialog);
} else if ("$sort".equals(op)) {
od = (EditAggOpDialog) getBoundUnit(Item.editAggSortDialog);
} else if ("$unwind".equals(op)) {
od = (EditAggOpDialog) getBoundUnit(Item.editAggUnwindDialog);
} else if ("$group".equals(op)) {
od = (EditAggOpDialog) getBoundUnit(Item.editAggGroupDialog);
} else if ("$geoNear".equals(op)) {
od = (EditAggOpDialog) getBoundUnit(Item.editAggGeoNearDialog);
}
if (opObj != null)
od.setOperation(opObj);
if (!od.show()) {
return null;
}
opObj = od.getOperation();
return opObj;
}
public void moveUpOperation(ButtonBase button) {
final int opId = getComponentIntFieldValue(Item.operationList);
if (opId > 0) {
BasicDBObject opObj = operationList.get(opId);
BasicDBObject other = operationList.get(opId - 1);
operationList.set(opId - 1, opObj);
operationList.set(opId, other);
refreshAggList();
}
}
public void moveDownOperation(ButtonBase button) {
final int opId = getComponentIntFieldValue(Item.operationList);
if (opId < operationList.size() - 1) {
BasicDBObject opObj = operationList.get(opId);
BasicDBObject other = operationList.get(opId + 1);
operationList.set(opId + 1, opObj);
operationList.set(opId, other);
refreshAggList();
}
}
// void resetForNew() {
// xmlLoadCheckpoint();
// }
//
// void resetForEdit(BasicDBObject opObj) {
// String op = opObj.keySet().iterator().next();
// setStringFieldValue(Item.operation, op.substring(1));
// ((DocBuilderField)getBoundUnit(Item.parameters)).setDBObject((DBObject) opObj.get(op));
// updateComponent();
// }
//
// BasicDBObject getOperation() {
// String op = getStringFieldValue(Item.operation);
// BasicDBObject param = (BasicDBObject) ((DocBuilderField)getBoundUnit(Item.parameters)).getDBObject();
// return new BasicDBObject("$" + op, param);
// }
BasicDBObject getAggregateCommand(String collection) {
BasicDBObject cmd = new BasicDBObject("aggregate", collection);
BasicDBList list = new BasicDBList();
cmd.put("pipeline", list);
for (BasicDBObject op : operationList) {
list.add(op);
}
return cmd;
}
@Override
public void actionPerformed(Item enm, XmlComponentUnit unit, Object src) {
}
@Override
protected void updateComponentCustom(JDialog old) {
BasicDBObject cmd = (BasicDBObject) JSON.parse(pipeline);
if (cmd != null && cmd.containsField("pipeline")) {
BasicDBList list = (BasicDBList) cmd.get("pipeline");
operationList.clear();
for (Object op : list) {
operationList.add((BasicDBObject) op);
}
refreshAggList();
}
}
@Override
protected void commitComponentCustom(JDialog comp) {
pipeline = MongoUtils.getJSON(getAggregateCommand("dummy"));
}
}