supernova 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/Gemfile +1 -0
  2. data/Gemfile.lock +2 -0
  3. data/VERSION +1 -1
  4. data/lib/supernova/criteria.rb +6 -2
  5. data/lib/supernova/solr.rb +1 -0
  6. data/lib/supernova/solr_criteria.rb +10 -1
  7. data/lib/supernova/solr_indexer.rb +71 -0
  8. data/solr/conf/admin-extra.html +31 -0
  9. data/solr/conf/elevate.xml +36 -0
  10. data/solr/conf/mapping-FoldToASCII.txt +3813 -0
  11. data/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  12. data/solr/conf/protwords.txt +21 -0
  13. data/solr/conf/schema.xml +475 -0
  14. data/solr/conf/scripts.conf +24 -0
  15. data/solr/conf/solrconfig.xml +1508 -0
  16. data/solr/conf/spellings.txt +2 -0
  17. data/solr/conf/stopwords.txt +58 -0
  18. data/solr/conf/synonyms.txt +29 -0
  19. data/solr/conf/velocity/VM_global_library.vm +184 -0
  20. data/solr/conf/velocity/browse.vm +45 -0
  21. data/solr/conf/velocity/cluster.vm +26 -0
  22. data/solr/conf/velocity/clusterResults.vm +29 -0
  23. data/solr/conf/velocity/doc.vm +29 -0
  24. data/solr/conf/velocity/facet_dates.vm +0 -0
  25. data/solr/conf/velocity/facet_fields.vm +12 -0
  26. data/solr/conf/velocity/facet_queries.vm +3 -0
  27. data/solr/conf/velocity/facet_ranges.vm +30 -0
  28. data/solr/conf/velocity/facets.vm +7 -0
  29. data/solr/conf/velocity/footer.vm +17 -0
  30. data/solr/conf/velocity/head.vm +45 -0
  31. data/solr/conf/velocity/header.vm +3 -0
  32. data/solr/conf/velocity/hit.vm +5 -0
  33. data/solr/conf/velocity/jquery.autocomplete.css +48 -0
  34. data/solr/conf/velocity/jquery.autocomplete.js +762 -0
  35. data/solr/conf/velocity/layout.vm +20 -0
  36. data/solr/conf/velocity/main.css +184 -0
  37. data/solr/conf/velocity/query.vm +56 -0
  38. data/solr/conf/velocity/querySpatial.vm +40 -0
  39. data/solr/conf/velocity/suggest.vm +3 -0
  40. data/solr/conf/velocity/tabs.vm +22 -0
  41. data/solr/conf/xslt/example.xsl +132 -0
  42. data/solr/conf/xslt/example_atom.xsl +67 -0
  43. data/solr/conf/xslt/example_rss.xsl +66 -0
  44. data/solr/conf/xslt/luke.xsl +337 -0
  45. data/spec/integration/solr_spec.rb +6 -0
  46. data/spec/spec_helper.rb +1 -1
  47. data/spec/supernova/solr_criteria_spec.rb +16 -0
  48. data/spec/supernova/solr_indexer_spec.rb +167 -0
  49. data/supernova.gemspec +45 -3
  50. metadata +91 -36
