QJsonValue JsonDbReduceDefinition::addObject(JsonDbReduceDefinition::FunctionNumber functionNumber, const QJsonValue &keyValue, QJsonValue previousValue, JsonDbObject object) { initScriptEngine(); QJSValue svKeyValue = mScriptEngine->toScriptValue(keyValue); if (!mTargetValueName.isEmpty()) previousValue = previousValue.toObject().value(mTargetValueName); QJSValue svPreviousValue = mScriptEngine->toScriptValue(previousValue); QJSValue svObject = mScriptEngine->toScriptValue(static_cast<QJsonObject>(object)); QJSValueList reduceArgs; reduceArgs << svKeyValue << svPreviousValue << svObject; QJSValue reduced = mFunctions[functionNumber].call(reduceArgs); if (!reduced.isUndefined() && !reduced.isError()) { QJsonValue jsonReduced = mScriptEngine->fromScriptValue<QJsonValue>(reduced); QJsonObject jsonReducedObject; if (!mTargetValueName.isEmpty()) jsonReducedObject.insert(mTargetValueName, jsonReduced); else jsonReducedObject = jsonReduced.toObject(); return jsonReducedObject; } else { if (reduced.isError()) setError(QString::fromLatin1("Error executing %1 function: %2") .arg((functionNumber == JsonDbReduceDefinition::Add ? QStringLiteral("add") : QStringLiteral("subtract"))) .arg(reduced.toString())); return QJsonValue(QJsonValue::Undefined); } }
SearchEngine::SearchEngine() : m_scriptDebugger(NULL), m_debuggerWindow(NULL), m_scriptDebugingEnabled(false) { m_scriptEngine = new QScriptEngine(this); initScriptEngine(); init(); m_result = SearchItemsStorrage::getInstance(); QApplicationSettingsPtr pSettings = QApplicationSettings::getInstance(); connect(pSettings.get(), SIGNAL(PropertyChanged(QString, QString)), SLOT(OnSettngsChnaged(QString, QString))); }
ScriptBinding::ScriptBinding() { // 初始化文件监控对象 fileSystemWatcher = new FileSystemWatcher(); // 选择器 selector = new Selector(); initScriptEngine(); initRootSpace(); initNativeMethodToRootSpace(); initConsoleSpace(); //暂时不用的 //initExpandMethodToRootSpace(); }
void JsonDbReduceDefinition::definitionCreated() { initScriptEngine(); initIndexes(); GetObjectsResult getObjectResponse = mPartition->d_func()->getObjects(JsonDbString::kTypeStr, mSourceType); if (!getObjectResponse.error.isNull()) { if (jsondbSettings->verbose()) qDebug() << "createReduceDefinition" << mTargetType << getObjectResponse.error.toString(); setError(getObjectResponse.error.toString()); } JsonDbObjectList objects = getObjectResponse.data; for (int i = 0; i < objects.size(); i++) updateObject(QJsonObject(), objects.at(i)); }
void JsonDbReduceDefinition::updateObject(JsonDbObject before, JsonDbObject after, JsonDbUpdateList *changeList) { initScriptEngine(); QJsonValue beforeKeyValue = sourceKeyValue(before); QJsonValue afterKeyValue = sourceKeyValue(after); if (jsondbSettings->debug()) qDebug() << "JsonDbReduceDefinition::updateObject" << "beforeKeyValue" << beforeKeyValue << "afterKeyValue" << afterKeyValue; if (!after.isEmpty() && !after.isDeleted() && !before.isEmpty() && (beforeKeyValue != afterKeyValue)) { // do a subtract only on the before key if (!beforeKeyValue.isUndefined()) updateObject(before, QJsonObject(), changeList); // and then continue here with the add with the after key before = QJsonObject(); } const QJsonValue keyValue((after.isEmpty() || after.isDeleted()) ? beforeKeyValue : afterKeyValue); if (keyValue.isUndefined()) return; GetObjectsResult getObjectResponse = mTargetTable->getObjects(mTargetKeyName, keyValue, mTargetType); if (!getObjectResponse.error.isNull()) setError(getObjectResponse.error.toString()); JsonDbObject previousObject; QJsonValue previousValue(QJsonValue::Undefined); JsonDbObjectList previousResults = getObjectResponse.data; for (int k = 0; k < previousResults.size(); ++k) { JsonDbObject previous = previousResults.at(k); if (previous.value(QStringLiteral("_reduceUuid")).toString() == mUuid) { previousObject = previous; previousValue = previousObject; break; } } QJsonValue value = previousValue; if (!before.isEmpty()) value = addObject(JsonDbReduceDefinition::Subtract, keyValue, value, before); if (!after.isEmpty() && !after.isDeleted()) value = addObject(JsonDbReduceDefinition::Add, keyValue, value, after); JsonDbObjectList objectsToUpdate; // if we had a previous object to reduce if (previousObject.contains(JsonDbString::kUuidStr)) { // and now the value is undefined if (value.isUndefined()) { // then remove it previousObject.markDeleted(); objectsToUpdate.append(previousObject); } else { //otherwise update it JsonDbObject reduced(value.toObject()); reduced.insert(JsonDbString::kTypeStr, mTargetType); reduced.insert(JsonDbString::kUuidStr, previousObject.value(JsonDbString::kUuidStr)); reduced.insert(JsonDbString::kVersionStr, previousObject.value(JsonDbString::kVersionStr)); reduced.insert(mTargetKeyName, keyValue); reduced.insert(QStringLiteral("_reduceUuid"), mUuid); objectsToUpdate.append(reduced); } } else if (!value.isUndefined()) { // otherwise create the new object JsonDbObject reduced(value.toObject()); reduced.insert(JsonDbString::kTypeStr, mTargetType); reduced.insert(mTargetKeyName, keyValue); reduced.insert(QStringLiteral("_reduceUuid"), mUuid); objectsToUpdate.append(reduced); } JsonDbWriteResult res = mPartition->updateObjects(mOwner, objectsToUpdate, JsonDbPartition::ViewObject, changeList); if (res.code != JsonDbError::NoError) setError(QString::fromLatin1("Error executing add function: %1").arg(res.message)); }