Difference between revisions of "LavishScript:Object Queries"

From Lavish Software Wiki
Jump to navigation Jump to search
Line 1: Line 1:
{{stub}}
 
 
== Description ==
 
== Description ==
 
:Object query support has been added. Extensions can use ISXDK 30a (or later) for direct access to this functionality. An object query is a math formula where all variables are relative to a specific object, and results in a boolean value -- the query is either true, or it is false.
 
:Object query support has been added. Extensions can use ISXDK 30a (or later) for direct access to this functionality. An object query is a math formula where all variables are relative to a specific object, and results in a boolean value -- the query is either true, or it is false.
Line 17: Line 16:
 
* &&, ||, and () are supported
 
* &&, ||, and () are supported
 
* Special keyword NULL replicates "(exists)" typecast behavior
 
* Special keyword NULL replicates "(exists)" typecast behavior
: LavishScript: if ${a(exists}
+
: LavishScript: if ${a(exists)}
 
: Query Syntax: a !~ NULL  
 
: Query Syntax: a !~ NULL  
 
* Special Operators:
 
* Special Operators:
Line 26: Line 25:
 
:* !~ Strong compare, NOT value or type
 
:* !~ Strong compare, NOT value or type
  
== Example ==
+
== Example 1 ==
  
 
  function main()
 
  function main()
Line 55: Line 54:
 
  LavishScript.QueryEvaluate[7, System] TRUE
 
  LavishScript.QueryEvaluate[7, System] TRUE
 
  LavishScript.QueryEvaluate[8, System] FALSE
 
  LavishScript.QueryEvaluate[8, System] FALSE
 +
 +
== Example 2 (Using container/index methods) ==
 +
 +
*Original Code:
 +
  variable index:item anItemIndex
 +
  variable iterator  anIterator
 +
 +
  MyShip:GetCargo[anItemIndex]
 +
  anItemIndex:GetIterator[anIterator]
 +
 +
  if ${anIterator:First(exists)}
 +
  do
 +
  {
 +
      if ${anIterator.Value.GroupID} == GROUPID_SECURE_CONTAINER
 +
      {
 +
          return TRUE
 +
      }
 +
  }
 +
  while ${anIterator:Next(exists)}
 +
 +
*Converted To Query System:
 +
  variable index:item Items
 +
  variable iterator  ItemIterator
 +
 +
  MyShip:GetCargo[Items]
 +
  Items:GetIterator[ItemIterator]
 +
 +
  variable string Query = "GroupID != GROUPID_SECURE_CONTAINER"
 +
  Items:RemoveByQuery[${LSQueryCache[${Query}]}]
 +
 
 +
  if ${ItemIterator:First(exists)}
 +
  {
 +
      return TRUE
 +
  }

Revision as of 03:29, 24 May 2011

Description

Object query support has been added. Extensions can use ISXDK 30a (or later) for direct access to this functionality. An object query is a math formula where all variables are relative to a specific object, and results in a boolean value -- the query is either true, or it is false.
Query math can compare and manipulate text, decimals, or integers (note that bool counts as an integer for this purpose) with standard math operators. Text comparisons are not case sensitive.
One intended use for object queries is a uniform search mechanism, to find an object or set of objects from a larger set of objects (compare to a SQL SELECT statement, where a LavishScript object query is the WHERE clause).

Members

  • uint LavishScript.CreateQuery[expression]: Creates a query with the given expression -- e.g. ${LavishScript.CreateQuery[Name=="Bonkers"]}
  • string LavishScript.RetrieveQueryExpression[#]: Retrieves the query expression for a previously created query, by ID
  • bool LavishScript.QueryEvaluate[#, object]: Determines if the given object matches the given query

Methods

  • LavishScript:FreeQuery[#]: Frees a previously created query, by ID

Expression/Operator Notes

  • Math operators identical to LS
  • &&, ||, and () are supported
  • Special keyword NULL replicates "(exists)" typecast behavior
LavishScript: if ${a(exists)}
Query Syntax: a !~ NULL
  • Special Operators:
  • =- Substring Name =- "Boobies" is true if Name.Find[Boobies]
  • = Weak compare, value only
  • == Strong compare, value + type
  • =~ Strong compare, value + type (same as ==)
  •  !~ Strong compare, NOT value or type

Example 1

function main()
{
	variable int ID
	variable int ID1
   
	; Example: Compare System.OS
	ID:Set[${LavishScript.CreateQuery[OS = "Windows 7 Ultimate"]}]
	ID1:Set[${LavishScript.CreateQuery[OS = "Windows 7 Ultimate && MemFree < 500 && MemTotal > 1000"]}]
  
	echo ID ${ID}
	echo LavishScript.RetrieveQueryExpression[${ID}] "${LavishScript.RetrieveQueryExpression[${ID}]}"
	echo LavishScript.RetrieveQueryExpression[${ID1}] "${LavishScript.RetrieveQueryExpression[${ID1}]}"
    
	echo System.OS ${System.OS}
	echo LavishScript.QueryEvaluate[${ID}, System] ${LavishScript.QueryEvaluate[${ID}, System]}
	echo LavishScript.QueryEvaluate[${ID1}, System] ${LavishScript.QueryEvaluate[${ID}, System]}
   
       LavishScript.FreeQuery[${ID}]
       LavishScript.FreeQuery[${ID1}]
}
ID 7
LavishScript.RetrieveQueryExpression[7] "OS = "Windows 7 Ultimate""
LavishScript.RetrieveQueryExpression[8] "OS = "Windows 7 Ultimate && MemFree < 500 && MemTotal > 1000""
System.OS Windows 7 Ultimate
LavishScript.QueryEvaluate[7, System] TRUE
LavishScript.QueryEvaluate[8, System] FALSE

Example 2 (Using container/index methods)

  • Original Code:
 variable index:item anItemIndex
 variable iterator   anIterator

 MyShip:GetCargo[anItemIndex]
 anItemIndex:GetIterator[anIterator]

 if ${anIterator:First(exists)}
 do
 {
     if ${anIterator.Value.GroupID} == GROUPID_SECURE_CONTAINER
     {
         return TRUE
     }
 }
 while ${anIterator:Next(exists)}
  • Converted To Query System:
 variable index:item Items
 variable iterator   ItemIterator

 MyShip:GetCargo[Items]
 Items:GetIterator[ItemIterator]

 variable string Query = "GroupID != GROUPID_SECURE_CONTAINER"
 Items:RemoveByQuery[${LSQueryCache[${Query}]}]
 
 if ${ItemIterator:First(exists)}
 {
     return TRUE
 }