FROM句を文の中で使用すると、その文が含まれる検索/ナビゲーション問合せの結果とは別のレコード・ソースを指定できます。
デフォルトでは、EQL文のレコードのソースは、その文が含まれる検索/ナビゲーション問合せの結果です。ただし、FROM構文を文の中で使用して、別のデータ・ソース(状態名、定義済の文などから)を指定することもできます。
FROMの構文は次のとおりです。
FROM <recSource> [alias]
ここで、
<recSource>には次のものを指定できます。
- コーパス・ベースのソース。
- 定義済文の名前(文は、DEFINEまたはRETURNのいずれかです)。
- 状態名。FROMはコレクション名を直接にはサポートしていませんが、状態にコレクションが含まれている場合は基本的にサポートしています。
問合せで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>
この問合せは次のように動作します。
- 最初に、DataSourceFilterフィルタ(これはセキュリティ・フィルタです)により、WineType=Redが割り当てられていないレコードが削除されます。現在の小規模なデータ・セットの場合、フィルタを通過するのは11レコードのみです。
- 次に、SelectionFilterフィルタにより、Price割当てが$25以上のレコードが選択されます。ここで(前の11レコードから)7レコードが除外され、4レコードが残ります。
- EQL文のFROM句により、Wineという名前の状態を参照します。FILTEREDが状態名とともに使用されているため、状態の両方のフィルタが適用され、4レコードが返されます。(状態名が使用されている場合にのみ、同じ動作が適用されます。)
ただし、同じ問合せでこの
FROM句を次のように使用した場合、
FROM Wine.UNFILTERED
DataSourceFilterフィルタのみが適用されます(つまり、
SelectionFilterフィルタは無視されます)。この場合、EQL文では、セキュリティ・フィルタを通過した11レコードが返されます。