Author: michiel
Date: 2010-04-12 17:39:21 +0200 (Mon, 12 Apr 2010)
New Revision: 41853
Added:
mmbase/trunk/core/src/main/java/org/mmbase/module/core/CoreClusterQueries.java
mmbase/trunk/core/src/main/java/org/mmbase/module/core/NodeSearchQuery.java
Modified:
mmbase/trunk/core/src/main/java/org/mmbase/core/util/StorageConnector.java
mmbase/trunk/core/src/main/java/org/mmbase/module/core/MMObjectNode.java
mmbase/trunk/core/src/main/java/org/mmbase/module/core/MMTable.java
Log:
Modified:
mmbase/trunk/core/src/main/java/org/mmbase/core/util/StorageConnector.java
===================================================================
--- mmbase/trunk/core/src/main/java/org/mmbase/core/util/StorageConnector.java
2010-04-12 15:34:17 UTC (rev 41852)
+++ mmbase/trunk/core/src/main/java/org/mmbase/core/util/StorageConnector.java
2010-04-12 15:39:21 UTC (rev 41853)
@@ -431,7 +431,7 @@
if (query instanceof NodeQuery) {
builderName = ((NodeQuery)query).getNodeManager().getName();
} else if (query instanceof NodeSearchQuery) {
- builderName = ((NodeSearchQuery)query).getBuilder();
+ builderName = ((NodeSearchQuery)query).getTableName();
}
if (builderName != null &&
!builderName.equals(builder.getTableName())) {
throw new IllegalArgumentException("Query passed runs on '" +
builderName + "' but was passed to '" + builder.getTableName() + "'");
Added:
mmbase/trunk/core/src/main/java/org/mmbase/module/core/CoreClusterQueries.java
===================================================================
---
mmbase/trunk/core/src/main/java/org/mmbase/module/core/CoreClusterQueries.java
(rev 0)
+++
mmbase/trunk/core/src/main/java/org/mmbase/module/core/CoreClusterQueries.java
2010-04-12 15:39:21 UTC (rev 41853)
@@ -0,0 +1,153 @@
+/*
+
+This software is OSI Certified Open Source Software.
+OSI Certified is a certification mark of the Open Source Initiative.
+
+The license (Mozilla version 1.0) can be read at the MMBase site.
+See http://www.MMBase.org/license
+
+*/
+package org.mmbase.module.core;
+
+import java.util.*;
+import java.util.Map.Entry;
+
+import org.mmbase.module.corebuilders.*;
+import org.mmbase.cache.MultilevelCache;
+import org.mmbase.core.CoreField;
+import org.mmbase.bridge.BridgeException;
+import org.mmbase.bridge.Field;
+import org.mmbase.core.util.Fields;
+import org.mmbase.util.functions.*;
+import org.mmbase.datatypes.*;
+import org.mmbase.storage.search.*;
+import org.mmbase.storage.search.implementation.*;
+import org.mmbase.storage.search.legacy.ConstraintParser;
+import org.mmbase.storage.search.legacy.QueryConvertor;
+
+import org.mmbase.util.logging.*;
+
+/**
+ * @since MMBase-2.0
+ */
+
+public class CoreClusterQueries extends ClusterQueries {
+
+ private static final Logger log=
Logging.getLoggerInstance(CoreClusterQueries.class);
+
+
+ public static final CoreClusterQueries INSTANCE = new CoreClusterQueries();
+
+ private CoreClusterQueries() {
+ }
+
+ protected int getNumberForAlias(String alias) {
+ int nodeNumber = MMBase.getMMBase().getOAlias().getNumber(alias);
+ if (nodeNumber < 0) {
+ nodeNumber = 0;
+ }
+ return nodeNumber;
+ }
+
+ // Add constraints.
+ // QueryConverter supports the old formats for backward compatibility.
+ protected void setConstraint(BasicSearchQuery query, String where) {
+ QueryConvertor.setConstraint(query, where);
+ }
+ protected StepField getField(String fieldName, BasicSearchQuery query) {
+ return ConstraintParser.getField(fieldName, query.getSteps());
+ }
+
+ protected boolean isRelation(String builder) {
+ return MMBase.getMMBase().getBuilder(builder) instanceof InsRel;
+ }
+
+ protected String getBuilder(int nodeNumber) {
+ MMObjectNode node =
MMBase.getMMBase().getBuilder("object").getNode(nodeNumber);
+ if (node == null) {
+ return null;
+ }
+ return node.parent.getTableName();
+ }
+
+ protected String getParentBuilder(String buil) {
+ MMObjectBuilder builder = MMBase.getMMBase().getBuilder(buil);
+ MMObjectBuilder parent = builder.getParentBuilder();
+ return parent == null ? null : parent.getTableName();
+ }
+
+ public FieldDefs getField(String buil, String fieldName) {
+ MMObjectBuilder builder = MMBase.getMMBase().getBuilder(buil);
+ return builder.getField(fieldName);
+ }
+
+ public FieldDefs getNodeField(String fieldName) {
+ return new FieldDefs(fieldName, Field.TYPE_NODE, -1,
Field.STATE_VIRTUAL, org.mmbase.datatypes.DataTypes.getDataType("node"));
+ }
+
+ public String getTrueTableName(String table) {
+ String tab = getTableName(table);
+ int rnumber = MMBase.getMMBase().getRelDef().getNumberByName(tab);
+ if (rnumber != -1) {
+ return MMBase.getMMBase().getRelDef().getBuilderName(rnumber);
+ } else {
+ return tab;
+ }
+ }
+
+ protected boolean optimizeRelationStep(RelationStep relationStep, int
sourceType, int destType, int role, int searchDir) {
+ return
MMBase.getMMBase().getTypeRel().optimizeRelationStep((BasicRelationStep)
relationStep, sourceType, destType, role, searchDir);
+ }
+ // just changing scope for test-cases
+ protected String getUniqueTableAlias(String tableAlias, Set<String>
tableAliases, Collection<String> originalAliases) {
+ return super.getUniqueTableAlias(tableAlias, tableAliases,
originalAliases);
+ }
+
+ @Override
+ protected String getBuilder(String tableAlias, Map<String, Integer> roles)
{
+ String tableName = getTableName(tableAlias);
+ // check builder - should throw exception if builder doesn't exist ?
+ MMObjectBuilder bul = null;
+ try {
+ bul = MMBase.getMMBase().getBuilder(tableName);
+ } catch (BuilderConfigurationException e) {
+ }
+ if (bul == null) {
+ // check if it is a role name. if so, use the builder of the
+ // rolename and store a filter on rnumber.
+ int rnumber =
MMBase.getMMBase().getRelDef().getNumberByName(tableName);
+ if (rnumber == -1) {
+ throw new IllegalArgumentException("Specified builder '" +
tableName + "' does not exist.");
+ } else {
+ bul = MMBase.getMMBase().getRelDef().getBuilder(rnumber); //
relation builder
+ roles.put(tableAlias, rnumber);
+ }
+ } else if (bul instanceof InsRel) {
+ int rnumber =
MMBase.getMMBase().getRelDef().getNumberByName(tableName);
+ if (rnumber != -1) {
+ roles.put(tableAlias, rnumber);
+ }
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("Resolved table alias \"" + tableAlias + "\" to builder
\"" + bul.getTableName() + "\"");
+ }
+ return bul.getTableName();
+ }
+
+ @Override
+ public int getBuilderNumber(String buil) {
+ return MMBase.getMMBase().getBuilder(buil).getNumber();
+ }
+
+ @Override
+ protected StepField getField(String fieldName, SearchQuery query) {
+ // TODO
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Collection<CoreField> getFields(String buil) {
+ return
MMBase.getMMBase().getBuilder(buil).getFields(org.mmbase.bridge.NodeManager.ORDER_CREATE);
+ }
+}
+
Modified:
mmbase/trunk/core/src/main/java/org/mmbase/module/core/MMObjectNode.java
===================================================================
--- mmbase/trunk/core/src/main/java/org/mmbase/module/core/MMObjectNode.java
2010-04-12 15:34:17 UTC (rev 41852)
+++ mmbase/trunk/core/src/main/java/org/mmbase/module/core/MMObjectNode.java
2010-04-12 15:39:21 UTC (rev 41853)
@@ -61,9 +61,8 @@
* it can be used to optimise cacheing
* @since MMBase-1.8
*/
- private Map<String, Object> oldValues = null;
-
-
+ private Map<String, Object> oldValues = Collections.synchronizedMap(new
HashMap<String, Object>());
+
/**
* Holds the name - value pairs of this node (the node's fields).
* Most nodes will have a 'number' and an 'otype' field, and fields which
will differ by builder.
@@ -73,9 +72,8 @@
* Note: To avoid synchronisation conflicts, we can't really change the
type until the property is made private.
*/
protected Map<String, Object> values = Collections.synchronizedMap(new
HashMap<String, Object>());
- private Map<String, Long> sizes = null;
+ private Map<String, Long> sizes = Collections.synchronizedMap(new
HashMap<String, Long>());
-
/**
* Determines whether the node is being initialized (typically when it is
loaded from the database).
* Use {...@link #start} to start initializing, use {...@link #finish} to
end.
@@ -96,8 +94,8 @@
* Set which stores the keys of the fields that were changed
* since the last commit.
*/
- private Set<String> changed = null;
-
+ private Set<String> changed = Collections.synchronizedSet(new
HashSet<String>());
+
/**
* Pointer to the parent builder that is responsible for this node.
* Note: this may on occasion (due to optimization) differ for the node's
original builder.
@@ -174,13 +172,8 @@
isNew = node.isNew();
newContext = node.newContext;
values.putAll(node.getValues());
- Map<String, Object> nodeOldValues = node.getOldValues();
- if (nodeOldValues != null) {
- values.putAll(nodeOldValues);
- }
- if (node.sizes != null) {
- sizesMap().putAll(node.sizes);
- }
+ values.putAll(node.getOldValues());
+ sizes.putAll(node.sizes);
}
/**
@@ -194,27 +187,6 @@
values = map;
}
- private Map<String, Object> oldValuesMap() {
- if (oldValues == null) {
- oldValues = Collections.synchronizedMap(new HashMap<String,
Object>());
- }
- return oldValues;
- }
-
- private Set<String> changedMap() {
- if (changed == null) {
- changed = Collections.synchronizedSet(new HashSet<String>());
- }
- return changed;
- }
-
- private Map<String, Long> sizesMap() {
- if (sizes == null) {
- sizes = Collections.synchronizedMap(new HashMap<String, Long>());
- }
- return sizes;
- }
-
/**
* Returns the actual builder of the node.
* Note that it is possible that, due to optimization, a node is currently
associated with
@@ -254,9 +226,6 @@
private void fixValues(final Map<String, Object> map, MMObjectBuilder bul)
{
- if (map == null) {
- return;
- }
synchronized(map) {
Set<String> targetFields = bul.getFieldNames();
@@ -343,9 +312,7 @@
if (success) {
isNew = false; // perhaps it is always already false (otherwise
insert is called, I think), but no matter, now it certainly isn't new!
} else {
- if (oldValues != null) {
- values.putAll(oldValues);
- }
+ values.putAll(oldValues);
}
clearChanged();
return success;
@@ -357,9 +324,7 @@
* @since MMBase-1.8
*/
public void cancel() {
- if (oldValues != null) {
- values.putAll(oldValues);
- }
+ values.putAll(oldValues);
clearChanged();
}
/**
@@ -625,10 +590,7 @@
fieldValue = new SerializableInputStream((InputStream) fieldValue,
getSize(fieldName));
}
if (fieldValue instanceof Node) {
- int number = ((Node) fieldValue).getNumber();
- if (number != -1) { // -1 is very meaningless, and it will not be
possible to make a sensible node of that again
- fieldValue = Integer.valueOf(number);
- }
+ fieldValue = Integer.valueOf(((Node) fieldValue).getNumber());
}
fieldValue = checkSerializable(fieldName, fieldValue);
if (checkFieldExistance(fieldName)) {
@@ -646,9 +608,9 @@
* @since MMBase-1.8
*/
private void storeOldValue(String fieldName, Object object) {
- if (! oldValuesMap().containsKey(fieldName)) {
+ if (! oldValues.containsKey(fieldName)) {
object = checkSerializable(fieldName, object);
- oldValuesMap().put(fieldName, object);
+ oldValues.put(fieldName, object);
}
}
@@ -788,7 +750,7 @@
* @since MMBase-1.8
*/
public void setSize(String fieldName, long size) {
- sizesMap().put(fieldName, size);
+ sizes.put(fieldName, size);
}
/**
* Returns the size (in byte) of the given field. This is mainly targeted
at fields of the type
@@ -798,11 +760,9 @@
* @since MMBase-1.8
*/
public long getSize(String fieldName) {
- if (sizes != null) {
- Long l = sizes.get(fieldName);
- if (l != null) {
- return l;
- }
+ Long l = sizes.get(fieldName);
+ if (l != null) {
+ return l;
}
Object value = values.get(fieldName);
// Value is null so it does not occupy any space.
@@ -827,7 +787,7 @@
// on the next commit
if (! initializing) {
log.trace("Marking '" + fieldName + "' as changed in " + sequence);
- changedMap().add(fieldName);
+ changed.add(fieldName);
}
// is it a memory only field ? then send a fieldchange
if (state == Field.STATE_VIRTUAL) {
@@ -1315,7 +1275,7 @@
* @return An unmodifiable Set containing Strings.
*/
public Set<String> getChanged() {
- return Collections.unmodifiableSet(changedMap());
+ return Collections.unmodifiableSet(changed);
}
/**
@@ -1323,7 +1283,7 @@
* @return <code>true</code> if changes have been made, <code>false</code>
otherwise
*/
public boolean isChanged() {
- return oldBuilder != null || newContext != null || (changed != null &&
changed.size() > 0);
+ return oldBuilder != null || newContext != null || changed.size() > 0;
}
/**
@@ -1335,12 +1295,8 @@
public boolean clearChanged() {
oldBuilder = null;
newContext = null;
- if (changed != null) {
- changed.clear();
- }
- if (oldValues != null) {
- oldValues.clear();
- }
+ changed.clear();
+ oldValues.clear();
return true;
}
@@ -1368,7 +1324,7 @@
* @since MMBase-1.8
*/
public Map<String, Object> getOldValues() {
- return Collections.unmodifiableMap(oldValuesMap());
+ return Collections.unmodifiableMap(oldValues);
}
/**
Modified: mmbase/trunk/core/src/main/java/org/mmbase/module/core/MMTable.java
===================================================================
--- mmbase/trunk/core/src/main/java/org/mmbase/module/core/MMTable.java
2010-04-12 15:34:17 UTC (rev 41852)
+++ mmbase/trunk/core/src/main/java/org/mmbase/module/core/MMTable.java
2010-04-12 15:39:21 UTC (rev 41853)
@@ -14,6 +14,7 @@
import org.mmbase.core.util.StorageConnector;
import org.mmbase.storage.*;
import org.mmbase.storage.search.*;
+import org.mmbase.storage.search.implementation.NodeSearchQuery;
import org.mmbase.storage.search.implementation.*;
import org.mmbase.util.functions.FunctionProvider;
import org.mmbase.util.logging.Logger;
Added:
mmbase/trunk/core/src/main/java/org/mmbase/module/core/NodeSearchQuery.java
===================================================================
--- mmbase/trunk/core/src/main/java/org/mmbase/module/core/NodeSearchQuery.java
(rev 0)
+++ mmbase/trunk/core/src/main/java/org/mmbase/module/core/NodeSearchQuery.java
2010-04-12 15:39:21 UTC (rev 41853)
@@ -0,0 +1,16 @@
+
+package org.mmbase.module.core;
+
+
+
+public class NodeSearchQuery extends
org.mmbase.storage.search.implementation.NodeSearchQuery {
+
+
+ public NodeSearchQuery(MMObjectBuilder buil) {
+ super(buil.getTableName(), CoreClusterQueries.INSTANCE);
+ }
+
+ public MMObjectBuilder getBuilder() {
+ return MMBase.getMMBase().getBuilder(getTableName());
+ }
+}
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs