Solr DIH dynamic filed name & convert value - lucene

I have a working solr with DIH now i need to add multi rows which is ONE to MANY relationship with the solr indexed doc
TABLE:
ID:int PK
post_id:int FK
name:string
value:text
type:(int|string)
i need to insert all rows based on FK (post_id) into solr doc with dynamic name and convert value based on type
SELECT name,value,type FROM TABLE WHERE post_id='${post_entity.id}';
loop
insert into solr fieldname: meta_{$name} value: if type int cast to int else just value
end loop
Anyone knows how to do this?

Not sure if you have the answer yet, but my understanding is you need to create multiple entity tabs in the data handler document, one for each new multi-value field you want to add, and indicate the ID from the root document. Look at this example:
In the DataHandler.xml file:
<dataConfig>
<dataSource name="jdbc" driver="org.postgresql.Driver" url="jdbc:postgresql://localhost/bedrock" user="postgres" password="test" batchSize="1000" readOnly="true" autoCommit="false" transactionIsolation="TRANSACTION_READ_COMMITTED" holdability="CLOSE_CURSORS_AT_COMMIT" />
<document name="doc-a">
<entity name="employee-root" datasource="jdbc" pk="id" query ="
select
a.id as id,
a.name as name,
a.dept as dept,
a.jobtitle as jobtitle,
a.last_change as last_change
from employee a
"
transformer="RegexTransformer,DateFormatTransformer,TemplateTransformer">
<field column = "id" />
<field column = "name" />
<field column = "dept" />
<field column = "jobtitle" />
<entity name="employee-hobby" datasource="jdbc" query ="
select
employee_hobby as features
from employee_hobby
where employee_id = ${employee-root.id}
"
transformer="RegexTransformer,DateFormatTransformer,TemplateTransformer">
<field column = "features" />
</entity>
</entity>
</document>

i think i can use DIHCustomTransformer to invoke a function but i am not sure yet
http://wiki.apache.org/solr/DIHCustomTransformer
any enlightenment will be appreciated

Related

I want to index multivalue dateRange in solr

I want to index daterange as multifiled in solr
eg----- temp_close_timing=[2022-02-08T16:40:49 TO 2022-02-28T16:40:49,2022-02-08T16:40:49 TO 2022-10-28T16:40:49,2022-02-08T16:40:49 TO 2022-02-28T16:40:49,2022-02-17T00:00:00 TO 2022-02-28T23:00:00]
can someone help me in this.
I am doing as shown below but getting error in this
My scehma file show below:
<field name="temp_close_timing" type="rdate" stored="true" omitNorms="true"
multiValued="true"/>
my dataconfig FIle:
<!-- temp closing timing of restaurant -->
<entity name="tempRestaurant" dataSource="dineout" onError="skip"
query=" SELECT
GROUP_CONCAT(CONCAT(DATE_FORMAT(rtc.start_dt, '%Y-%m-%dT%T'),
'.0Z',
' TO ',
DATE_FORMAT(rtc.end_dt, '%Y-%m-%dT%T'),
'.0Z')) AS temp_close_timing,
rtc.rest_id AS restaurant_id
FROM
restaurant_temp_close AS rtc
WHERE
rtc.status = 1"
transformer="RegexTransformer"
cacheKey="restaurant_id" cacheLookup="rest.r_id" cacheImpl="SortedMapBackedCache">
<field name="temp_close_timing" column="temp_close_timing"/>
</entity>
I got the solution of this question
<!-- temp closing timing of restaurant -->
<entity name="tempRestaurant" dataSource="dineout" onError="skip"
query=" SELECT
GROUP_CONCAT(CONCAT('[',
DATE_FORMAT(tr.start_dt, '%Y-%m-%dT%T'),
' TO ',
DATE_FORMAT(tr.end_dt, '%Y-%m-%dT%T'),
']')
SEPARATOR '#####') AS temp_close_timing,
tr.rest_id AS restaurant_id
FROM
restaurant_temp_close AS tr
WHERE
tr.status = 1
GROUP BY tr.rest_id"
transformer="RegexTransformer"
cacheKey="restaurant_id" cacheLookup="rest.r_id" cacheImpl="SortedMapBackedCache">
<field name="temp_close_timing" column="temp_close_timing" splitBy="#####"/>
</entity>
can anybody tell how to apply intersect of contain in this field with exampl ..I want to check that todays date/time lies in this range or not

