Changeset 5892


Ignore:
Timestamp:
Nov 28, 2011, 1:58:56 PM (10 years ago)
Author:
Nicklas Nordborg
Message:

References #1616: Clone reporter information to per-experiment tables in the dynamic database

Fixes issues in Experiment explorer when a default context (filters, sort order, etc.) uses reporter properties that are not cloned. The fix is a filter that can be added to the ItemContext class so that non-existing properties are excluded.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/clients/web/net/sf/basedb/clients/web/ExperimentExplorer.java

    r5885 r5892  
    6363import net.sf.basedb.core.SessionControl;
    6464import net.sf.basedb.core.VirtualColumn;
    65 import net.sf.basedb.core.VirtualDb;
    6665import net.sf.basedb.core.VirtualTable;
    6766import net.sf.basedb.core.ItemContext.SortDirection;
     
    138137  */
    139138  private static final ItemContext defaultReporterContext =
    140     Base.createDefaultContext("@externalId", "externalId");
     139    Base.createDefaultContext("@externalId", "externalId,symbol");
    141140 
    142141  /**
     
    190189  private final Experiment experiment;
    191190 
    192   private final VirtualDb virtualDb;
    193191 
    194192  /**
     
    244242    this.bioAssaySet = bioAssaySet;
    245243    this.experiment = bioAssaySet.getExperiment();
    246     this.virtualDb = experiment.getVirtualDb();
    247244    this.bioAssays = new HashMap<Short, Integer>();
    248245    this.snapshotManager = new SnapshotManager();
     
    693690    if (cache == null) initReporterCache(dc);
    694691
     692    Experiment exp = getExperiment(dc);
    695693    ItemContext cc = dc.getSessionControl().getCurrentContext(Item.REPORTER, getSubContext(), null);
    696    
     694    if (exp.getVirtualDb().hasClonedReporters())
     695    {
     696      cc.setPropertyInspector(exp.getVirtualDb().getQueryPropertyInspector());
     697    }
     698    else
     699    {
     700      cc.setPropertyInspector(null);
     701    }
     702
    697703    // Get the reporter id:s to show on the current page
    698704    List<Integer> reporterIds = new ArrayList<Integer>(cc.getRowsPerPage()+1);
     
    706712   
    707713    // Create reporter query
    708     DynamicReporterQuery reporterQuery = Reporter.getDynamicQuery(getExperiment(dc));
     714    DynamicReporterQuery reporterQuery = Reporter.getDynamicQuery(exp);
    709715    // Guard against no hits
    710716    if (reporterIds.size() == 0) reporterIds.add(-1);
     
    935941    reporterQuery.select(position);
    936942    ItemContext cc = dc.getSessionControl().getCurrentContext(Item.REPORTER, getSubContext(), null);
     943    if (getExperiment(dc).getVirtualDb().hasClonedReporters())
     944    {
     945      cc.setPropertyInspector(getExperiment(dc).getVirtualDb().getQueryPropertyInspector());
     946    }
     947    else
     948    {
     949      cc.setPropertyInspector(null);
     950    }
    937951    cc.configureQuery(dc, reporterQuery, null);
    938952    reporterQuery.order(Orders.asc(Expressions.selected(position)));
  • trunk/src/clients/web/net/sf/basedb/clients/web/taglib/table/Data.java

    r4889 r5892  
    154154    if (!(getParent() instanceof Table)) throw new JspTagException("Tag <tbl:data> must be inside a <tbl:table> tag");
    155155    table = (Table)getParent();
     156    table.endColumnDefinitions();
    156157
    157158    StringBuilder sb = new StringBuilder();
  • trunk/src/clients/web/net/sf/basedb/clients/web/taglib/table/Form.java

    r5111 r5892  
    9696  {
    9797    table = (Table)findAncestorWithClass(this, Table.class);
     98    table.endColumnDefinitions();
    9899    // Make a copy of the headers
    99100    headers = new HashMap<String, String>(table.getColumnContent());
  • trunk/src/clients/web/net/sf/basedb/clients/web/taglib/table/Table.java

    r5643 r5892  
    272272    The ID of all visible columns, sorted by the order they should appear.
    273273  */
    274   private LinkedHashSet<String> visibleColumns;
     274  private Set<String> visibleColumns;
     275 
     276  /**
     277    The ID of all defined columns
     278  */
     279  private Set<String> definedColumns;
    275280
    276281  private Map<String, String> columnContent;
     
    406411      visibleColumns.add(columnId);
    407412    }
     413    definedColumns.add(columnId);
    408414    if (cd.getFormatter() != null) columnFormatter.put(columnId, cd.getFormatter());
    409415   
     
    426432  }
    427433 
     434  void endColumnDefinitions()
     435  {
     436    visibleColumns.retainAll(definedColumns);
     437  }
     438 
    428439  boolean isColumnVisible(String columnId)
    429440  {
     
    555566      visibleColumns.remove("-"); // "-" represents the required columns
    556567    }
     568    definedColumns = new HashSet<String>();
    557569
    558570    hiddenForm = new StringBuilder();
  • trunk/src/core/net/sf/basedb/core/ItemContext.java

    r5817 r5892  
    4343import net.sf.basedb.util.encode.EncodeUtil;
    4444import net.sf.basedb.util.encode.TabCrLfEncoderDecoder;
     45import net.sf.basedb.util.filter.Filter;
    4546import net.sf.basedb.util.jep.ChannelFunction;
    4647import net.sf.basedb.util.jep.Jep;
     
    183184  private Map<String, Object> objects;
    184185  private Query query;
     186  private Filter<String> propertyInspector;
    185187 
    186188  /**
     
    11431145  {
    11441146    this.query = query;
     1147  }
     1148 
     1149  /**
     1150    Set a filter for this context that is used to inspect which properties
     1151    that are allowed to be used in queries. If a filter has been set the
     1152    {@link #configureQuery(DbControl, EntityQuery, boolean)} and
     1153    {@link #configureQuery(DbControl, AbstractSqlQuery, List)} methods will
     1154    check each property before it is used for sorting, filtering, etc.
     1155   
     1156    @param filter A filter or null to disable property inspection
     1157    @since 3.1
     1158  */
     1159  public void setPropertyInspector(Filter<String> filter)
     1160  {
     1161    this.propertyInspector = filter;
    11451162  }
    11461163 
     
    11941211      for (String sortProperty : sp)
    11951212      {
    1196         String alias = null;
    1197         if (sortProperty.startsWith("$"))
     1213        if (propertyInspector == null || propertyInspector.evaluate(sortProperty))
    11981214        {
    1199           // sortProperty is $alias.property or $alias only
    1200           int dotIndex = sortProperty.indexOf(".");
    1201           if (dotIndex == -1)
     1215          String alias = null;
     1216          if (sortProperty.startsWith("$"))
    12021217          {
    1203             // alias only
    1204             alias = sortProperty.substring(1);
    1205             sortProperty = null;
     1218            // sortProperty is $alias.property or $alias only
     1219            int dotIndex = sortProperty.indexOf(".");
     1220            if (dotIndex == -1)
     1221            {
     1222              // alias only
     1223              alias = sortProperty.substring(1);
     1224              sortProperty = null;
     1225            }
     1226            else
     1227            {
     1228              // alias.property
     1229              alias = sortProperty.substring(1, dotIndex);
     1230              sortProperty = sortProperty.substring(dotIndex+1);
     1231            }
    12061232          }
    1207           else
     1233          // left join if sort property is association
     1234          if (autoLeftJoin)
    12081235          {
    1209             // alias.property
    1210             alias = sortProperty.substring(1, dotIndex);
    1211             sortProperty = sortProperty.substring(dotIndex+1);
     1236            int dotIndex = sortProperty.lastIndexOf(".");
     1237            if (dotIndex >= 0)
     1238            {
     1239              String toJoin = sortProperty.substring(0, dotIndex);
     1240              if (alias != null) toJoin = "$" + alias + "." + toJoin;
     1241              leftJoins.add(toJoin);
     1242              sortedProperties.add(toJoin);
     1243            }
    12121244          }
     1245          Expression hqlSortby = Hql.property(alias, sortProperty);
     1246          query.order(SortDirection.ASC == getSortDirection() ? Orders.asc(hqlSortby) : Orders.desc(hqlSortby));
    12131247        }
    1214         // left join if sort property is association
    1215         if (autoLeftJoin)
    1216         {
    1217           int dotIndex = sortProperty.lastIndexOf(".");
    1218           if (dotIndex >= 0)
    1219           {
    1220             String toJoin = sortProperty.substring(0, dotIndex);
    1221             if (alias != null) toJoin = "$" + alias + "." + toJoin;
    1222             leftJoins.add(toJoin);
    1223             sortedProperties.add(toJoin);
    1224           }
    1225         }
    1226         Expression hqlSortby = Hql.property(alias, sortProperty);
    1227         query.order(SortDirection.ASC == getSortDirection() ? Orders.asc(hqlSortby) : Orders.desc(hqlSortby));
    12281248      }
    12291249    }
     
    12541274      {
    12551275        PropertyFilter filter = filterPair.getEffectiveFilter();
    1256         try
     1276        if (propertyInspector == null || propertyInspector.evaluate(filter.getProperty()))
    12571277        {
    1258           Restriction r = filter.getRestriction(dc, query);
    1259           if (r != null)
     1278          try
    12601279          {
    1261             restrictions[i] = r;
    1262             i++;
    1263             // left join if filter property is association
    1264             if (autoLeftJoin)
     1280            Restriction r = filter.getRestriction(dc, query);
     1281            if (r != null)
    12651282            {
    1266               String filterProperty = filter.getProperty();
    1267               if (filterProperty != null && !filterProperty.startsWith("£") && !filterProperty.startsWith("&") && !filterProperty.startsWith("!"))
     1283              restrictions[i] = r;
     1284              i++;
     1285              // left join if filter property is association
     1286              if (autoLeftJoin)
    12681287              {
    1269                 int lastDotIndex = filterProperty.lastIndexOf('.');
    1270                 int firstDotIndex = filterProperty.indexOf('.');
    1271                 if (lastDotIndex >= 0)
     1288                String filterProperty = filter.getProperty();
     1289                if (filterProperty != null && !filterProperty.startsWith("£") && !filterProperty.startsWith("&") && !filterProperty.startsWith("!"))
    12721290                {
    1273                   filterProperty = filterProperty.substring(0, lastDotIndex);
    1274                   if (!filterProperty.startsWith("$") || lastDotIndex != firstDotIndex)
     1291                  int lastDotIndex = filterProperty.lastIndexOf('.');
     1292                  int firstDotIndex = filterProperty.indexOf('.');
     1293                  if (lastDotIndex >= 0)
    12751294                  {
    1276                     leftJoins.add(filterProperty);
     1295                    filterProperty = filterProperty.substring(0, lastDotIndex);
     1296                    if (!filterProperty.startsWith("$") || lastDotIndex != firstDotIndex)
     1297                    {
     1298                      leftJoins.add(filterProperty);
     1299                    }
    12771300                  }
    12781301                }
     
    12801303            }
    12811304          }
    1282         }
    1283         catch (Throwable ex)
    1284         {
    1285           String msg = "Could not filter on '" + getItemType() + "." + filter.getProperty() + "'";
    1286           Application.getLogger().warn(msg, ex);
    1287           setMessage(msg + ": " + ex.getMessage());
     1305          catch (Throwable ex)
     1306          {
     1307            String msg = "Could not filter on '" + getItemType() + "." + filter.getProperty() + "'";
     1308            Application.getLogger().warn(msg, ex);
     1309            setMessage(msg + ": " + ex.getMessage());
     1310          }
    12881311        }
    12891312      }
     
    13971420    query.setMaxResults(getRowsPerPage());
    13981421   
     1422
    13991423    // Add selection elements
    14001424    if (selectionList != null)
     
    14021426      for (String selectProperty : selectionList)
    14031427      {
    1404         Select select = getDynamicSelect(dc, selectProperty); //, joins);
    1405         if (select != null)
     1428        if (propertyInspector == null || propertyInspector.evaluate(selectProperty))
    14061429        {
    1407           query.select(select);
     1430          Select select = getDynamicSelect(dc, selectProperty); //, joins);
     1431          if (select != null)
     1432          {
     1433            query.select(select);
     1434          }
    14081435        }
    14091436      }
     
    14201447      for (String sortProperty : sp)
    14211448      {
    1422         Expression sortby = getDynamicExpression(dc, sortProperty);
    1423         if (sortby != null)
     1449        if (propertyInspector == null || propertyInspector.evaluate(sortProperty))
    14241450        {
    1425           query.order(SortDirection.ASC == getSortDirection() ? Orders.asc(sortby) : Orders.desc(sortby));
    1426           if (selectionList == null || !selectionList.contains(sortProperty))
     1451          Expression sortby = getDynamicExpression(dc, sortProperty);
     1452          if (sortby != null)
    14271453          {
    1428             // We must add the sort property to the selection list
    1429             query.select(Selects.expression(sortby, "sorted" + sortIndex));
     1454            query.order(SortDirection.ASC == getSortDirection() ? Orders.asc(sortby) : Orders.desc(sortby));
     1455            if (selectionList == null || !selectionList.contains(sortProperty))
     1456            {
     1457              // We must add the sort property to the selection list
     1458              query.select(Selects.expression(sortby, "sorted" + sortIndex));
     1459            }
    14301460          }
     1461          sortIndex++;
    14311462        }
    1432         sortIndex++;
    14331463      }
    14341464    }
     
    14421472      {
    14431473        PropertyFilter filter = filterPair.getEffectiveFilter();
    1444         try
     1474        if (propertyInspector == null || propertyInspector.evaluate(filter.getProperty()))
    14451475        {
    1446           Restriction r = filter.getDynamicRestriction(dc);
    1447           if (r != null)
     1476          try
    14481477          {
    1449             restrictions[i] = r;
    1450             i++;
     1478            Restriction r = filter.getDynamicRestriction(dc);
     1479            if (r != null)
     1480            {
     1481              restrictions[i] = r;
     1482              i++;
     1483            }
    14511484          }
    1452         }
    1453         catch (Throwable ex)
    1454         {
    1455           setMessage(ex.getClass().getSimpleName() + ": " + ex.getMessage());
     1485          catch (Throwable ex)
     1486          {
     1487            setMessage(ex.getClass().getSimpleName() + ": " + ex.getMessage());
     1488          }
    14561489        }
    14571490      }
  • trunk/src/core/net/sf/basedb/core/VirtualDb.java

    r5879 r5892  
    2727import net.sf.basedb.core.data.SharedData;
    2828import net.sf.basedb.core.hibernate.ExecuteUpdateWork;
     29import net.sf.basedb.util.filter.Filter;
    2930
    3031import java.sql.SQLException;
     
    210211  {
    211212    return hasClonedReporters() && getData().getReporterCloneTemplate().getProperties().containsKey(propertyName);
     213  }
     214 
     215  /**
     216    Return a filter that can be used to check that a query is only
     217    using cloned reporter properties for sorting, filtering, etc.
     218    The filter will reject reporter properties (starting with '@')
     219    that have not been cloned.
     220   
     221    @return A filter or null if this virtual db doesn't have cloned reporters
     222    @since 3.1
     223    @see ItemContext#setPropertyInspector(Filter)
     224   */
     225  public Filter<String> getQueryPropertyInspector()
     226  {
     227    Filter<String> filter = null;
     228    if (hasClonedReporters())
     229    {
     230      filter = new Filter<String>()
     231      {
     232        @Override
     233        public boolean evaluate(String property)
     234        {
     235          if (!property.startsWith("@")) return true;
     236          return hasClonedReporterProperty(property.substring(1));
     237        }
     238      };
     239    }
     240    return filter;
    212241  }
    213242 
  • trunk/www/views/experiments/explorer/view/view.jsp

    r5885 r5892  
    8888<%!
    8989  private static final Item itemType = Item.SPOTDATA;
    90   private static final String defaultReporterColumns = "externalId";
     90  private static final String defaultReporterColumns = "externalId,symbol";
    9191%>
    9292<%
     
    385385        value="<%=String.valueOf(bioAssaySetId)%>"
    386386      />
    387      
    388387      <%
    389388      for (TableColumn tc : reporterColumns)
     
    394393          clazz="prompt"
    395394          title="<%=HTML.encodeTags(tc.getTitle())%>"
    396          
    397395          formatter="<%=tc.getFormatter()%>"
    398396        />
    399397        <%
    400398      }
    401       %>
    402      
    403       <%
    404399      List<ExtendedProperty> reporterProperties = ExtendedProperties.getProperties("ReporterData");
    405400      %>
     
    419414          {
    420415            String name = ep.getName();
    421             Formatter formatter = FormatterFactory.getExtendedPropertyFormatter(sc, ep);
    422416            %>
    423417            <tbl:cell column="<%=ep.getName()%>"><tbl:cellvalue value="<%=reporter.getExtended(name)%>" /></tbl:cell>
Note: See TracChangeset for help on using the changeset viewer.