Queries¶
Abstract¶
This section details the queries supported by this module.
Query Format¶
Unlike the queries used in the nexiles|gateway core, this plug-in uses a structured query format. Queries need to be given as JSON Objects.
We support passing queries:
- as URL Parameter
- in the request body
URL Parameter¶
To support easy testing and manual queries using a web browser, the plug-in supports queries specified as URL parameter. Multiple queries are accepted, they are aggregated into one composite query.
Examples (only the query part is shown):
.../services/query/1.0/query?q={"name":"*.prt"}
.../services/query/1.0/query?q={"type":"wt.part.WTPart","name":"*.prt"}
.../services/query/1.0/query?q={"number":"0815*"}&q={"type":"wt.part.WTPart","name":"*.prt"}
.../services/query/1.0/query?q={"name":"269*.asm","config_spec":"latest"}
Request Body¶
For automated uses it is easier to specify the query in the request body.
Note
Be sure that you specify the correct mime type in the HTTP header application/json
Example (matches the third query from the URL parameter example):
{
"qq": [
{
"number": "0815*"
} , {
"type": "wt.part.WTPart"
"name": "*.prt"
}
]
}
Query Filters¶
All the query filters supported by the nexiles|gateway core query module are supported.
Config Specs¶
The user of this plug-in can make use of config specs. These are additional filters which are processed on the server and filter the result set in certain ways.
Config specs are passed as config_spec key in the query. The value of this key specifies the config spec, e.g:
"config_spec": "<<config-spec-type>>"
Some config specs take arguments, which are passed after the type separated by pipes (|):
"config_spec": "<<config-spec-type>>|<<argument>>|<<argument>>|...."
Note
Config Specs can not be combined.
Note
Some Config Specs are usable only on certain types.
config spec: Latest¶
allowed types: | Iterated types |
---|
:type latest :arguments: none example: “config_spec”: “latest”
Returns, in priority order, the latest iteration for a master owned by the current principal, the latest iteration by comparing the iterationIdentifier’s series value if not owned by the current principal, or the latest by create Timestamp if the series values are equivalent. Note that only one iteration is returned for any given master.
config spec: Life Cycle State¶
allowed types: | things which have a life cycle |
---|
:type lifecycle :arguments: the life cycle name example: “config_spec”: “lifecycle|INWORK”
This config spec filters the result set for a given life cycle state.
Original WT10 docs:
The LifeCycleConfigSpec can be applied to LifeCycleManaged elements to filter them based on life cycle state. Only those elements at the specified life cycle state will be returned.
config spec: Folder¶
allowed types: | things which have are Foldered |
---|
:type folder :arguments: The OID of a Folder object, or a cabinet based object. example: “config_spec”: “folder|OR:wt.folder.Cabinet:12345”
The IteratedFolderedConfigSpec can be used to filter IteratedFoldered elements based on folder location. Only those elements in the particular folder or sub-folder will be returned by this ConfigSpec.
Uf the OID passed resolves to a object which implements the ‘Folder’ interface, then this object is used, else a method getDefaultCabinet is queried to fetch the default cabinet of the object. This is means that one can pass e.g. a Product, a Library etc. and the config spec works as expected.
Fields and Associations¶
Often it’s application dependent how much information about each of the results is actually needed.
Per default the query plug-in only reports a minimal set of values per query result to keep the response time down.
If an application needs more information, then it can specify fields and associations along with the query.
- fields
- This specifies the attributes which are read from the resulting object. Please note, this only works for simple object attributes. If a attribute is not found, then null is returned.
- associations
- This specifies the associations which should be returned per result object. This is expensive in terms of processing time on the server – so be careful.
Fields¶
Field examples¶
Note
For a comprehensive list refer to the Windchill java docs and look for simple attributes.
field name | description | object type |
---|---|---|
name | the name attribute | e.g. EPMDocument |
CADName | the CADName attribute | e.g. EPMDocument |
latestIteration | the latestIteration attribute | all Iterated types |
state | the Life Cycle State attribute | all Iterated types |
location | the folder the object is located in | all Foldered types |
folderPath | path of the object in it’s container | all Foldered types |
containerName | the name of the container of this object | all Contained types |
versionDisplayIdentifier | the version | all Versioned types |
iterationDisplayIdentifier | the iteration | all Versioned types |
Note
The example latestIteration is actually a flag returned by the method isLatestIteration() – but we can only use values not methods.
Example Query¶
Consider the following query:
http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/services/query/1.0/query?limit=5&q={"name":"SQ*.prt%"}&field=name&field=CADName&field=latestIteration&field=number
Here, we ask for all EPMDocument types which have a name attribute like SQ*.prt, and we’d like additionally see the attributes name, number, CADName and isLatestIteration.
Note
For easier debugging and testing, we also allow to specify the fields URL parameter. Note that there the name is singular because URL parameter can be specified multiple times.
The JSON post body parameter is called fields (plural).
Here’s the result (shortened, formatted):
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/services/query/1.0/query/190952?start=0&limit=5&page=0",
next: "http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/services/query/1.0/query/190952?start=0&limit=5&page=1",
session: 190952,
start: 0,
count: 5,
success: true,
limit: 5,
page: 0,
pos: 0,
total_count: 433,
items: [
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/api/1.0/epmdocuments/OR:wt.epm.EPMDocument:48430",
latestIteration: true,
CADName: "sqb.prt",
number: "SQB.PRT",
details: "http://windchill.virtual.nexiles.com/Windchill/app/#ptc1/tcomp/infoPage?oid=OR:wt.epm.EPMDocument:48430&u8=1",
oid: "OR:wt.epm.EPMDocument:48430",
name: "sqb.prt"
},
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/api/1.0/epmdocuments/OR:wt.epm.EPMDocument:49045",
latestIteration: true,
CADName: "sqb001.prt",
number: "SQB001.PRT",
details: "http://windchill.virtual.nexiles.com/Windchill/app/#ptc1/tcomp/infoPage?oid=OR:wt.epm.EPMDocument:49045&u8=1",
oid: "OR:wt.epm.EPMDocument:49045",
name: "sqb001.prt"
},
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/api/1.0/epmdocuments/OR:wt.epm.EPMDocument:48588",
latestIteration: true,
CADName: "sqb002.prt",
number: "SQB002.PRT",
details: "http://windchill.virtual.nexiles.com/Windchill/app/#ptc1/tcomp/infoPage?oid=OR:wt.epm.EPMDocument:48588&u8=1",
oid: "OR:wt.epm.EPMDocument:48588",
name: "sqb002.prt"
},
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/api/1.0/epmdocuments/OR:wt.epm.EPMDocument:48771",
latestIteration: true,
CADName: "sqb003.prt",
number: "SQB003.PRT",
details: "http://windchill.virtual.nexiles.com/Windchill/app/#ptc1/tcomp/infoPage?oid=OR:wt.epm.EPMDocument:48771&u8=1",
oid: "OR:wt.epm.EPMDocument:48771",
name: "sqb003.prt"
},
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/api/1.0/epmdocuments/OR:wt.epm.EPMDocument:48667",
latestIteration: true,
CADName: "sqb004.prt",
number: "SQB004.PRT",
details: "http://windchill.virtual.nexiles.com/Windchill/app/#ptc1/tcomp/infoPage?oid=OR:wt.epm.EPMDocument:48667&u8=1",
oid: "OR:wt.epm.EPMDocument:48667",
name: "sqb004.prt"
}
]
}
Associations¶
Associations are used in e.g. ExtJS to model data structures which have associations. In Windchill, we have multiple associations, which are type specific.
Examples:
- IBA Attributes
- Some object may have IBA Attributes.
- Secondary Content
- Objects which implement the ContentHolder interface may have multiple content objects.
- Representations
- Objects which implement the Representable interface may have multiple representations (viewables).
Association Keys¶
assoc key | description | remark | status |
---|---|---|---|
ibas | IBA attributes | Only EPMDocument types ATM | draft |
content | content files | objects implementing the ContentHolder interface | draft |
vault_info | vault file info | objects implementing the ContentHolder interface | draft |
files | content files using file service URLs | objects implementing the ContentHolder interface | draft |
representations | representations | objects implementing the Representable interface | draft |
versions | version history | objects implementing the Iterated interface | not yet implemented |
iterations | iteration history | objects implementing the Iterated interface | not yet implemented |
Example query¶
Please consider the following query:
http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/services/query/1.0/query?q={"name":"SQ*.prt"}&field=name&field=CADName&field=latestIteration&assoc=ibas&assoc=representations&limit=5
Here we again ask for EPMDocument types matching a certain name pattern, include some additional fields (see above). This time, we asked for the associations ibas and representations.
Note
For easier debugging and testing, we also allow to specify the associations as URL parameter. Note that for the URL parameter the key is assoc (singular) since that parameter can be specified multiple times.
The JSON post body parameter is called associations (plural).
This is the (shortened, only one result shown) result. Things to notice:
- A association returns a empty list if it contains no objects. This is also true if the association does not match the result type.
- The runtime (_runtime field) is considerably higher. In this example the back end needed to fetch all representations for the page results.
- Associations are not cached – if you request a page ten times, the associations are calculated ten times.
{
_runtime: 1.20300006866455078,
count: 5,
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/services/query/1.0/query/191313?start=0&limit=5&page=0",
next: "http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/services/query/1.0/query/191313?start=0&limit=5&page=1",
query: {
associations: [
"ibas",
"representations"
],
fields: [
"name",
"CADName",
"latestIteration"
],
qq: [
{
name: "SQ*.prt"
}
]
},
start: 0,
success: true,
limit: 5,
page: 0,
pos: 0,
total_count: 433,
items: [
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/nexiles/tools/api/1.0/epmdocuments/OR:wt.epm.EPMDocument:48430",
details: "http://windchill.virtual.nexiles.com/Windchill/app/#ptc1/tcomp/infoPage?oid=OR:wt.epm.EPMDocument:48430&u8=1",
oid: "OR:wt.epm.EPMDocument:48430",
name: "sqb.prt",
latestIteration: true,
CADName: "sqb.prt",
ibas: [ ],
representations: [
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/WindchillAuthGW/wt.content.ContentHttp/viewContent/wvspvp.pvp?u8&HttpOperationItem=wt.content.ApplicationData%3A88944&ContentHolder=wt.viewmarkup.DerivedImage%3A88929&originalFileName=wvspvp.pvp&forceDownload=true",
role: "PRODUCT_VIEW_EDP",
filename: "wvspvp.pvp",
name: "Demo"
},
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/WindchillAuthGW/wt.content.ContentHttp/viewContent/sqb_prt.pvm?u8&HttpOperationItem=wt.content.ApplicationData%3A88953&ContentHolder=wt.viewmarkup.DerivedImage%3A88929&originalFileName=sqb_prt.pvm&forceDownload=true",
role: "PRODUCT_VIEW_EDM",
filename: "sqb_prt.pvm",
name: "Demo"
},
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/WindchillAuthGW/wt.content.ContentHttp/viewContent/sqb_prt_small.jpg?u8&HttpOperationItem=wt.content.ApplicationData%3A88938&ContentHolder=wt.viewmarkup.DerivedImage%3A88929&originalFileName=sqb_prt_small.jpg&forceDownload=true",
role: "THUMBNAIL_SMALL",
filename: "sqb_prt_small.jpg",
name: "Demo"
},
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/WindchillAuthGW/wt.content.ContentHttp/viewContent/sqb_prt.pvs?u8&HttpOperationItem=wt.content.ApplicationData%3A88956&ContentHolder=wt.viewmarkup.DerivedImage%3A88929&originalFileName=sqb_prt.pvs&forceDownload=true",
role: "PRODUCT_VIEW_ED",
filename: "sqb_prt.pvs",
name: "Demo"
},
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/WindchillAuthGW/wt.content.ContentHttp/viewContent/sqb_prt.pvt?u8&HttpOperationItem=wt.content.ApplicationData%3A88941&ContentHolder=wt.viewmarkup.DerivedImage%3A88929&originalFileName=sqb_prt.pvt&forceDownload=true",
role: "THUMBNAIL3D",
filename: "sqb_prt.pvt",
name: "Demo"
},
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/WindchillAuthGW/wt.content.ContentHttp/viewContent/sqb_prt.ol?u8&HttpOperationItem=wt.content.ApplicationData%3A88950&ContentHolder=wt.viewmarkup.DerivedImage%3A88929&originalFileName=sqb_prt.ol&forceDownload=true",
role: "SECONDARY",
filename: "sqb_prt.ol",
name: "Demo"
},
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/WindchillAuthGW/wt.content.ContentHttp/viewContent/sqb_prt.pva?u8&HttpOperationItem=wt.content.ApplicationData%3A88947&ContentHolder=wt.viewmarkup.DerivedImage%3A88929&originalFileName=sqb_prt.pva&forceDownload=true",
role: "SECONDARY",
filename: "sqb_prt.pva",
name: "Demo"
},
{
url: "http://windchill.virtual.nexiles.com/Windchill/servlet/WindchillAuthGW/wt.content.ContentHttp/viewContent/sqb_prt.jpg?u8&HttpOperationItem=wt.content.ApplicationData%3A88935&ContentHolder=wt.viewmarkup.DerivedImage%3A88929&originalFileName=sqb_prt.jpg&forceDownload=true",
role: "THUMBNAIL",
filename: "sqb_prt.jpg",
name: "Demo"
}
]
},
...
]
}
Macro Expansion¶
Some queries are very cumbersome for the end-user to specify. Therefore, the query plugin supports macros.
macro key | parameters | description |
---|---|---|
@folder_path | context | Expands into a series of folder queries |
Macro: folder_path¶
This macro expands into a series of folder queries such that the query will limit itself to objects below or in the given folder path.
Example – find all assemblies below /Default/1_CoreAndFrame of the given context:
{
"qq": [
"@folder_path": "/Default/1_CoreAndFrame",
"context": "OR:wt.inf.library.WTLibrary:3204656",
"name": "*.asm"
],
"fields": [ ... ]
}
Query Options¶
You can set these global options on a query using the options key:
option | description |
---|---|
adminquery | Execute query as administrator |