In Oracle, how can I extract value of XML item in XML column?

I have XML column in Oracle table where i have this string:
<field name="Text1" type="String"><value/>
I need to extract the value of this field if exists, in the above example it doesn't exists.
In the below example the value exists:
<field name="Text1" type="String"><value>12345</value>
What will be the best way to do this?
Thank you.
As you said: extract value.
SQL> with test (col) as
2 (select '<field name="Text1" type="String"><value>12345</value></field>'
3 from dual
4 )
5 SELECT extractvalue(xmltype(col), '/field/value') result
6 from test;
RESULT
----------------------------------------------------------------------------------------------------
12345
SQL>
XMLTABLE would be a good choice to use in such a way that
SELECT x.*
FROM xml_tab t,
XMLTABLE('//Root'
PASSING xml_data
COLUMNS
field1 INT PATH 'field[#name="Text1"]/value',
field2 INT PATH 'field[#name="Text2"]/value'
) x
returning
FIELD1
FIELD2
12345
where xml_data is
<Root>
<field name="Text1" type="String">
<value>12345</value>
</field>
<field name="Text2" type="String">
<value/>
</field>
</Root>
Demo
PS. The EXTRACTVALUE function is deprecated. It is still supported for backward compatibility. However, Oracle recommends that you use the XMLTABLE function, or the XMLCAST and XMLQUERY functions instead

inner join not working in dynamics crm query

I am working in a project and I find that they do a query like this:
LinkEntity link = LinkEntity("table1", "account", "table1acountid", "accountid", JoinOperator.Inner)
link.LinkCriteria.AddCondition("accountid", ConditionOperator.Equal, Id);
the relation between table1 and account is 1: N ( we have a lookup to account in table1 form)
The result of the query is always null but when I change Inner with Leftouter, it works.
Is that query correct with inner join? In which case is it supposed to return records of table1?
The condition you add is not necessary, if used to only return accounts associated with table1, that comes implicitly from the LinkEntity statement.
I guess you are missing a new directive on the first line too.
Suggest you use FetchXML Builder for XrmToolBox to componse the query, which can then be converted to QueryExpression code.
I assume this is the query you want (adding a few attributes to return etc)
<fetch >
<entity name='' >
<filter>
<condition attribute='accountid' operator='eq' value='Id' />
</filter>
<link-entity name='table1' from='table1accountid' to='accountid' link-type='inner' />
</entity>
</fetch>

SQL Server generating XML with generic field elements

