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.