Different node types are displayed in a tree table: "Top->Node->Leaf"
An enum attribute is defined at leaf level, which is stored inline:
**model.xml** with annotation for inline storage in source table:
<reference name="kind" kind="forwards" mandatory="true" navigate="true" type="temperature-profile-kind" > <annotations> <storage-algorithm> <foreign-key-storage storage-attribute="kind" storage-type="temperature-profile" /> </storage-algorithm> </annotations> </reference>
**meta.xml** with column definition for storing the value:
<metaobject object_name="TemperatureProfile" super_class="GenericObject" > <reference att_name="kind" by-value="true" mandatory="true" monomorphic="true" target-type="FastListElt" /> ... </metaobject>
The display and editing of this column initially works correctly:
Problem
However, clicking on the filter icon results in an error:
2025-05-19T17:02:51,447 ERROR [qtp1700721442-120]: com.top_logic.util.error.ErrorHandlingHelper - Command 'dispatchControlCommand' failed. S(Tw3uGG5dlqewSzkWIMHv4RU05ULwRyeOPRzKEmlSPbA=) com.top_logic.util.error.TopLogicException: Internal error at com.top_logic.mig.html.layout.CommandDispatcher.internalDispatchCommand(CommandDispatcher.java:218) at com.top_logic.mig.html.layout.CommandDispatcher.internalDispatch(CommandDispatcher.java:134) at com.top_logic.mig.html.layout.CommandDispatcher.dispatchCommand(CommandDispatcher.java:127) at com.top_logic.base.services.simpleajax.AJAXServlet.processRequest(AJAXServlet.java:686) at com.top_logic.base.services.simpleajax.AJAXServlet.doPost(AJAXServlet.java:359) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:547) at com.top_logic.util.TopLogicServlet.doService(TopLogicServlet.java:402) at com.top_logic.util.TopLogicServlet.inContext(TopLogicServlet.java:266) at com.top_logic.util.TopLogicServlet$1.inContext(TopLogicServlet.java:334) at com.top_logic.util.TLContextManager.inInteractionInternal(TLContextManager.java:283) at com.top_logic.util.TLContextManager.inInteraction(TLContextManager.java:259) at com.top_logic.util.TopLogicServlet.enterContext(TopLogicServlet.java:329) at com.top_logic.util.TopLogicServlet.serviceWithLogMark(TopLogicServlet.java:183) at com.top_logic.util.TopLogicServlet.lambda$service$0(TopLogicServlet.java:167) at com.top_logic.util.TopLogicServlet.withSessionIdLogMark(TopLogicServlet.java:209) at com.top_logic.util.TopLogicServlet.service(TopLogicServlet.java:166) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614) at org.eclipse.jetty.ee10.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1379) at org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736) at org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1614) at com.top_logic.knowledge.gui.layout.HttpSecureHeaderFilter.doFilter(HttpSecureHeaderFilter.java:135) at org.eclipse.jetty.ee10.servlet.FilterHolder.doFilter(FilterHolder.java:208) at org.eclipse.jetty.ee10.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1586) at org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1547) at org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:805) at org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:431) at org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:464) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:571) at org.eclipse.jetty.ee10.servlet.SessionHandler.handle(SessionHandler.java:703) at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:763) at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:181) at org.eclipse.jetty.server.Server.handle(Server.java:179) at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:619) at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:410) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99) at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:971) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1201) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1156) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.AssertionError: Cache contains either 'com.top_logic.dob.identifier.ObjectKey' or 'com.top_logic.dob.meta.IdentifiedObject'. at com.top_logic.knowledge.ByValueReferenceStorageImpl.getObjectKey(ByValueReferenceStorageImpl.java:169) at com.top_logic.knowledge.ByValueReferenceStorageImpl.fromCacheToApplicationValue(ByValueReferenceStorageImpl.java:79) at com.top_logic.knowledge.ByValueReferenceStorageImpl.getApplicationValue(ByValueReferenceStorageImpl.java:102) at com.top_logic.knowledge.service.db2.AbstractDBKnowledgeItem.lookupValue(AbstractDBKnowledgeItem.java:148) at com.top_logic.knowledge.service.db2.DBKnowledgeItem.getAttributeValue(DBKnowledgeItem.java:246) at com.top_logic.knowledge.service.db2.DBKnowledgeItem.getValue(DBKnowledgeItem.java:189) at com.top_logic.knowledge.service.db2.AbstractDBKnowledgeItem.getValue(AbstractDBKnowledgeItem.java:314) at com.top_logic.model.v5.ReferencePreload.loadReferenceByValue(ReferencePreload.java:130) at com.top_logic.model.v5.ReferencePreload.prepare(ReferencePreload.java:102) at com.top_logic.model.export.Preloader.internalPrepare(Preloader.java:55) at com.top_logic.model.export.Preloader.prepare(Preloader.java:50) at com.top_logic.model.export.PreloadOperation.prepare(PreloadOperation.java:40) at com.top_logic.model.export.Preloader.prepare(Preloader.java:42) at com.top_logic.element.layout.grid.AbstractTreeGridBuilder$TreeGridHandler$2.doPrepareRows(AbstractTreeGridBuilder.java:466) at com.top_logic.layout.tree.model.AbstractTreeTableModel$TreeTable.prepareRows(AbstractTreeTableModel.java:222) at com.top_logic.layout.table.TableViewModel.internalRevalidateMatchCount(TableViewModel.java:2891) at com.top_logic.layout.table.TableViewModel.addToOpenFilters(TableViewModel.java:2611) at com.top_logic.layout.table.control.TableControl$OpenFilterDialogAction.openTableFilter(TableControl.java:1561) at com.top_logic.layout.table.control.TableControl$OpenFilterDialogAction.openTableFilter(TableControl.java:1552) at com.top_logic.layout.table.control.TableControl$OpenFilterDialogAction.executeChecked(TableControl.java:1547) at com.top_logic.layout.table.control.TableControl$CheckedTableCommand.execute(TableControl.java:1377) at com.top_logic.layout.table.control.TableControl$TableCommand.execute(TableControl.java:1327) at com.top_logic.layout.basic.AbstractControlBase.executeCommand(AbstractControlBase.java:981) at com.top_logic.layout.basic.component.ControlSupport.executeCommand(ControlSupport.java:223) at com.top_logic.layout.basic.component.ControlComponent$DispatchAction.handleCommand(ControlComponent.java:233) at com.top_logic.tool.boundsec.CommandHandlerUtil.handleCommand(CommandHandlerUtil.java:31) at com.top_logic.mig.html.layout.LayoutComponent.dispatchCommand(LayoutComponent.java:3063) at com.top_logic.mig.html.layout.CommandDispatcher.internalDispatchCommand(CommandDispatcher.java:196) ... 40 more
Apparently an attempt is made (determination of actually existing values?) to read this attribute from a superordinate line object that does not define this attribute (in particular its storage rule).
Workaround
Instead of displaying the attribute column, configure this column again as a calculated column. Implement value determination and storage rule for the corresponding row type and declare the column as read-only for the other types.