@@ -0,0 +1,2 @@
1
+ pizza
2
+ history
@@ -0,0 +1,58 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright ownership.
4
+ # The ASF licenses this file to You under the Apache License, Version 2.0
5
+ # (the "License"); you may not use this file except in compliance with
6
+ # the License. You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ #-----------------------------------------------------------------------
17
+ # a couple of test stopwords to test that the words are really being
18
+ # configured from this file:
19
+ stopworda
20
+ stopwordb
21
+
22
+ #Standard english stop words taken from Lucene's StopAnalyzer
23
+ a
24
+ an
25
+ and
26
+ are
27
+ as
28
+ at
29
+ be
30
+ but
31
+ by
32
+ for
33
+ if
34
+ in
35
+ into
36
+ is
37
+ it
38
+ no
39
+ not
40
+ of
41
+ on
42
+ or
43
+ s
44
+ such
45
+ t
46
+ that
47
+ the
48
+ their
49
+ then
50
+ there
51
+ these
52
+ they
53
+ this
54
+ to
55
+ was
56
+ will
57
+ with
58
+
@@ -0,0 +1,29 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ #-----------------------------------------------------------------------
14
+ #some test synonym mappings unlikely to appear in real input text
15
+ aaafoo => aaabar
16
+ bbbfoo => bbbfoo bbbbar
17
+ cccfoo => cccbar cccbaz
18
+ fooaaa,baraaa,bazaaa
19
+
20
+ # Some synonym groups specific to this example
21
+ GB,gib,gigabyte,gigabytes
22
+ MB,mib,megabyte,megabytes
23
+ Television, Televisions, TV, TVs
24
+ #notice we use "gib" instead of "GiB" so any WordDelimiterFilter coming
25
+ #after us won't split it into two words.
26
+
27
+ # Synonym mappings can be used for spelling correction too
28
+ pixima => pixma
29
+
@@ -0,0 +1,184 @@
1
+
2
+ #macro(param $key)$request.params.get($key)#end
3
+
4
+ #macro(url_for_solr)/solr#if($request.core.name != "")/$request.core.name#end#end
5
+ #macro(url_for_home)#url_for_solr/browse#end
6
+
7
+ #macro(q)&q=$!{esc.url($params.get('q'))}#end
8
+
9
+ #macro(fqs $p)#foreach($fq in $p)#if($velocityCount>1)&#{end}fq=$esc.url($fq)#end#end
10
+
11
+ #macro(debug)#if($request.params.get('debugQuery'))&debugQuery=true#end#end
12
+
13
+ #macro(boostPrice)#if($request.params.get('bf') == 'price')&bf=price#end#end
14
+
15
+ #macro(annotate)#if($request.params.get('annotateBrowse'))&annotateBrowse=true#end#end
16
+
17
+ #macro(annTitle $msg)#if($annotate == true)title="$msg"#end#end
18
+
19
+ #macro(spatial)#if($request.params.get('sfield'))&sfield=store#end#if($request.params.get('pt'))&pt=$request.params.get('pt')#end#if($request.params.get('d'))&d=$request.params.get('d')#end#end
20
+
21
+ #macro(qOpts)#set($queryOpts = $request.params.get("queryOpts"))#if($queryOpts && $queryOpts != "")&queryOpts=$queryOpts#end#end
22
+
23
+ #macro(lensNoQ)?#if($request.params.getParams('fq') and $list.size($request.params.getParams('fq')) > 0)&#fqs($request.params.getParams('fq'))#end#debug#boostPrice#annotate#spatial#qOpts#end
24
+ #macro(lens)#lensNoQ#q#end
25
+
26
+
27
+ #macro(url_for_lens)#{url_for_home}#lens#end
28
+
29
+ #macro(url_for_start $start)#url_for_home#lens&start=$start#end
30
+
31
+ #macro(url_for_filters $p)#url_for_home?#q#boostPrice#spatial#qOpts#if($list.size($p) > 0)&#fqs($p)#end#debug#end
32
+
33
+ #macro(url_for_nested_facet_query $field)#url_for_home#lens&fq=$esc.url($field)#end
34
+
35
+ ## TODO: convert to use {!raw f=$field}$value (with escaping of course)
36
+ #macro(url_for_facet_filter $field $value)#url_for_home#lens&fq=$esc.url($field):%22$esc.url($value)%22#end
37
+
38
+ #macro(url_for_facet_date_filter $field $value)#url_for_home#lens&fq=$esc.url($field):$esc.url($value)#end
39
+
40
+ #macro(url_for_facet_range_filter $field $value)#url_for_home#lens&fq=$esc.url($field):$esc.url($value)#end
41
+
42
+
43
+ #macro(link_to_previous_page $text)
44
+ #if($page.current_page_number > 1)
45
+ #set($prev_start = $page.start - $page.results_per_page)
46
+ <a class="prev-page" href="#url_for_start($prev_start)">$text</a>
47
+ #end
48
+ #end
49
+
50
+ #macro(link_to_next_page $text)
51
+ #if($page.current_page_number < $page.page_count)
52
+ #set($next_start = $page.start + $page.results_per_page)
53
+ <a class="next-page" href="#url_for_start($next_start)">$text</a>
54
+ #end
55
+ #end
56
+
57
+ #macro(link_to_page $page_number $text)
58
+ #if($page_number == $page.current_page_number)
59
+ $text
60
+ #else
61
+ #if($page_number <= $page.page_count)
62
+ #set($page_start = $page_number * $page.results_per_page - $page.results_per_page)
63
+ <a class="page" href="#url_for_start($page_start)">$text</a>
64
+ #end
65
+ #end
66
+ #end
67
+
68
+ #macro(display_facet_query $field, $display, $fieldName)
69
+ #if($field.size() > 0)
70
+ <span class="facet-field">$display</span>
71
+ <ul>
72
+ #foreach ($facet in $field)
73
+ #if ($facet.value > 0)
74
+ #set($facetURL = "#url_for_nested_facet_query($facet.key)")
75
+ #if ($facetURL != '')
76
+ <li><a href="$facetURL">$facet.key</a> ($facet.value)</li>
77
+ #end
78
+ #end
79
+ #end
80
+ </ul>
81
+ #end
82
+ #end
83
+
84
+ #macro(display_facet_range_date $field, $display, $fieldName)
85
+ <span class="facet-field">$display</span>
86
+ ##Note: even if mincount is 1, you can still get a '0' before & after
87
+ ##Note: We assume facet.range.include='lower'
88
+ <ul>
89
+ #if ($field.before && $field.before > 0)
90
+ #set($value = "[* TO " + $date.format("yyyy-MM-dd'T'HH:mm:ss'Z'", $field.start) + "-1MILLIS]")
91
+ #set($facetURL = "#url_for_facet_date_filter($fieldName, $value)")
92
+ <li><a href="$facetURL">Before</a> ($field.before)</li>
93
+ #end
94
+ #foreach ($facet in $field.counts)
95
+ #set($theDate = $date.toDate("yyyy-MM-dd'T'HH:mm:ss'Z'", $facet.key))
96
+ #set($value = '["' + $facet.key + '" TO "' + $facet.key + $field.gap + '-1MILLIS"]')
97
+
98
+ #set($facetURL = "#url_for_facet_date_filter($fieldName, $value)")
99
+ #if ($facetURL != '')
100
+ <li><a href="$facetURL">$date.format('MMM yyyy', $theDate)</a> ($facet.value)</li>
101
+ #end
102
+ #end
103
+ #if ($field.after && $field.after > 0)
104
+ #set($value = "[" + $date.format("yyyy-MM-dd'T'HH:mm:ss'Z'", $field.after) + " TO *]")
105
+ #set($facetURL = "#url_for_facet_date_filter($fieldName, $value)")
106
+ <li><a href="$facetURL">After</a> ($field.after)</li>
107
+ #end
108
+ </ul>
109
+ #end
110
+
111
+
112
+
113
+ #macro(display_facet_range $field, $display, $fieldName, $start, $end, $gap, $before, $after)
114
+ <span class="facet-field">$display</span>
115
+ <ul>
116
+ #if($before && $before != "")
117
+ #set($value = "[* TO " + $start + "]")
118
+ #set($facetURL = "#url_for_facet_range_filter($fieldName, $value)")
119
+ <li><a href="$facetURL">Less than $start</a> ($before)</li>
120
+ #end
121
+ #foreach ($facet in $field)
122
+ #set($rangeEnd = $math.add($facet.key, $gap))
123
+ #set($value = "[" + $facet.key + " TO " + $rangeEnd + "]")
124
+ #set($facetURL = "#url_for_facet_range_filter($fieldName, $value)")
125
+ #if ($facetURL != '')
126
+ <li><a href="$facetURL">$facet.key</a> ($facet.value)</li>
127
+ #end
128
+ #end
129
+ #if($end && $end != "")
130
+ #set($value = "[" + $end + " TO *]")
131
+ #set($facetURL = "#url_for_facet_range_filter($fieldName, $value)")
132
+ <li><a href="$facetURL">More than $math.toNumber($end)</a> ($after)</li>
133
+ #end
134
+ </ul>
135
+ #end
136
+
137
+ ## <lst name="facet_pivot">
138
+ ## <arr name="cat,inStock">
139
+ ## <lst>
140
+ ## <str name="field">cat</str>
141
+ ## <str name="value">electronics</str>
142
+ ## <int name="count">17</int>
143
+ ## <arr name="pivot">
144
+ ## <lst>
145
+ ## <str name="field">inStock</str>
146
+ ## <str name="value">true</str>
147
+ ## <int name="count">13</int>
148
+ ## </lst>
149
+ ## <lst>
150
+ ## <str name="field">inStock</str>
151
+ ## <str name="value">false</str>
152
+ ## <int name="count">4</int>
153
+ ## </lst>
154
+ ## </arr>
155
+ ## </lst>
156
+
157
+ ## $pivots is a list of facet_pivot
158
+ #macro(display_facet_pivot $pivots, $display)
159
+ #if($pivots.size() > 0)
160
+ <span class="facet-field">$display</span>
161
+ <ul>
162
+ #foreach ($pivot in $pivots)
163
+ #foreach ($entry in $pivot.value)
164
+ <a href="#url_for_facet_filter($entry.field, $entry.value)">$entry.field::$entry.value</a> ($entry.count)
165
+ <ul>
166
+ #foreach($nest in $entry.pivot)
167
+ <a href="#url_for_facet_filter($entry.field, $entry.value)&fq=$esc.url($nest.field):%22$esc.url($nest.value)%22">$nest.field::$nest.value</a> ($nest.count)
168
+ #end
169
+ </ul>
170
+ #end
171
+ #end
172
+ </ul>
173
+ #end
174
+ #end
175
+
176
+ #macro(field $f)
177
+ #if($response.response.highlighting.get($docId).get($f).get(0))
178
+ $!response.response.highlighting.get($docId).get($f).get(0)
179
+ #else
180
+ #foreach($v in $doc.getFieldValues($f))
181
+ $v
182
+ #end
183
+ #end
184
+ #end
@@ -0,0 +1,45 @@
1
+ #set($searcher=$request.searcher)
2
+ #set($params=$request.params)
3
+ #set($clusters = $response.response.clusters)
4
+ #set($mltResults = $response.response.get("moreLikeThis"))
5
+ #set($annotate = $params.get("annotateBrowse"))
6
+ #parse('query.vm')
7
+ #if($response.response.spellcheck.suggestions and $response.response.spellcheck.suggestions.size() > 0)
8
+ Did you mean <a href="#url_for_home?q=$esc.url($response.response.spellcheck.suggestions.collation)#if($list.size($request.params.getParams('fq')) > 0)&#fqs($request.params.getParams('fq'))#end#debug">$response.response.spellcheck.suggestions.collation</a>?
9
+ #end
10
+
11
+ <div class="navigators">
12
+ #parse("facets.vm")
13
+ </div>
14
+
15
+ <div class="pagination">
16
+ #if($response.response.get('grouped'))
17
+ <span><span class="results-found">$response.response.get('grouped').size() group(s)</span> found in ${response.responseHeader.QTime} ms</span>
18
+ #else<span><span class="results-found">$page.results_found</span> results found in ${response.responseHeader.QTime} ms</span>
19
+ Page <span class="page-num">$page.current_page_number</span> of <span
20
+ class="page-count">$page.page_count</span>#end
21
+ </div>
22
+
23
+ <div class="results">
24
+ #if($response.response.get('grouped'))
25
+ #foreach($grouping in $response.response.get('grouped'))
26
+ #parse("hitGrouped.vm")
27
+ #end
28
+ #else
29
+ #foreach($doc in $response.results)
30
+ #parse("hit.vm")
31
+ #end
32
+ #end
33
+ </div>
34
+
35
+ <div class="pagination">
36
+ #if($response.response.get('grouped'))
37
+ #else
38
+ #link_to_previous_page("previous")
39
+ <span class="results-found">$page.results_found</span> results found.
40
+ Page <span class="page-num">$page.current_page_number</span> of <span
41
+ class="page-count">$page.page_count</span>
42
+ #link_to_next_page("next")
43
+ #end
44
+ <br/>
45
+ </div>
@@ -0,0 +1,26 @@
1
+ <!--
2
+ Licensed to the Apache Software Foundation (ASF) under one or more
3
+ contributor license agreements. See the NOTICE file distributed with
4
+ this work for additional information regarding copyright ownership.
5
+ The ASF licenses this file to You under the Apache License, Version 2.0
6
+ (the "License"); you may not use this file except in compliance with
7
+ the License. You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
16
+ -->
17
+
18
+ <h2 #annTitle("Clusters generated by Carrot2 using the /clustering RequestHandler")>Clusters</h2>
19
+ <div id="clusters">
20
+ Run Solr with java -Dsolr.clustering.enabled=true -jar start.jar to see results
21
+ </div>
22
+ <script type="text/javascript">
23
+
24
+ $('#clusters').load("#url_for_solr/clustering#lens",
25
+ {'wt':'velocity', 'v.template':"clusterResults"});
26
+ </script>
@@ -0,0 +1,29 @@
1
+ #foreach ($clusters in $response.response.clusters)
2
+ #set($labels = $clusters.get('labels'))
3
+ #set($docs = $clusters.get('docs'))
4
+ <!--
5
+ Licensed to the Apache Software Foundation (ASF) under one or more
6
+ contributor license agreements. See the NOTICE file distributed with
7
+ this work for additional information regarding copyright ownership.
8
+ The ASF licenses this file to You under the Apache License, Version 2.0
9
+ (the "License"); you may not use this file except in compliance with
10
+ the License. You may obtain a copy of the License at
11
+
12
+ http://www.apache.org/licenses/LICENSE-2.0
13
+
14
+ Unless required by applicable law or agreed to in writing, software
15
+ distributed under the License is distributed on an "AS IS" BASIS,
16
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ See the License for the specific language governing permissions and
18
+ limitations under the License.
19
+ -->
20
+
21
+ <h3>#foreach ($label in $labels)$label#if( $foreach.hasNext ),#end#end</h3>
22
+ <ol>
23
+ #foreach ($cluDoc in $docs)
24
+ <li><a href="#url_for_home?q=id:$cluDoc">$cluDoc</a></li>
25
+ #end
26
+ </ol>
27
+
28
+
29
+ #end
@@ -0,0 +1,29 @@
1
+ <div class="result-title"><b>#field('name')</b><span class="mlt">#if($params.getBool('mlt', false) == false)<a href="#lensNoQ&q=id:$docId&mlt=true">More Like This</a>#end</span></div>
2
+ ##do we have a physical store for this product
3
+ #set($store = $doc.getFieldValue('store'))
4
+ #if($store)<div class="map"><img src="http://maps.google.com/maps/api/staticmap?&zoom=12&size=150x80&maptype=roadmap&markers=$doc.getFieldValue('store')&sensor=false" /><div><small><a target="_map" href="http://maps.google.com/?q=$store&amp;source=embed">Larger Map</a></small></div></div>#end
5
+ <div>Price: $!number.currency($doc.getFieldValue('price'))</div>
6
+ <div>Features: #field('features')</div>
7
+ <div>In Stock: #field('inStock')</div>
8
+ <div class="mlt">
9
+ #set($mlt = $mltResults.get($docId))
10
+ #set($mltOn = $params.getBool('mlt'))
11
+ #if($mltOn == true)<div class="field-name">Similar Items</div>#end
12
+ #if ($mltOn && $mlt && $mlt.size() > 0)
13
+ <ul>
14
+ #foreach($mltHit in $mlt)
15
+ #set($mltId = $mltHit.getFieldValue('id'))
16
+ <li><div><a href="#url_for_home?q=id:$mltId">$mltId</a></div><div><span class="field-name">Name:</span> $mltHit.getFieldValue('name')</div>
17
+ <div><span class="field-name">Price:</span> $!number.currency($mltHit.getFieldValue('price')) <span class="field-name">In Stock:</span> $mltHit.getFieldValue('inStock')</div>
18
+
19
+ </li>
20
+ #end
21
+ </ul>
22
+ #elseif($mltOn && $mlt.size() == 0)
23
+ <div>No Similar Items Found</div>
24
+ #end
25
+ </div>
26
+ #if($params.getBool("debugQuery",false))
27
+ <a href="#" onclick='jQuery(this).siblings("pre").toggle(); return false;'>toggle explain</a>
28
+ <pre style="display:none">$response.getExplainMap().get($doc.getFirstValue('id'))</pre>
29
+ #end
File without changes
@@ -0,0 +1,12 @@
1
+ #if($response.facetFields)
2
+ <h2 #annTitle("Facets generated by adding &facet.field= to the request")>Field Facets</h2>
3
+ #foreach($field in $response.facetFields)
4
+ <span class="facet-field">$field.name</span>
5
+
6
+ <ul>
7
+ #foreach($facet in $field.values)
8
+ <li><a href="#url_for_facet_filter($field.name, $facet.name)">$facet.name</a> ($facet.count)</li>
9
+ #end
10
+ </ul>
11
+ #end
12
+ #end
@@ -0,0 +1,3 @@
1
+ #set($field = $response.response.facet_counts.facet_queries)
2
+ <h2 #annTitle("Facets generated by adding &facet.query= to the request")>Query Facets</h2>
3
+ #display_facet_query($field, "", "")
@@ -0,0 +1,30 @@
1
+ <!--
2
+ Licensed to the Apache Software Foundation (ASF) under one or more
3
+ contributor license agreements. See the NOTICE file distributed with
4
+ this work for additional information regarding copyright ownership.
5
+ The ASF licenses this file to You under the Apache License, Version 2.0
6
+ (the "License"); you may not use this file except in compliance with
7
+ the License. You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
16
+ -->
17
+
18
+ <h2 #annTitle("Facets generated by adding &facet.range= to the request")>Range Facets</h2>
19
+ #set($field = $response.response.facet_counts.facet_ranges.price.counts)
20
+ #set($start = $response.response.facet_counts.facet_ranges.price.start)
21
+ #set($end = $response.response.facet_counts.facet_ranges.price.end)
22
+ #set($gap = $response.response.facet_counts.facet_ranges.price.gap)
23
+ #set($before = $response.response.facet_counts.facet_ranges.price.before)
24
+ #set($after = $response.response.facet_counts.facet_ranges.price.after)
25
+ ##TODO: Make this display the "range", not just the lower value
26
+ ##TODO: Have a generic way to deal with ranges
27
+ #display_facet_range($field, "Price (in $)", "price", $start, $end, $gap, $before, $after)
28
+
29
+ #set($field = $response.response.facet_counts.facet_ranges.manufacturedate_dt)
30
+ #display_facet_range_date($field, "Manufacture Date", "manufacturedate_dt")