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

Reply via email to