/*
* Copyright (c) 2013 CaneData.org
*
* 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.canedata.provider.mongodb.entity;
import org.canedata.core.intent.Step;
import org.canedata.core.intent.Tracer;
import org.canedata.core.logging.LoggerFactory;
import org.canedata.core.intent.Limiter;
import org.canedata.core.util.StringUtils;
import org.canedata.exception.AnalyzeBehaviourException;
import org.canedata.logging.Logger;
import org.canedata.provider.mongodb.expr.MongoExpression;
import org.canedata.provider.mongodb.expr.MongoExpressionFactory;
import org.canedata.provider.mongodb.intent.MongoIntent;
import org.canedata.provider.mongodb.intent.MongoStep;
import com.mongodb.BasicDBObject;
/**
*
* @author Sun Yat-ton
* @version 1.00.000 2011-8-9
*/
public class IntentParser {
protected static final Logger logger = LoggerFactory
.getLogger(IntentParser.class);
public static void parse(MongoIntent intent,
final MongoExpressionFactory expFactory,
final BasicDBObject fields, final BasicDBObject projection,
final Limiter limiter, final BasicDBObject sorter, final BasicDBObject options)
throws AnalyzeBehaviourException {
options.append(Options.RETAIN, false).append(Options.UPSERT, false);
final BasicDBObject othersFields = new BasicDBObject();
intent.playback(new Tracer() {
public Tracer trace(Step step) throws AnalyzeBehaviourException {
switch (step.step()) {
case MongoStep.FILTER:
logger.debug("Putting filter ...");
if (null != step.getScalar())
expFactory.addExpression((MongoExpression) step
.getScalar()[0]);
break;
case MongoStep.PROJECTION:
if (null == projection)
break;
for (Object field : step.getScalar()) {
String f = (String) field;
logger.debug("Projected field {0} ...", f);
projection.append(f, 1);
}
break;
case MongoStep.LIMIT:
if (null == limiter)
break;
limiter.reset();
if (step.getScalar().length == 2)
limiter.limit((Integer) step.getScalar()[0],
(Integer) step.getScalar()[1]);
else
limiter.count((Integer) step.getScalar()[0]);
break;
case MongoStep.ORDER:
if (null == sorter)
break;
int ord = 1;
if (step.getPurpose() != null)
ord = -1;
String[] ordFs = (String[]) step.getScalar();
for (String f : ordFs) {
sorter.append(f, ord);
}
break;
case MongoStep.PUT:
if (null == fields
|| StringUtils.isBlank(step.getPurpose()))
break;
Object val = (step.getScalar() == null || step.getScalar().length == 0) ? null
: step.getScalar()[0];
if (step.getPurpose().matches(MongoEntity.internalCmds))
fields.append(step.getPurpose(), val);
else
othersFields.append(step.getPurpose(), val);
break;
case MongoStep.OPTION:
options.append(step.getPurpose(), step.getScalar()[0]);
break;
default:
logger.warn(
"Step {0} does not apply to activities query, this step will be ignored.",
step.getName());
}
return this;
}
});
if(!othersFields.isEmpty())
fields.append("$set", othersFields);
}
}