Author: jm
Date: 2012-09-05 20:35:32 -0700 (Wed, 05 Sep 2012)
New Revision: 30322

Added:
   
core3/impl/trunk/model-impl/impl/src/test/java/org/cytoscape/model/EquationTest.java
Modified:
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableImpl.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/EqnSupport.java
   
core3/impl/trunk/model-impl/impl/src/test/java/org/cytoscape/model/TableTestSupport.java
Log:
Fixes #1425: Added support for Equations that are referenced through 
VirtualColumns (i.e. Equations are now evaluated within the context of the 
table they're pulled from.  Before, they were always evaluated with respect to 
the source table)

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableImpl.java
        2012-09-06 01:00:01 UTC (rev 30321)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableImpl.java
        2012-09-06 03:35:32 UTC (rev 30322)
@@ -339,6 +339,7 @@
                                if (virtColumn != null) {
                                        final CyColumn cyColumn = 
types.get(normalizedColName);
                                        
virtualColumnMap.remove(normalizedColName);
+                                       attributes.remove(normalizedColName);
                                        types.remove(normalizedColName);
                                        
--((CyTableImpl)cyColumn.getVirtualColumnInfo().getSourceTable()).virtualColumnReferenceCount;
                                } else {
@@ -619,6 +620,8 @@
                        final VirtualColumn virtColumn = 
virtualColumnMap.get(normalizedColName);
                        if (virtColumn != null) {
                                virtColumn.setValue(key, value);
+                       }
+                       if (virtColumn != null && !(value instanceof Equation)) 
{
                                newValue = virtColumn.getValue(key);
                                newRawValue = virtColumn.getRawValue(key);
                        } else {
@@ -691,6 +694,8 @@
                        
                        if (virtColumn != null) {
                                virtColumn.setValue(key, value);
+                       }
+                       if (virtColumn != null && !(value instanceof Equation)) 
{
                                newValue = virtColumn.getListValue(key);
                        } else {
                                Map<Object, Object> keyToValueMap = 
attributes.get(normalizedColName);
@@ -762,13 +767,17 @@
                if (primaryKey.equalsIgnoreCase(normalizedColName))
                        return key;
 
+               Object virtualValue = null;
                if (virtColumn != null)
-                       return virtColumn.getRawValue(key);
-
+                       virtualValue = virtColumn.getRawValue(key);
+               
+               if (virtualValue != null && !(virtualValue instanceof Equation))
+                       return virtualValue;
+               
                Map<Object, Object> keyToValueMap = 
attributes.get(normalizedColName);
                if (keyToValueMap == null)
                        return null;
-
+               
                return keyToValueMap.get(key);
        }
 
@@ -792,10 +801,10 @@
        private Object getValue(Object key, String columnName, Class<?> type) {
                final String normalizedColName = 
normalizeColumnName(columnName);
                final VirtualColumn virtColumn = 
virtualColumnMap.get(normalizedColName);
-               if (virtColumn != null)
+               final Object vl = getValueOrEquation(key, columnName, 
virtColumn);
+               if (virtColumn != null && vl == null)
                        return virtColumn.getValue(key);
 
-               final Object vl = getValueOrEquation(key, columnName, 
virtColumn);
                if (vl == null)
                        return null;
 
@@ -856,10 +865,10 @@
                lastInternalError = null;
 
                final VirtualColumn virtColumn = 
virtualColumnMap.get(normalizedColName);
-               if (virtColumn != null)
+               final Object vl = getValueOrEquation(key, columnName, 
virtColumn);
+               if (virtColumn != null && vl == null)
                        return (List<T>)virtColumn.getListValue(key);
 
-               final Object vl = getValueOrEquation(key, columnName, 
virtColumn);
                if (vl == null)
                        return getDefaultValue(columnName,defaultValue);
 
@@ -956,6 +965,7 @@
                                                                       /* 
isPrimaryKey = */ false, isImmutable, null);
                        final String normalizedTargetName = 
normalizeColumnName(targetName);
                        types.put(normalizedTargetName, targetColumn);
+                       attributes.put(normalizedTargetName, new 
HashMap<Object, Object>(defaultInitSize));
                        virtualColumnMap.put(normalizedTargetName, new 
VirtualColumn((CyTableImpl)sourceTable, sourceColumnName, this,
                                                                                
     sourceTable.getPrimaryKey().getName(), 
                                                                                
     targetJoinKeyName));

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/EqnSupport.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/EqnSupport.java
 2012-09-06 01:00:01 UTC (rev 30321)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/EqnSupport.java
 2012-09-06 03:35:32 UTC (rev 30322)
@@ -39,10 +39,8 @@
 import org.cytoscape.equations.Equation;
 import org.cytoscape.equations.IdentDescriptor;
 import org.cytoscape.equations.Interpreter;
-
 import org.cytoscape.model.internal.tsort.TopoGraphNode;
 import org.cytoscape.model.internal.tsort.TopologicalSort;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -73,18 +71,10 @@
 
        static boolean listEquationIsCompatible(final Equation equation, final 
Class listElementType)
        {
-//             final Class<?> eqnReturnType = equation.getType();
-//             if (eqnReturnType == BooleanList.class)
-//                     return listElementType == Boolean.class;
-//             if (eqnReturnType == DoubleList.class)
-//                     return listElementType == Double.class;
-//             if (eqnReturnType == StringList.class)
-//                     return listElementType == String.class;
-//             if (eqnReturnType == LongList.class)
-//                     return listElementType == Long.class;
-               // TODO: Add support for a hypothetical IntegerList type.
-
-               return false;
+               // TODO: We no longer support strongly typed lists so this 
always
+               // returns true.  If we ever re-introduce strongly typed lists, 
we
+               // should modify this to do the appropriate checks.
+               return true;
        }
 
        static Object convertEqnResultToColumnType(final Class<?> columnType, 
final Object result) {

Added: 
core3/impl/trunk/model-impl/impl/src/test/java/org/cytoscape/model/EquationTest.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/test/java/org/cytoscape/model/EquationTest.java
                                (rev 0)
+++ 
core3/impl/trunk/model-impl/impl/src/test/java/org/cytoscape/model/EquationTest.java
        2012-09-06 03:35:32 UTC (rev 30322)
@@ -0,0 +1,124 @@
+package org.cytoscape.model;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Assert;
+
+import org.cytoscape.equations.Equation;
+import org.cytoscape.equations.internal.EquationCompilerImpl;
+import org.cytoscape.equations.internal.EquationParserImpl;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EquationTest {
+       private TableTestSupport support;
+       private EquationParserImpl parser;
+
+       @Before
+       public void setUp() {
+               support = new TableTestSupport();
+               parser = new EquationParserImpl();
+       }
+
+       Equation parseEquation(String equation, CyTable context) {
+               Map<String, Class<?>> typeMap = new HashMap<String, Class<?>>();
+               for (CyColumn column : context.getColumns()) {
+                       typeMap.put(column.getName(), column.getType());
+               }
+               EquationCompilerImpl compiler = new 
EquationCompilerImpl(parser);
+               Assert.assertTrue(compiler.compile(equation, typeMap));
+               return compiler.getEquation();
+       }
+       
+       @Test
+       public void testVirtualColumnEquation() {
+               CyTableFactory factory = support.getTableFactory();
+               CyTable table1 = factory.createTable("Table 1", "SUID", 
Long.class, true, true);
+               CyTable table2 = factory.createTable("Table 2", "SUID", 
Long.class, true, true);
+               table1.createColumn("name", String.class, false);
+               table1.createColumn("real", String.class, false);
+               table2.createColumn("name", String.class, false);
+               table2.addVirtualColumn("virtual", "real", table1, "SUID", 
false);
+               
+               CyRow row1 = table1.getRow(1L);
+               row1.set("name", "1");
+               
+               CyRow row2 = table2.getRow(1L);
+               row2.set("name", "2");
+               
+               row2.set("virtual", parseEquation("=$name", table2));
+               
+               // Equation should be propagated to both tables
+               Assert.assertNotNull(row1.getRaw("real"));
+               Assert.assertNotNull(row2.getRaw("virtual"));
+               
+               // Equation should yield different values depending on context
+               Assert.assertEquals("1", row1.get("real", String.class));
+               Assert.assertEquals("2", row2.get("virtual", String.class));
+
+               // Overwrite equation with normal attribute.  Both ends of
+               // VirtualColumn should give the same answer.
+               row1.set("real", "3");
+               Assert.assertEquals("3", row1.get("real", String.class));
+               Assert.assertEquals("3", row2.get("virtual", String.class));
+       }
+       
+       @Test
+       public void testVirtualColumnListEquation() {
+               CyTableFactory factory = support.getTableFactory();
+               CyTable table1 = factory.createTable("Table 1", "SUID", 
Long.class, true, true);
+               CyTable table2 = factory.createTable("Table 2", "SUID", 
Long.class, true, true);
+               table1.createListColumn("name", String.class, false);
+               table1.createListColumn("real", String.class, false);
+               table2.createListColumn("name", String.class, false);
+               table2.addVirtualColumn("virtual", "real", table1, "SUID", 
false);
+               
+               List<String> list1 = new ArrayList<String>();
+               list1.add("1");
+               
+               List<String> list2 = new ArrayList<String>();
+               list2.add("2");
+               
+               CyRow row1 = table1.getRow(1L);
+               row1.set("name", list1);
+               
+               CyRow row2 = table2.getRow(1L);
+               row2.set("name", list2);
+               
+               row2.set("virtual", parseEquation("=SLIST($name)", table2));
+               
+               // Equation should be propagated to both tables
+               Assert.assertNotNull(row1.getRaw("real"));
+               Assert.assertNotNull(row2.getRaw("virtual"));
+               
+               // Equation should yield different values depending on context
+               List<String> result1 = row1.getList("real", String.class);
+               Assert.assertNotNull(result1);
+               Assert.assertEquals(1, result1.size());
+               Assert.assertEquals("1", result1.get(0));
+               
+               List<String> result2 = row2.getList("virtual", String.class);
+               Assert.assertNotNull(result2);
+               Assert.assertEquals(1, result2.size());
+               Assert.assertEquals("2", result2.get(0));
+               
+               // Overwrite equation with normal attribute.  Both ends of
+               // VirtualColumn should give the same answer.
+               List<String> list3 = new ArrayList<String>();
+               list3.add("3");
+               row1.set("real", list3);
+               
+               List<String> result3a = row1.getList("real", String.class);
+               Assert.assertNotNull(result3a);
+               Assert.assertEquals(1, result3a.size());
+               Assert.assertEquals("3", result3a.get(0));
+
+               List<String> result3b = row2.getList("virtual", String.class);
+               Assert.assertNotNull(result3b);
+               Assert.assertEquals(1, result3b.size());
+               Assert.assertEquals("3", result3b.get(0));
+       }
+}

Modified: 
core3/impl/trunk/model-impl/impl/src/test/java/org/cytoscape/model/TableTestSupport.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/test/java/org/cytoscape/model/TableTestSupport.java
    2012-09-06 01:00:01 UTC (rev 30321)
+++ 
core3/impl/trunk/model-impl/impl/src/test/java/org/cytoscape/model/TableTestSupport.java
    2012-09-06 03:35:32 UTC (rev 30322)
@@ -1,24 +1,21 @@
 package org.cytoscape.model;
 
 
-import org.cytoscape.equations.Interpreter;
-import org.cytoscape.event.CyEventHelper;
+import static org.mockito.Mockito.mock;
+
+import org.cytoscape.equations.internal.interpreter.InterpreterImpl;
 import org.cytoscape.event.DummyCyEventHelper;
-import org.cytoscape.model.CyTable;
-import org.cytoscape.model.CyTableFactory;
 import org.cytoscape.model.internal.CyTableFactoryImpl;
 import org.cytoscape.service.util.CyServiceRegistrar;
 
-import static org.mockito.Mockito.*;
 
-
 public class TableTestSupport {
        protected CyTableFactory tableFactory;
        protected DummyCyEventHelper eventHelper;
 
        public TableTestSupport() {
                eventHelper = new DummyCyEventHelper();
-               tableFactory = new CyTableFactoryImpl(eventHelper, 
mock(Interpreter.class),
+               tableFactory = new CyTableFactoryImpl(eventHelper, new 
InterpreterImpl(),
                                                      
mock(CyServiceRegistrar.class));
        }
 

-- 
You received this message because you are subscribed to the Google Groups 
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/cytoscape-cvs?hl=en.

Reply via email to