FROM句

FROM句を文の中で使用すると、その文が含まれる検索/ナビゲーション問合せの結果とは別のレコード・ソースを指定できます。

デフォルトでは、EQL文のレコードのソースは、その文が含まれる検索/ナビゲーション問合せの結果です。ただし、FROM構文を文の中で使用して、別のデータ・ソース(状態名、定義済の文などから)を指定することもできます。

FROMの構文は次のとおりです。

FROM <recSource> [alias]
ここで、<recSource>には次のものを指定できます。

問合せでFROM句を省略すると、EQL文ではコーパス・ベースのNavStateRecordsソースが使用されます。

コーパス・ベースのソース

次の2つは、コーパス・ベースのソースを指定するための名前です。
  • AllBaseRecords: セキュリティ・フィルタを通過したレコードすべて。
  • NavStateRecords: 先行するすべてのフィルタを通過したレコードすべて。
次に例を示します。
FROM AllBaseRecords

FROMがない場合は、暗黙的にNavStateRecordsを指定したことになります。つまり、問合せをNavStateRecordsに対して実行する場合は、FROM句を文の中で使用する必要はありません。

定義済文

別の文の結果をレコード・ソースとして使用できます。次に示す例では、文の1つで販売トランザクションの総数を、四半期(quarter)および販売員(sales representative)ごとに計算しています。次に販売員ごとの平均トランザクション数を計算するために、後続の文でこの結果を四半期ごとにグルーピングします。
DEFINE RepQuarters AS
SELECT COUNT(TransId) AS NumTrans
GROUP BY SalesRep, Quarter;

RETURN Quarters AS
SELECT AVG(NumTrans) AS AvgTransPerRep
FROM RepQuarters
GROUP BY Quarter
RepQuarters文によって、レコードのリストが生成されます。各レコードに格納されている属性は、{ SalesRep, Quarter, NumTrans }です。次に例を示します。
{ J. Smith, 11Q1, 10 }
{ J. Smith, 11Q2, 3 }
{ F. Jackson, 10Q4, 10 }
...
Quartersの文では、RepQuartersの文の結果を使用して属性{ Quarter, AvgTransPerRep }のリストを生成します。次に例を示します。
{ 10Q4, 10 }
{ 11Q1, 4.5 }
{ 11Q2, 6 }
...

状態名

状態名は、次の構文を使用してEQLのFROM句内で指定できます。
FROM <statename>[.FILTERED | .UNFILTERED | .ALL]
ここで、
  • statename.FILTEREDは、すべてのフィルタが適用された状態を表します(つまり、対話サービスの問合せの状態にあるすべてのフィルタ)。
  • statename (つまり、フィルタリング修飾子のない単なる状態名を使用する場合)は、statename.FILTEREDのシノニムです。
  • statename.UNFILTEREDは、セキュリティ・フィルタのみが適用された状態を表します(つまり、対話サービスの問合せの状態にある場合のDataSourceFilter)。
  • statename.ALLは、statename.UNFILTEREDのシノニムです。
1つの例として、EQLQuery型を使用している、次のような単純な対話サービスの問合せについて考えてみます。
<Request>
   <Language>en</Language>
   <State>
      <Name>Wine</Name>
      <DataSourceFilter Id="DataFltr">
        <filterString>WineType <> 'Red'</filterString>
      </DataSourceFilter>
      <SelectionFilter Id="SecFltr">
        <filterString>Price > 25</filterString>
      </SelectionFilter>
   </State>
   <EQLConfig Id="Results">
      <StateName>Wine</StateName>
      <EQLQueryString>
        RETURN results AS
        SELECT Price AS prices
        FROM Wine.FILTERED
        GROUP BY prices
      </EQLQueryString>
   </EQLConfig>
</Request>
この問合せは次のように動作します。
  1. 最初に、DataSourceFilterフィルタ(これはセキュリティ・フィルタです)により、WineType=Redが割り当てられていないレコードが削除されます。現在の小規模なデータ・セットの場合、フィルタを通過するのは11レコードのみです。
  2. 次に、SelectionFilterフィルタにより、Price割当てが$25以上のレコードが選択されます。ここで(前の11レコードから)7レコードが除外され、4レコードが残ります。
  3. EQL文のFROM句により、Wineという名前の状態を参照します。FILTEREDが状態名とともに使用されているため、状態の両方のフィルタが適用され、4レコードが返されます。(状態名が使用されている場合にのみ、同じ動作が適用されます。)
ただし、同じ問合せでこのFROM句を次のように使用した場合、
FROM Wine.UNFILTERED
DataSourceFilterフィルタのみが適用されます(つまり、SelectionFilterフィルタは無視されます)。この場合、EQL文では、セキュリティ・フィルタを通過した11レコードが返されます。