%DeepSee.Query.query
Class %DeepSee.Query.query Extends node [ System = 3 ]
This class holds run-time information for a DeepSee MDX statement and provides the machinery to prepare and execute it (via the %DeepSee.ResultSet interface.
Properties
cube
Property cube As %DeepSee.Datatype.string(XMLPROJECTION = "attribute");
Name of the cube this query is based on.
This is the FROM clause of the query.
queryType
Property queryType As %DeepSee.Datatype.string(VALUELIST = ",SELECT,DRILLTHROUGH,CREATE,DROP,%BITSET", XMLPROJECTION = "attribute") [ InitialExpression = "SELECT" ];
This indicates what type of MDX statement this is.
%target
Property %target As %DeepSee.Datatype.string(VALUELIST = ",SET,MEMBER", XMLPROJECTION = "none") [ Internal ];
For CREATE or DROP statements this specifies the target of the command.
%targetKey
Property %targetKey As %DeepSee.Datatype.string(XMLPROJECTION = "none") [ Internal ];
For DROP statements this specifies the key of the item to be dropped.
useCache
Property useCache As %Boolean(XMLPROJECTION = "attribute") [ InitialExpression = 1 ];
If true, then use results caching for this query.
%isCompound
Property %isCompound As %Boolean(XMLPROJECTION = "attribute") [ InitialExpression = 0 ];
If true, then this is a query on a compound cube.
%isCompoundMember
Property %isCompoundMember As %Boolean [ InitialExpression = 0 ];
If true, this query is being run as a subquery in a compound cube.
parentCube
Property parentCube As %String;
Contains the parent cube name if query is a member of a subquery.
%mustCompute
Property %mustCompute As %Boolean(XMLPROJECTION = "none") [ InitialExpression = 0, Internal ];
If true, then the query must be recomputed-- the cached results are not guaranteed to be up-to-date.
%recomputeAxes
Property %recomputeAxes As %Boolean(XMLPROJECTION = "none") [ InitialExpression = 0, Internal ];
If true, then the axes for the query must be recomputed.
%removeEmpty
Property %removeEmpty As %Boolean(XMLPROJECTION = "none") [ Internal, MultiDimensional ];
Indicates, by axis, if empty value needs to be removed after processing. This is used by compound queries.
recompute
Property recompute As %Boolean(XMLPROJECTION = "none") [ InitialExpression = 1 ];
If true recompute previously run queries whose data has been updated. otherwise return old values.
useAgents
Property useAgents As %Boolean(XMLPROJECTION = "none") [ InitialExpression = 0 ];
If true, execute using background agents.
This is set when using async mode.
showPlan
Property showPlan As %Boolean(XMLPROJECTION = "none") [ InitialExpression = 0 ];
If true, execute this query in "plan" mode.
axes
Relationship axes As %DeepSee.Query.axis(XMLELEMENTREF = 1, XMLPROJECTION = "ELEMENT", XMLTYPECONSTRAINT = "CHOICE") [ Cardinality = many, Inverse = query ];
Axes defined for this query.
parentQueryKey
Property parentQueryKey As %String(XMLPROJECTION = "none");
For subqueries, remember which parent query initiated it.
parentWITHText
Property parentWITHText As %String(XMLPROJECTION = "none") [ Internal ];
Canonic form of WITH clause. Used internally to create hash keys.
subqueries
Property subqueries As list Of %DeepSee.ResultSet(XMLPROJECTION = "NONE");
Collection of all subqueries associated with this query.
slicer
Property slicer As %DeepSee.Query.axis(XMLPROJECTION = "ELEMENT");
Slicer defined for this query.
This is the WHERE clause of the query.
From a definition perspective this is no different than any other axis.
filters
Property filters As list Of %DeepSee.Query.axis(XMLPROJECTION = "ELEMENT");
Filter(s) defined for this query.
This is the ISC extension %FILTER clause of the query.
filterAxis
Property filterAxis As %DeepSee.Query.axis(XMLPROJECTION = "NONE");
Used to hold cube/subjectArea level filter.
measureAxis
Property measureAxis As %Integer [ InitialExpression = -1 ];
Used as an indicator as to which axis supplies the measure information for this query. The slicer is denoted by a 0, other axes are logged as their 1-based number. A value of -1 for this property indicates the default measure will be used.
%WITHText
Property %WITHText As %String(XMLPROJECTION = "none") [ Internal ];
Canonic form of WITH clause. Used internally to create hash keys.
namedSets
Property namedSets As array Of %DeepSee.Query.namedSet(XMLKEYNAME = "setName", XMLPROJECTION = "ELEMENT");
Collection of Named Sets defined within the WITH clause of the query.
calculatedMembers
Property calculatedMembers As array Of %DeepSee.Query.calculatedMember(XMLKEYNAME = "memberName", XMLPROJECTION = "ELEMENT");
Collection of Calculated Members defined within the WITH clause of the query. These are indexed by Dimension.MemberName.
%QueryKey
Property %QueryKey As %String(XMLPROJECTION = "none") [ Internal ];
Hash key used to address the results for this query. This allows a query to be prepared and later restored.
%Statistics
Property %Statistics As %DeepSee.Datatype.string [ Internal, MultiDimensional ];
Array of timing and performance statistics for this query.
%returnList
Property %returnList As %String(MAXLEN = 2000, XMLPROJECTION = "none") [ Internal ];
List of fields in RETURN clause for DRILLTHROUGH statement.
%orderList
Property %orderList As %String(MAXLEN = 2000, XMLPROJECTION = "none") [ Internal ];
List of fields in %ORDER BY clause for DRILLTHROUGH statement.
%listing
Property %listing As %String(MAXLEN = 255, XMLPROJECTION = "none") [ Internal ];
Name of listing specified by %LISTING statement in query.
%listingSource
Property %listingSource As %String(VALUELIST = "source,facts", XMLPROJECTION = "none") [ Internal ];
For a drillthrough, this indicates whether the listing query is against the source table or the fact table.
%NamedParameters
Property %NamedParameters As %String [ Internal, MultiDimensional ];
Array of named parameters with current values.
%ParameterValues
Property %ParameterValues As %String [ Internal, MultiDimensional ];
Array of named parameter values supplied when this query was executed.
%hasRelations
Property %hasRelations As %Boolean(XMLPROJECTION = "none") [ InitialExpression = 0, Internal ];
If true, this query contains references to related cubes.
This is set during the axis prepare phase.
%hasRelationship
Property %hasRelationship As %Boolean(XMLPROJECTION = "none") [ InitialExpression = 0, Internal ];
If true, this query contains references to related cubes.
Set during the parse phase, might replace %hasRelations.
%hasSqlRestrict
Property %hasSqlRestrict As %Boolean(XMLPROJECTION = "none") [ InitialExpression = 0, Internal ];
If true, this query contains an %SQLRESTRIICT statement.
Set during the parse phase.
%MaxListingRows
Property %MaxListingRows As %Integer [ InitialExpression = 1000, Internal ];
Maximum number of rows returned by a DRILLTHROUGH query. This is set by the MAXROWS directive within a DRILLTHROUGH query.
compoundQueries
Property compoundQueries As list Of %String(XMLPROJECTION = "NONE");
For queries on compound cubes, this is the set of keys for the subqueries that have to be executed and then joined.
compoundDrillthroughs
Property compoundDrillthroughs As list Of %String(XMLPROJECTION = "NONE");
For DRILLTHROUGH queries on compound cubes, this is the MDX DRILLTHROUGH statements for each leg of the compound query.
%originalAxisText
Property %originalAxisText As %String [ Internal, MultiDimensional ];
Original text for each axis. Used as part of the axis key.
%originalWITHContents
Property %originalWITHContents As %String;
Original components of the WITH clause. Order is not necessarily preserved from the original query text.
%variables
Property %variables As %String [ MultiDimensional ];
Current pivot variable settings for this query.
%LockKeys
Property %LockKeys As %String [ MultiDimensional ];
This holds a copy of all lock keys protecting this execution.
Methods
%QueryTrace
ClassMethod %QueryTrace(pMethod As %String, pCubeName As %String, pMessage As %String = "") As %Status [ Internal ]
Log a step within the execution of this query. This is an internal diagnostic.
%PrintNode
Method %PrintNode(pLevel As %Integer = 0)
Diagnostic. Print value of this node to the console.
%Prepare
Method %Prepare() As %Status
Prepare this query.
This is the first step in executing a query.
%HasOrder
Method %HasOrder(pMember, Output pHasOrder, Output pGroup) As %Status
Check if pMember has an ORDER() function in it (or in one of its children).
%HasSubsetFunction
Method %HasSubsetFunction(ByRef pMember, Output pGroup, Output pHasSubsetFunction) As %Status
Check if a given group has a subset function (HEAD, TAIL, SUBSET) in it and, if so, return the first such subgroup with output pGroup.
%CompleteAxes
Method %CompleteAxes() As %Status
Make sure this query has an executable set of axes. Axes 0 and 1 (COLUMNS, ROWS) are required, axis 2 is optional. If either Rows or Columns are missing, insert a placeholder %SEARCH term
%HasCurrentMember
Method %HasCurrentMember(pGroup As %DeepSee.Query.group) As %Boolean [ Internal ]
Test if a group has a current member in it.
%HasCrossJoin
Method %HasCrossJoin(pGroup As %DeepSee.Query.group) As %Boolean [ Internal ]
Test if a group has a crossjoin in it (with an aggregate or expression as its first child).
%IsAggFunc
ClassMethod %IsAggFunc(pFunc As %String) As %Boolean
Test if pFunc is an aggregate function
%RewriteForCurrentMember
Method %RewriteForCurrentMember(pParentGroup As %DeepSee.Query.group, pGroup As %DeepSee.Query.group, Output pNewGroup As %DeepSee.Query.group, ByRef pCmbrIndex, ByRef pCmbrID, Output pCmbrList, pLevel As %Integer = 0, pTreatAsExpr As %Boolean = 0) As %Status [ Internal ]
Rewrite a group and clean up the current member functions within it. On return pCmbrIndex contains the list of cmbr substitutions: pCmbrIndex("$$CMBRn$$") = spec
pCmbrID and pCmbrList are used to track state as this function recurses.
%RewriteForCrossJoin
Method %RewriteForCrossJoin(pParentGroup As %DeepSee.Query.group, pGroup As %DeepSee.Query.group, Output pNewGroup As %DeepSee.Query.group, pLevel As %Integer = 0) As %Status [ Internal ]
Rewrite a group and rewrite any CJOIN(agg(a),b) to CJOIN(b,agg(a))). Do the same for expression in the first child.
%RewriteForOrder
Method %RewriteForOrder(pAxis As %DeepSee.Query.axis, pOppAxis As %DeepSee.Query.axis) As %Status
Rewrite a group if necessary to sort the members of pOppAxis.
%GetMeasureFromSpec
ClassMethod %GetMeasureFromSpec(pSpec As %String, Output pMeasure) As %Status [ Internal ]
Utility. See if this spec is for a measure. If so return the measure name.
%PushDownCurrentMember
Method %PushDownCurrentMember(Output pNewGroup As %DeepSee.Query.group, pCurrMember As %DeepSee.Query.group, pExpr As %DeepSee.Query.group, pLevel As %Integer = 0) As %Status [ Internal ]
Push a current member down into an expression tree.
%ProcessSlicerRestrictions
Method %ProcessSlicerRestrictions(Output pBranches, Output pNoData As %Boolean) As %Status [ Internal ]
Build member restriction data from the materialized slicer axis. This is called by %GetMembers to prune the results based on the current slicer.
%FlattenSlicer
Method %FlattenSlicer(pNode As %DeepSee.Query.group, pLevel As %Integer = 0, Output pMoveAll As %Boolean) As %Status [ Internal ]
Walk down a given node within the slicer and flatten expressions and aggregate functions.
%CombineFiltersWithSlicer
Method %CombineFiltersWithSlicer() As %Status [ Internal ]
Combine all filters into the slicer.
%TestSubQueryCache
ClassMethod %TestSubQueryCache(pCubeName As %String, pQueryKey As %String, pTimestamp As %String, Output pCurrent As %Boolean, pQueryCube As %String) As %Status
Given a cube, subquery key, and timestamp, determine if there is an up-to-date result cache for the query. Return true (1) if this is the case.
As a side effect, remove any out-of-date portions of the result cache for this query.
%CheckSubqueryResultsCache
ClassMethod %CheckSubqueryResultsCache(pMainCube, pCubeName, pQueryKey, ByRef pUpToDate = 1) As %Status
%CheckResultsCache
ClassMethod %CheckResultsCache(pCubeName, pQueryKey, ByRef pUpToDate = 1) As %Status
%InitializeResultsCache
Method %InitializeResultsCache() As %Status [ Internal ]
Prepare the results cache for this query so that it can contain the axis and cell values.
If the query is already in the results cache, then this method may decide to re-use the previous results.
%PrepareResultsCache
Method %PrepareResultsCache() As %Status [ Internal, Private ]
Called after the axes are ready, this method does the final check to determine if the query results can be re-used and if not, fills in the starting values for the result cache.
%GetParameterInfo
Method %GetParameterInfo(Output pParms) As %Status
Return the set of named parameters values defined by this query.
%PreProcessQuery
Method %PreProcessQuery() As %Status
Execute the pre-processing logic for this node.
%ExecuteAsynch
Method %ExecuteAsynch(pWait As %Boolean = 0, Output pTaskGroupId As %String, pAxesOnly As %Boolean = 0, pAxisQuery As %String = "", ByRef pParms) As %Status
Execute this query using background agents.
If pWait is true (1) then do not return until the background agents are finished.
If pWait is false, then pTaskGroupId will return the task group id used to execute the query.
%ExecuteParameters
Method %ExecuteParameters(ByRef pParms) As %Status
Apply the set of named parameters values to this query and then make sure the result cache is ready to accept values.
%ExecuteAxes
Method %ExecuteAxes() As %Status [ Internal ]
Execute this query and materialize the contents of the result axes.
The results are written to the results cache.
%ReserveAxes
Method %ReserveAxes(Output pAxesAvailable) As %Status [ Internal ]
%ReleaseReservedAxes
ClassMethod %ReleaseReservedAxes(pCubeName, pQueryKey) As %Status [ Internal ]
Utility method to remove the zprocessing node for reserved axes
%MakeReserveAxisKey
Method %MakeReserveAxisKey(pType As %String, pAxis As axis, Output pReserveKey As %String, pOriginalSpec As %String = "") As %String [ Internal ]
%InitializeAxisCache
Method %InitializeAxisCache(pType As %String, pAxis As axis, Output pAxisKey As %String, Output pUpToDate As %Integer, pOriginalSpec As %String = "") As %Status [ Internal ]
Set up the axis cache for the given axis. Also test if the axis already exists and is up-to-date.
On return, pUpToDate is 1 if the axis is up-to-date, 0 if it is not, and -1 if it is a reference axis that needs further checking.
%ExecuteCells
Method %ExecuteCells(pTrace As %Boolean = 0) As %Status [ Internal ]
Execute this query and calculate the contents of the resulting cells.
Note that this may be called on a partially constructed query object if a ResultSet was prepared using an existing query key.
%ExecuteIntermediateCells
ClassMethod %ExecuteIntermediateCells(pCubeName As %String, pQueryKey As %String, pUseAgents As %Boolean = 1, pTrace As %Boolean = 0, ByRef pStats) As %Status [ Internal ]
This does the actual work of splitting the cells into buckets and sections and executing them.
This may be called from a background agent.
%ToString
Method %ToString(Output pSC As %Status) As %String
Convert this node to its text representation.
%WITHToString
Method %WITHToString() As %String
Convert the WITH clause for this query (named sets and calculated members) to a canonic text representation.
%LookupNamedSet
Method %LookupNamedSet(pName As %String, ByRef pSet As %DeepSee.Query.set, Output pSC As %Status) As %Boolean
See if the specified named set is defined.
pName should not have [ ] characters around it.
%LookupCalculatedMember
Method %LookupCalculatedMember(ByRef pMemberSpec As %String, pCount As %Integer, ByRef pSet As %DeepSee.Query.set, Output pSC As %Status, Output pIsFunc As %Boolean, pUseKey As %Boolean = 0) As %Boolean
See if the specified calculated member is defined.
pMemberSpec is an array of the names making up the member spec. pCount is the number of names to look at in the list. None of the names in the list should have [ ] characters around them.
If the last item in the list is the name of one of the few functions allowed on calculated dimensions, then pIsFunc is set.
%GetCalculatedMembers
Method %GetCalculatedMembers(pDimName As %String, ByRef pList As %String) As %Status
Find the list of calculated members in the given dimension. Return a list of their names: pList(UNAME) = name
%RegisterSubQuery
Method %RegisterSubQuery(pMDX As %String, Output pKey As %Integer, pAxis As axis = "", pSkipWITH As %Boolean = 0) As %Status
Add the given subquery to the list of subqueries and return its key (for subsequent lookup).
%CreateSubQueryResultSet
Method %CreateSubQueryResultSet(pMDX As %String, Output pRS As %DeepSee.ResultSet, pSkipWITH As %Boolean = 0) As %Status
Create and prepare a result set for a subquery within this query.
%GetSubQuery
Method %GetSubQuery(pKey As %Integer, Output pRS As %DeepSee.ResultSet) As %Status
Retrieve a ResultSet from the set of registered subqueries.
%ClearStatistics
Method %ClearStatistics()
Clear out current statistics for this query.
%PrintStatistics
Method %PrintStatistics()
Write out current statistics for this query.
%ResolveNamedParm
Method %ResolveNamedParm(pParmName As %String, Output pValue As %String) As %Status [ Internal ]
Evaluate the given named parameter and return its value.
%ComputeAxisCRC
ClassMethod %ComputeAxisCRC(pCube As %String, pAxisKey As %String, Output pCRC) As %Status [ Internal ]
Compute a CRC on the given query axis.<br/ This is used to determine if a cached axis is still valid.
%FoldCompoundQueries
Method %FoldCompoundQueries() As %Status [ Internal ]
Combine the results of a set of subqueries against the components of a compound cube.
%RewriteCompoundQuery
Method %RewriteCompoundQuery(Output pMDX As %String, pPrimaryCube As %String, pSubCube As %String, Output pNonEmptyInfo) As %Status [ Internal ]
Rewrite this query for use by a leg of a compound query.
pNonEmptyInfo indicates which axes are NON EMPTY; this is because the rewritten query does not have NON EMPTY-- it is applied at the end of the query.
%RewriteWITH
Method %RewriteWITH(pWithText As %String, pPrimaryCube As %String, pSubCube As %String, Output pText As %String) As %Status [ Internal ]
%RewriteGroup
Method %RewriteGroup(Output pNewGroup As %DeepSee.Query.group, pIsSlicer As %Boolean, pPrimaryCube As %String, pSubCube As %String, pGroup As group, ByRef pCalcMbrNames As %String) As %Status [ Internal ]
Rewrite part of a query for use by a compound query.
%GetLanguage
ClassMethod %GetLanguage() As %String [ Internal ]
Return the RFC 1766 code of the current language. Used to ensure that cached values preserve localization.
%CompressTimeRange
Method %CompressTimeRange(pNode As %DeepSee.Query.range) As %DeepSee.Query.node [ Internal ]
See if a time range can be compressed into smaller units.
%SplitDateRange
ClassMethod %SplitDateRange(pStartDate As %Date, pEndDate As %Date, Output pRange, pCalendar As %String = "gregorian") As %Boolean [ Internal ]
Given a start and end of a date range, return a set of ranges that cover the original range with as few members as possible. The higher level units are months and years. Return an array of ranges:
pRange(n) = $LB("day|month|year",start,end)
%GetLastDay
ClassMethod %GetLastDay(pYear As %Integer, pMonth As %Integer, pCalendar As %String) As %Integer [ Internal ]
Return the last day (number) of the given year and month.
%GetLastDayHorolog
ClassMethod %GetLastDayHorolog(pYear As %Integer, pMonth As %Integer, pCalendar As %String = "gregorian") As %Integer [ Internal ]
Return the last day (number) of the given year and month.
%GetFirstDayHorolog
ClassMethod %GetFirstDayHorolog(pYear As %Integer, pMonth As %Integer, pCalendar As %String = "gregorian") As %Integer [ Internal ]
%SplitDate
ClassMethod %SplitDate(pDate As %Date, pCalendar As %String = "gregorian", Output pYear, Output pMonth, Output pDay) As %Status [ Internal ]
Return the last day (number) of the given year and month.
%RewriteForTimeFolding
Method %RewriteForTimeFolding(pParentGroup As %DeepSee.Query.group, pGroup As %DeepSee.Query.group, Output pNewGroup As %DeepSee.Query.group, pLevel As %Integer = 0) As %Status [ Internal ]
Rewrite a group and rewrite any SUM(timeRange) as SUM(foldedTimeRange). Also applies to %OR().
%FindMemberInfo
Method %FindMemberInfo(pNode As %DeepSee.Query.node, Output pMember As %DeepSee.Query.member) As %Status [ Internal ]
Utility method. Try to find the dimension info assoiciated with the provided query object.
%IsMeasure
ClassMethod %IsMeasure(pNode As %DeepSee.Query.node, Output pStatus) As %String [ Internal ]
Utility Method. Determine whether the current node can be considered a measure. Returns: "cell" - This node is a spreadsheet function and is exempt 1 - This node functions as a measure 0 - This node does not function as a measure
%IsMember
ClassMethod %IsMember(pNode As %DeepSee.Query.node, Output pStatus) As %Boolean [ Internal ]
Utility Method. Determine whether the current node can be considered a member
%HasMeasure
ClassMethod %HasMeasure(pNode As %DeepSee.Query.node, ByRef pStatus As %Status) As %Boolean [ Internal ]
Test for an existence of a measure in pNode.
%HasRelations
ClassMethod %HasRelations(pCube, pNode As %DeepSee.Query.node, ByRef pStatus As %Status) As %Boolean
Utility method to test for related cube terms in a %DeepSee.Query.node object
%AddLabel
ClassMethod %AddLabel(pReferenceGroup As %DeepSee.Query.group, pLabel As %DeepSee.Query.group = "", Output pLabeledGroup As %DeepSee.Query.group) As %Status
Add a %LABEL to pReferenceGroup. The label is supplied to the method as an abstracted %LABEL object pLabel. The input group is placed in the first argument of a %LABEL which contains all the same parameters that are defined in pLabel. The newly labeled group is returned in pLabeledGroup.
%RemoveLabel
ClassMethod %RemoveLabel(pReferenceGroup As %DeepSee.Query.group, Output pLabelGroup As %DeepSee.Query.group, Output pInnerGroup As %DeepSee.Query.group) As %Status
Remove the %LABEL and expose the group is is acting upon. The abstracted contents of the %LABEL are returned as the pLabelGroup.
%RemoveLabelsInFilterExpression
ClassMethod %RemoveLabelsInFilterExpression(pReferenceGroup As %DeepSee.Query.group, Output pOutputGroup As %DeepSee.Query.group, pCubeName As %String = "") As %Status
%IsCrossjoinSwapExempt
ClassMethod %IsCrossjoinSwapExempt(pNode1, pNode2) As %Boolean [ Internal ]
Test to determine if the two provided crossjoin terms are swap-exempt
%RewriteNodeAsSubquery
ClassMethod %RewriteNodeAsSubquery(pNode) As %DeepSee.Query.node
Write the node as the columns clause in an %MDX subquery.
%SetVariables
Method %SetVariables(ByRef pVariables) As %Status
%ResolveVariablesInText
ClassMethod %ResolveVariablesInText(pMDX As %String, ByRef pVariables) As %Status
Resolve any instances of "$variable.Name" in the text pMDX using values in the lookup array pVariables.
%NullifyAxis
ClassMethod %NullifyAxis(pAxisKey) As %Status
Set the axis to a literal null
%CreateResultKey
Method %CreateResultKey(Output pStatus As %Status = {$$$OK}, Output pFinalText = "", pRefreshKey As %Boolean = 0, pMDXRequest As %String = "") As %String
Generate the result key for the current query object.
%CreateAxisKey
Method %CreateAxisKey(Output pStatus As %Status = {$$$OK}, pType = "", pAxis As %DeepSee.Query.axis = {$$$NULLOREF}, pOriginalSpec = "", Output pFinalText = "", pRefreshKey As %Boolean = 0) As %String
Generate an axis key for a %DeepSee.Query.axis object.
%ClearQueryResults
ClassMethod %ClearQueryResults(pCubeName As %String = "", pQueryKey As %String = "") As %Status [ Internal ]
This method provides a means for safely killing previously cached results without destroying the
^DeepSee.Cache.Results(CUBEKEY,QueryKey,"query")
node. Primarily this allows %PrepareKey to function if an execution determines the remainder of the cache is stale and cannot be reused.
%IsExecutable
Method %IsExecutable(Output pStatus = {$$$OK}, Output pReason As %String = "") As %Boolean
Test the current query object for enabled dimensions, measures, and relationships as aplicable. If all items have completed a build process and contain queryable data, the query is executable.