I'm basically trying to reverse what this question is asking...
SQL Server query xml attribute for an element value
I need to produce a result set of "row" elements that contain a group of "field" elements with an attribute that defines the key.
<resultset statement="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<field name="id">1</field>
<field name="version”>0</field>
<field name="property">My Movie</field>
<field name="release_date">2012-01-01</field>
<field name="territory_code”>FR</field>
<field name="territory_description">FRANCE</field>
<field name="currency_code”>EUR</field>
</row>
<row>
<field name="id">2</field>
<field name="version”>0</field>
<field name="property">My Sequel</field>
<field name="release_date">2014-03-01</field>
<field name="territory_code”>UK</field>
<field name="territory_description">United Kingdom</field>
<field name="currency_code”>GBP</field>
</row>
</resultset>
I've got a query that returns this...
<resultset statement="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<id>1</id>
<version>0</version>
<property>My Movie</property>
<release_date>2012-01-01</release_date>
<territory_code>FR</territory_code>
<territory_description>FRANCE</territory_description>
<currency_code>EUR</currency_code>
</row>
<row>
<id>2</id>
<version>0</version>
<property>My Sequel</property>
<release_date>2014-03-01</release_date>
<territory_code>UK</territory_code>
<territory_description>UNITED KINGDOM</territory_description>
<currency_code>GBP</currency_code>
</row>
</resultset>
Using FOR XML PATH ('row'), ROOT ('resultset') in my SQL statement.
What am I missing? Thanks.
It's a bit involved in SQL Server - the normal behavior is what you're seeing - the column names will be used as XML element names.
If you really want all XML elements to be named the same, you'll have to use code something like this:
SELECT
'id' AS 'field/#name',
id AS 'field',
'',
'version' AS 'field/#name',
version AS 'field',
'',
'property' AS 'field/#name',
property AS 'field',
'',
... and so on ....
FROM Person.Person
FOR XML PATH('row'),ROOT('resultset')
This is necessary to make sure the column name is used as the name attribute on the <field> element, and the empty string are necessary so that the SQL XML parser doesn't get confused about which name attribute belongs to what element......
You can do this without having to specify the columns as constants and that will allow you to also use select *. It is a bit more complicated than the answer provided by marc_s and it will be quite a lot slower to execute.
select (
select T.X.value('local-name(.)', 'nvarchar(128)') as '#name',
T.X.value('text()[1]', 'nvarchar(max)') as '*'
from C.X.nodes('/X/*') as T(X)
for xml path('field'), type
)
from (
select (
select T.*
for xml path('X'), type
) as X
from dbo.YourTable as T
) as C
for xml path('row'), root('resultset')
SQL Fiddle
The query creates a derived table where each row has a XML that looks something like this:
<X>
<ID>1</ID>
<Col1>1</Col1>
<Col2>2014-08-21</Col2>
</X>
That XML is then shredded using nodes() and local-name(.) to create the shape you want.
Your SELECT statement needs to look something like this
SELECT
'id' AS [field/#name],
id AS field,
'version' AS [field/#name],
version AS field,
'property' AS [field/#name],
property AS field,
'release_date' AS [field/#name],
release_date AS field,
'territory_code' AS [field/#name],
territory_code AS field,
'territory_description' AS [field/#name],
territory_description AS field,
'currency_code' AS [field/#name],
currency_code AS field

SQL Server 2008 XML Query

I need some more help with another XML query. Below is an example of a record of my XML column:
<Fields>
<MappedFields>
<Field name="FormNumber" value="21" />
<Field name="ProcedureCode" value="T2023" />
<Field name="CurrentDate" value="4/23/2012" />
</MappedFields>
</Fields>
The field elements may appear in any order, so it can appear like this as well:
<Fields>
<MappedFields>
<Field name="ProcedureCode" value="G5532" />
<Field name="FormNumber" value="12" />
<Field name="CurrentDate" value="3/29/2011" />
</MappedFields>
</Fields>
What I am looking for, is a query that will get the value of the Field with the name "FormNumber" for all the records in the table. The query I have below works if the Field with the name of "FormNumber" is the first Field element in the XML. What I need is a query that will find the Field element even if it is not the first element. Can someone help me out with this?
SELECT
X.Node.value(N'(Field/#value)[1]', 'nvarchar(max)') AS FormNumber
FROM
dbo.MHTCM_LetterSent A
CROSS APPLY A.LetterXML.nodes(N'/Fields/MappedFields') AS X(Node)
WHERE
X.Node.value(N'(Field/#name)[1]', 'nvarchar(max)') = 'FormNumber'
You can have a test in the xml path like [#name="FormNumber"].
SELECT
X.Node.value(N'(Field[#name="FormNumber"]/#value)[1]', 'nvarchar(max)') AS FormNumber
FROM
dbo.MHTCM_LetterSent A
CROSS APPLY A.LetterXML.nodes(N'//Fields/MappedFields') AS X(Node)
Note the WHERE isn't needed now.
It might make more sense to move the test to the CROSS APPLY:
SELECT
X.Node.value(N'(./#value)[1]', 'nvarchar(max)') AS FormNumber
FROM
dbo.MHTCM_LetterSent A
CROSS APPLY A.LetterXML.nodes(N'//Fields/MappedFields/Field[#name="FormNumber"]') AS X(Node)
Edit- I made the paths absolute (//) and both examples are working for me.